Hi Gene,

This works. Thanks for your suggestion.

Regards,
Vaibhav

On Tue, Nov 16, 2010 at 8:51 AM, Gene <gene.ress...@gmail.com> wrote:

> Your description is imprecise.  I guess you mean the answer is "B,"
> not "D" as you said.  The following may be based on an improper
> reading of your description.  For example I'm assuming that each
> letter maps to each int at most once.  And each set of ints maps to
> exactly one letter.
>
> Your method is on the right track, but you're missing the punch line.
>
> Read the input and use it to create a hash that maps letters to sets
> of integers.  As you read a pair n|X, add n to the set corresponding
> to the letter X.
>
> After you've read all the data, make a pass over the first hash to
> create a second hash that maps sets of integers to letters.
>
> Looking up sets in this will require O(k) where k is the length of the
> integer set being looked up, i.e. the cost of computing the hash
> function.
>
> Here is a little Perl program that does all this. Perl is not a great
> language choice because the only way to hash the integer sets is to
> convert to a string. Java and similar hash containers will let you do
> the hashing without a type conversion, which is more efficient.
>
> use strict;
>
> our $ltr_to_iset = {};
> our $iset_to_ltr = {};
>
> sub build_tables {
>    while (<>) {
>        my ($i, $ltr) = /(\d+)\|([a-z]+)/i;
>        push @{$ltr_to_iset->{$ltr}}, int($i);
>    }
>    while ( my ($ltr, $iset) = each(%$ltr_to_iset) ) {
>        $iset_to_ltr->{ join(",", sort { $a <=> $b } @$iset) } = $ltr;
>    }
> }
>
> sub lookup {
>    my $iset = shift;
>    return $iset_to_ltr->{ join(",", sort { $a <=> $b } @$iset) };
> }
>
> sub main {
>    build_tables;
>    print lookup([2,1,4,3,5]) . "\n";
>    print lookup([1,2,3,4,6]) . "\n";
> }
>
> main;
>
> genes-macbook-pro:Projects$ perl lu.pl < data.txt
> A
> B
>
>
> On Nov 15, 9:53 am, vaibhav agrawal <agrvaib...@gmail.com> wrote:
> > Hello All,
> >
> > I have a problem, which needs to be solved for lesser time complexity.
> Here
> > it goes:
> >
> > There is a file having two columns: id and key as under:
> > 1|A
> > 2|A
> > 3|A
> > 4|A
> > 5|A
> > 1|B
> > 2|B
> > 3|B
> > 4|B
> > 6|B
> > and so on...
> >
> > Now, we want to lookup a bunch of ids(constant 5) to get a key, that
> means
> > if we lookup on id as {2,1,4,3,6}, then we should get return key as 'D'
> and
> > so on...
> >
> > I am proposing a solution for this as under:
> > Construct two hashes:
> > First hash(based on above data):(Hash Key=>Hash Set)
> > 1=>{A,B}
> > 2=>{A,B}
> > 3=>{A,B}
> > 4=>{A,B}
> > 5=>{A}
> > 6=>{B}
> >
> > Second hash(based on above data):(Hash Key=>Hash Set)
> > A=>{1,2,3,4,5}
> > B=>{1,2,3,4,6}
> >
> > Now, for the given example ids as {2,1,4,3,6}, we will start looking up
> > first element '2' into first hash, and got the list {A,B}, so the desired
> > key could be either A or B.
> > Now, let's consider A first using second hash, we got a list of ids
> > {1,2,3,4,5}, now match these ids with the inputted bunch(2,1,4,3,6},
> which
> > is not matching. Now consider B, which got list of ids as (1,2,3,4,6},
> which
> > matches with the input and hence the answer is B.
> >
> > Is there any way in which it can be further optimized for speed?
> >
> > Thanks,
> > Vaibhav
>
> --
> You received this message because you are subscribed to the Google Groups
> "Algorithm Geeks" group.
> To post to this group, send email to algoge...@googlegroups.com.
> To unsubscribe from this group, send email to
> algogeeks+unsubscr...@googlegroups.com<algogeeks%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/algogeeks?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algoge...@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to