Schrift
[thread]6208[/thread]

2 Arrays vergleichen (Seite 2)



<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten
ptk
 2004-04-22 17:25
#81778 #81778
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hast du dazu Referenzen? Hier behauptet der erste Poster, der Aufwand waere sogar O(n), und der Antwortende behauptet, es waere O(1).
Ishka
 2004-04-22 17:55
#81779 #81779
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wen genau meinst du mit erster Poster und Antwortende?

Ich sehe niemanden, der behauptet hätte, die Laufzeit wäre in O(1). (Naja, außer - alle Probleme sind von O(1), denn es gibt bestimmt ein n, was so groß ist, daß all unsere Probleme kleiner sind ;) )
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}
Ishka
 2004-04-22 18:26
#81780 #81780
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Oh, man - wir sollten mal das Design unserer Links ändern. Hab nicht gemerkt, daß das 'hier' ein Link war.

Im _ungünstigsten_ Fall hat man O(n) - schon klar. Die wahrscheinlichkeit dafür, daß ein Hash maximal ungünstig ist, wäre schonmal verdammt klein (ca. 1/n^n, glaub ich), abgesehen davon nimmt Perl eine Umordnung vor, wenn ein Hash beginnt ungünstig angeordnet zu werden. Und O(1) hat man nur im Falle der günstigsten Anordnung, allerdings ist der Aufwand für eine Optimale Anordnung enorm. Und bei einer halbwegs vernünftigen Anordnung kommst du eben im Schnitt auf O(log n) (Man halte sich immer bewusst, daß Hashes eine sehr heuristische Angelegenheit sind). Und mit Optimierungen bekommst du höchstens deine Konstannte runter, nicht dein Laufzeitverhalten besser.

Und als Beweis der Tatsache diene dir ein ausgiebiger Benchmark.\n\n

<!--EDIT|Ishka|1082647584-->
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}
ptk
 2004-04-22 19:19
#81781 #81781
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du meinst hier O(log n), nicht O(n log n), oder?
Ishka
 2004-04-22 19:26
#81782 #81782
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
in der Tat, danke - ich bessers gleich aus
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}
ptk
 2004-04-22 19:49
#81783 #81783
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hmm, Abigail denkt auch, dass es linear ist: http://www.perlmonks.org/index.pl?node_id=347383
[E|B]
 2004-04-22 20:20
#81784 #81784
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Darf ich mal fragen, was linear ist und was Ishka da meint?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Strat
 2004-04-23 02:11
#81785 #81785
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
also ob so ein algorithmus linear oder quadratisch ist, darueber mache ich mir erst dann gedanken, wenn die moeglichkeit besteht, dass da sehr viele daten kommen; bei 1-1000 daten lohnt es sich in der regel nicht...

anmerkung zur Laufzeit: bubblesort muesste z.B. fuer kleine datenmengen i.d.R. schneller sein als quicksort, weil er weniger overhead hat...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2004-04-23 02:36
#81786 #81786
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Die Landau-symbole (O, o, Theta, ...) unterliegen folgender Motivation:

- Suchen kompakte Notation zur Aufwandsabschatzung von Algorithmen.
- Algorithmus soll von Problemgrößen abhängen (z.B.: n = Zahl der zu sortierenden Objekte in einer Liste)

Code: (dl )
1
2
3
4
foreach my $i (@array)
{
  $sum += $i;
}


Läuft in genau n Schritten ab; wobei n = scalar @array ist; und überschreitet nie die Zahl n; also O(n)

Okay... wenn also was in O(n) läuft, läuft es linear;
O(1) heißt konstant; O(log n) heißt dann logarithmisch und O(n^2) heißt quadratisch

Code: (dl )
1
2
3
4
5
6
7
8
foreach my $j (@brray)
{
  foreach my $i (@array)
  {
     $sum += $i;
     $sum *= $j;
 }
}


Sei n = scalar @array und m = scalar @brray, dann ist die Laufzeit O(m * n), weil du m mal das @array durchläufst
wenn m == n gilt, dann ist die Laufzeit O(n^2) und wenn
m = n^2 ist, dann wäre die Laufzeit O(n^3)...

Da Plus, Minus, Mal, Geteilt Funktionen sind, die so schnell ausgeführt werden können, dass man deren Laufzeitverhalten unter den Tisch fallen lässt (Sind Funktionen, die in Konstanter Zeit ausgeführt werden können, also O(1) und n*1 = n), wäre man jetzt eigentlich fertig.


Aber wie sieht es hiermit aus?

Code: (dl )
1
2
3
4
foreach my $i (@array)
{
  calc($i);
}


Eigentlich hat dies auch die Laufzeit O(n), aber nur unabhängig von der Funktion calc...

calc könnte so aussehen
Code: (dl )
1
2
3
4
5
6
sub calc
{
  my ($var) = @_;
  my $text = $var x 10000;
  print md5($text);
}


Okay, print vernachlässigen wir wieder, obwohl eine Ausgabe schon zeit kosten kann, aber md5 ist nicht gerade flink.

Also, kann man hier nicht mehr von O(n) sprechen, da man die Laufzeit von md5 auf einen String der länge length($var) * 10000 berücksichtigen muss. Verstanden?

Um nochmal zum Hash zurück zukommen.
Für den Benutzer wirkt die Laufzeit von $hash{$key} Konstant; also O(1)...

In Perl selber muss aber noch eine Operation ausgeführt werden, damit der Wert, der dem Schlüssel zugeordnet ist, gefunden werden kann.
Crian
 2004-04-23 20:00
#81787 #81787
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
O(Ausdruck(n)) bedeutet, es gibt eine Konstante k, so dass die Laufzeit des Algorithmus für alle n unter k * Ausdruck(n) bleibt.

Das k darf aber auch 42 Trilliarden komma fünf sein.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten



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