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

clms
 2010-10-19 19:55
#142057 #142057
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
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";
    }
  }
}

View full thread Gibt es für Zeile x einer Matrix andere Zeilen die ein Subset dieser Zeile sind?