Betrachtet man diesen Pseudocode eines Bubblesorts:
FOR i := 0 TO arraylength(list) STEP 1
switched := false
FOR j := 0 TO arraylength(list)-(i+1) STEP 1
IF list[j] > list[j + 1] THEN
switch(list,j,j+1)
switched := true
ENDIF
NEXT
IF switched = false THEN
break
ENDIF
NEXT
Was wären die Grundideen, die ich berücksichtigen müsste, um die durchschnittliche Zeitkomplexität zu bewerten? Ich habe es bereits geschafft, die schlechtesten und besten Fälle zu berechnen, aber ich bin nicht sicher, wie ich die durchschnittliche Komplexität der inneren Schleife bewerten soll, um die Gleichung zu bilden.
Die Worst-Case-Gleichung lautet:
wobei das innere Sigma die innere Schleife darstellt und das äußere Sigma die äußere Schleife darstellt. Ich denke, dass ich beide Sigmas aufgrund der "if-then-break" -Klausel ändern muss, die das äußere Sigma beeinflussen könnte, aber auch aufgrund der if-Klausel in der inneren Schleife, die die während einer Schleife ausgeführten Aktionen beeinflusst (4 Aktionen + 1 Vergleich, wenn wahr, sonst nur 1 Vergleich).
Zur Verdeutlichung des Begriffs Durchschnittszeit: Dieser Sortieralgorithmus benötigt unterschiedliche Zeit für verschiedene Listen (gleicher Länge), da der Algorithmus möglicherweise mehr oder weniger Schritte durch / innerhalb der Schleifen benötigt, bis die Liste vollständig in Ordnung ist. Ich versuche einen mathematischen (nicht statistischen) Weg zu finden, um den Durchschnitt der benötigten Runden zu bewerten.
Dafür erwarte ich, dass jede Bestellung die gleiche Möglichkeit hat.
Antworten:
Bei Listen mit der Länge bedeutet Durchschnitt normalerweise, dass Sie mit einer gleichmäßigen Verteilung auf alle n beginnen müssen ! Permutationen von [ 1 , .., n ]: Das sind alle Listen, die Sie berücksichtigen müssen.n n ! 1 n
Ihre durchschnittliche Komplexität wäre dann die Summe der Schrittanzahl für alle Listen geteilt durch .n!
Für eine gegebene Liste ist die Anzahl der Schritte Ihres Algorithmus n d, wobei d der größte Abstand zwischen einem Element x i und seiner rechtmäßigen Position i ist (aber nur, wenn es sich nach links bewegen muss) ist max i ( max ( 1 , i - x i ) ) .(xi)i nd d xi i maxi(max(1,i−xi))
Dann rechnen Sie nach: Finden Sie für jedes die Anzahl c d von Listen mit dieser bestimmten maximalen Entfernung, dann ist der erwartete Wert von d :d cd d
Und das sind die Grundgedanken ohne den schwierigsten Teil, der darin besteht, . Vielleicht gibt es aber eine einfachere Lösung.cd
EDIT: "erwartet" hinzugefügt
quelle
Denken Sie daran, dass ein Paar (bzw. ( i , j ) ) invertiert ist, wenn i < j und A [ i ] > A [ j ] .(A[i],A[j]) (i,j) i<j A[i]>A[j]
Angenommen, Ihr Algorithmus führt für jede Inversion einen Swap durch, hängt die Laufzeit Ihres Algorithmus von der Anzahl der Inversionen ab.
Die Berechnung der erwarteten Anzahl von Inversionen in einer einheitlichen zufälligen Permutation ist einfach:
Lassen eine Permutation, und sei R ( P ) umgekehrt sein P . Wenn zum Beispiel P = 2 , 1 , 3 , 4 ist, dann ist R ( P ) = 4 , 3 , 1 , 2 .P R(P) P P=2,1,3,4 R(P)=4,3,1,2
Für jedes Indexpaar gibt es eine Inversion in genau einem von P oder R ( P ) .(i,j) P R(P)
Da die Gesamtzahl der Paare beträgt und die Gesamtzahl und jedes Paar in genau der Hälfte der Permutationen invertiert ist, unter der Annahme, dass alle Permutationen gleich wahrscheinlich sind, beträgt die erwartete Anzahl der Inversionen:n(n−1)/2
quelle
Anzahl der Swaps <Anzahl der Iterationen (sowohl im optimierten als auch im einfachen Bubble-Case-Szenario)
Anzahl der Inversionen = Anzahl der Swaps.
(Zeitkomplexität = Anzahl der Iterationen Anzahl der Iterationen> Anzahl der Swaps)
quelle
In diesem Dokument erreichte die durchschnittliche zeitliche Komplexität der Blasensortierung O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf
quelle