Thread Gibt es für Zeile x einer Matrix andere Zeilen die ein Subset dieser Zeile sind?
(11 answers)
Opened by leo11 at 2010-10-19 15:06
Hier mein Ansatz:
a) möglichst viel aus der inneren Schleife rausziehen b) die Pattern in Bitvektoren verwandeln und numerisch vergleichen Für bin2num() gibt es sicher schon eine fertige Funktion, ich weiss nur nicht wo. So ist der Code ist nicht unbedingt kürzer, sollte aber schneller sein. Wenn die Zeilen länger werden muss man use bigint setzen. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 use strict; use warnings; use Data::Dumper; sub bin2num($) { my $v = 0; foreach my $b (split(//,shift)) { $v <<= 1; $v += $b; } $v; } sub prepare_line($) { my $line = shift; chomp $line; my $l = $line; $l =~ s/^row(\d+)\s+//; $l =~ s/\s+//g; # Leerzeichen entfernen; my $mask = $l; $mask =~ tr/-01/011/; $mask = bin2num($mask); # Ziffer => bit gesetzt my $pattern = $l; $pattern =~ tr/-01/001/; $pattern = bin2num($pattern); # '1' => bit gesetzt return { line => $line, mask => $mask,pattern => $pattern}; } my @all = map {prepare_line($_)} (<DATA>); foreach my $target (@all) { print "\nTarget:\t\t",$target->{line},"\n"; foreach my $comp (@all) { next if $target->{line} eq $comp->{line}; # gleiche Zeile # numerischer Vergleich der in $comp gesetzten Ziffern, erst '0' dann '1' if (($comp->{mask} & $target->{mask} & ~$target->{pattern}) == ($comp->{mask} & ~$comp->{pattern}) and ($comp->{mask} & $target->{pattern}) == ($comp->{mask} & $comp->{pattern})) { print "Subset:\t\t",$comp->{line},"\n"; } } } |