Gemeinsame Elemente von zehn arrays ermitteln

Gemeinsame Elemente von zehn arrays ermitteln

am 25.05.2005 12:52:32 von Peter Honka

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?

Danke und Gruss
Peter Honka

Re: Gemeinsame Elemente von zehn arrays ermitteln

am 25.05.2005 13:17:26 von Frank Seitz

Peter Honka wrote:

> 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?

Mach doch mal einen eigenen Vorschlag.
Dann läßt der eine oder andere Verbesserungsvorschlag
sicher nicht lange auf sich warten.

Gruß
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

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:28:49 von Helmut Wollmersdorfer

Peter Honka wrote:

> 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?

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.

Helmut Wollmersdorfer

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

Re: Gemeinsame Elemente von zehn arrays ermitteln

am 26.05.2005 17:07:27 von Robert Sedlacek

Dominik Seelow wrote:

> Ein delete ist gar nicht nötig:

Gut, ich hab's mal spontan so gelöst:

#!/usr/bin/perl
use warnings;
use strict;

#--- common ary elements
sub cae {
my (@arys) = @_;

#--- remember elems of first ary
my %basehash;
$basehash{ $_ } = 1 for @{ $arys[0] };

#--- go through rest and kill non-existing from base
for my $a (1 .. $#arys) {
my %curvalues;
$curvalues{ $_ } = 1 for @{ $arys[ $a ] };

for my $val (keys %basehash) {
delete $basehash{ $val }
unless exists $curvalues{ $val };
}

}

return keys %basehash;
}

__END__

Is' halt Geschmackssache. :)

--
http://www.dunkelheit.at/
codito, ergo sum.