Re: Gemeinsame Elemente von zehn arrays ermitteln
am 25.05.2005 13:19:51 von Dominik Seelow
Peter Honka wrote:
> Hallo,
>
> ich müßte die gemeinsamen Elemente von
> ca. zehn arrays ermitteln. Die Elemente
> liegen alle im gleichen Format vor (z.B. A123456).
>
> Was ist der einfachste und performanteste Weg dafür?
Hallo Peter,
ich würde das mit einem Hash machen, das die Schnittmenge speichert.
Du durchläufst jedes Array, speicherst die Übereinstimmungen mit der
bisherigen Schnittmenge in einem neuen Hash, und ersetzt nach jedem
Array die alte Schnittmenge durch die neue.
Als Ausgangsschnittmenge kannst Du einfach den Inhalt des ersten Arrays
nehmen, so daß Du mit Deiner Schleife beim 2. anfängst.
Viele Grüße,
Dominik
Re: Gemeinsame Elemente von zehn arrays ermitteln
am 26.05.2005 12:31:06 von Peter Honka
> ich würde das mit einem Hash machen, das die Schnittmenge speichert.
> Du durchläufst jedes Array, speicherst die Übereinstimmungen mit der
> bisherigen Schnittmenge in einem neuen Hash, und ersetzt nach jedem
> Array die alte Schnittmenge durch die neue.
> Als Ausgangsschnittmenge kannst Du einfach den Inhalt des ersten Arrays
> nehmen, so daß Du mit Deiner Schleife beim 2. anfängst.
> Dominik
Hallo Dominik,
danke für den Tipp. Bei zwei arrays habe ich das
schon mal gemacht. Dann wird die Schnittmenge eben
nur durchgereicht. Eventuell poste ich noch mal,
wenn es noch haken sollte.
Gruss
Peter
Re: Gemeinsame Elemente von zehn arrays ermitteln
am 26.05.2005 16:34:40 von Robert Sedlacek
Helmut Wollmersdorfer wrote:
> Du könntest in einem Hash mitzählen und nimmst am Ende nur jene
> Elemente, wo der Zähler der Anzahl der Arrays entspricht. Damit hättest
> Du automatisch auch die Vereinigungsmenge und das Vorkommen, falls Du das
> eventuell ebenso brauchst.
Das funktioniert aber nur, wenn Nichts doppelt ist. Sonst kannst du nicht
mehr nach der Zahl der Vorkommnisse gehen.
Man könnte eventuell die Werte des ersten Elements als Schlüssel für
einen Hash verwenden, bei dem man alle Zahlen auf 1 setzt. Bei allen
nachfolgenden Arrays erzeugt man wieder solch' einen Hash und schmeißt
aus dem Ersten (von mir aus: dem Basis-Hash) alle Elemente raus, die in
diesem nicht vorkommen.
Wenn mir die Hitze nicht schon ans Hirn gegangen ist, sollte das
funktionieren. Schlagt mich, wenn ich mich irre :D
--
http://www.dunkelheit.at/
The first rule of project mayhem is: you do not ask questions.
-- Fight Club
Re: Gemeinsame Elemente von zehn arrays ermitteln
am 26.05.2005 17:00:37 von Dominik Seelow
Robert Sedlacek wrote:
> Helmut Wollmersdorfer wrote:
Hallo!
>>Du könntest in einem Hash mitzählen und nimmst am Ende nur jene
>>Elemente, wo der Zähler der Anzahl der Arrays entspricht. Damit hättest
>>Du automatisch auch die Vereinigungsmenge und das Vorkommen, falls Du das
>>eventuell ebenso brauchst.
>
> Das funktioniert aber nur, wenn Nichts doppelt ist. Sonst kannst du nicht
> mehr nach der Zahl der Vorkommnisse gehen.
In der Tat. Dann wären mehrere Hashes nötig.
> Man könnte eventuell die Werte des ersten Elements als Schlüssel für
> einen Hash verwenden, bei dem man alle Zahlen auf 1 setzt. Bei allen
> nachfolgenden Arrays erzeugt man wieder solch' einen Hash und schmeißt
> aus dem Ersten (von mir aus: dem Basis-Hash) alle Elemente raus, die in
> diesem nicht vorkommen.
Ein delete ist gar nicht nötig:
use strict;
my $arrayref=[
[1,22,23,24,5,26,27,8,9],
[1,2,3,4,5,6,7,8,9],
[1,22,23,34,35,63,27,8,9],
[1,2,23,24,25,26,27,8,9],
[1,22,23,24,25,26,27,8,19],
[1,22,23,44,55,66,74,8,39]
];
my $schnittmenge={};
@{$schnittmenge}{@{$arrayref->[0]}}=();
for my $i (1..$#$arrayref){
my %tmp_schnittmenge=();
@tmp_schnittmenge{grep {exists $schnittmenge->{$_}}
@{$arrayref->[$i]}}=();
$schnittmenge=\%tmp_schnittmenge;
}
print join (",", keys %$schnittmenge),"\n";
Viele Grüße,
Dominik