On Wed, Feb 11, 2009 at 11:22 PM, John W. Krahn <jwkrahn@shaw.ca> wrote: > kevin liu wrote: > >> Hi everybody: >> > > Hello, > > > I have two arrays(@nwarray0 and @nwarray1) in my program and i want >> to make sure that >> all the elements in @nwarray0 could be found in @nwarray1. >> Here is my implementation: >> ------------------------------------------------------- >> foreach my $srctemp ( @nwarray0 ) { >> >> foreach my $tgttemp ( @nwarray1 ) { >> if ( $tgttemp eq $srctemp ) { >> $found = 1; >> last; >> } >> } >> if ( $found == 1 ) { >> $found = 0; >> next; >> } >> else { >> return 1; >> } >> } >> -------------------------------------------------------- >> But this algorithm takes a long time to compare, could you please >> help to improve this piece of >> code to less the time needed? >> > > The best you can do with two arrays is exit as soon as an element of > @nwarray0 is not found in @nwarray1: > > my $found = 1; > SEARCH: > foreach my $srctemp ( @nwarray0 ) { > foreach my $tgttemp ( @nwarray1 ) { > if ( $tgttemp ne $srctemp ) { > $found = 0; > last SEARCH; > } > } > } > > But this will still take O( n * m ) if all the elements of @nwarray0 are in > @nwarray1. > > If the elements of @nwarray1 are sorted then you could a binary search on > it and reduce your worst case to O( n * log m ). But how could this be, I have got the best algorithm from Rob, but I don't know why a binary search would be O( n * logm ) Could you please help to explain? Thank you in advance. > > > If the elements of @nwarray1 were in a hash then you could reduce your > worst case to O( n ). >Thread Previous | Thread Next