in reply to Comparing between multiple sets of data
This is probably close to being on the order of N^2 (N being the total number of elements in the entire 2d structure), but will be closer to N as the number of possible duplicates drop.my %hash; foreach my $i ( 0..$#array ) { foreach my $j ( @{ $array[ $i ] } ) { $hash{ $j } ||= []; #need to set this if not made if ( ! grep { $i == $_ } @{ $hash{ $j } } ) { push @{ $hash{ $j } }, $i; } } } my @matches = grep { @{ $hash{ $_ } } > 1 } keys %hash;
Note that if you wish to exclude elements, you can simply add an "if (something) next" line in the deepest block, or do an additional grep on the @{ $array } in the second foreach block to remove elements you don't care about. But it's probably faster to look at everything, then drop what you don't need then checking every time.
|
|---|