Font
[thread]6208[/thread]

2 Arrays vergleichen



<< |< 1 2 3 >| >> 28 entries, 3 pages
alexus-777
 2004-04-22 11:47
#81768 #81768
User since
2004-04-13
121 articles
BenutzerIn
[default_avatar]
Hallo,

ich hab 2 Arrays @A und @B. Wie ermittelt man welche Elemente in beiden vorkommen?

Gruß Alexander
ptk
 2004-04-22 12:45
#81769 #81769
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
Ungetestet:
Code: (dl )
1
2
%a = map {($_=>1)} @a;
@duplicates = grep { exists $a{$_} } @b;
renee
 2004-04-22 12:47
#81770 #81770
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my %hash = ();
my @elemente_beider_arrays = ();
foreach(@A){
$hash{$_}++;
}
foreach(@B){
push(@elemente_beider_arrays,$_) if($hash{$_});
}

print "Diese Elemente sind in beiden Arrays:\n";
print $_,"\n" for(@elemente_beider_arrays);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
alexus-777
 2004-04-22 13:03
#81771 #81771
User since
2004-04-13
121 articles
BenutzerIn
[default_avatar]
Danke für Hilfe!

Hab aber inzwischen auf ne Lösung gestoßen:
Code: (dl )
1
2
3
4
5
6
7
foreach $zeile (@A) {
  foreach $zeile2 (@B) {
    if($zeile2 eq $zeile) {
     push (@ergebnis, $zeile2);
    }
   }
 }

ist das ok? Oder sind die andere Vorschläge schneller/besser als diese?

Gruß Alexander\n\n

<!--EDIT|alexus-777|1082624687-->
ptk
 2004-04-22 13:07
#81772 #81772
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
Du hast bei deiner Loesung eine quadratische Laufzeit. Renees und meine Loesungen haben nur eine lineare Laufzeit, sind also schneller.
Ishka
 2004-04-22 16:40
#81773 #81773
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
[quote=ptk,22.04.2004, 11:07]Du hast bei deiner Loesung eine quadratische Laufzeit. Renees und meine Loesungen haben nur eine lineare Laufzeit, sind also schneller.[/quote]
nö, nicht linear, sondern n log n. Trotzdem deutlich schneller.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
renee
 2004-04-22 16:43
#81774 #81774
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
@Ishka: Du bist echt voll der Laufzeitenfreak ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2004-04-22 17:00
#81775 #81775
User since
2003-08-21
2613 articles
ModeratorIn

user image
die Hashzugriffe haben doch aber auch nicht die Laufzeit Null
ptk
 2004-04-22 17:09
#81776 #81776
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
Noe, es ist linear. Einfache, nicht verschachtelte for-Schleifen sind linear.
Ishka
 2004-04-22 17:12
#81777 #81777
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
wie betterworld schon sagte, kann man die Laufzeit von Hashzugriffen nicht vernachlässigen. Sie ist nicht null, auch nicht 1, sondern log n. und log n in der Schleife mit n Schritten => n log n
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
<< |< 1 2 3 >| >> 28 entries, 3 pages



View all threads created 2004-04-22 11:47.