Hauptinhalt
Kurs: Informatik > Lerneinheit 1
Lektion 4: Auswahl sortierenAnalyse von Selectionsort
Selectionsort arbeitet über die Indizes im Array; Für jeden Index ruft Selectionsort ist, dann gibt es Indizes im Array.
indexOfMinimum
und swap
auf. Wenn die Länge des Arrays Da jede Ausführung des Körpers der Schleife zwei Zeilen Code benötigt, könnte man denken, dass Zeilen Code durch Selectionsort ausgeführt werden. Aber es ist nicht richtig, denn
indexOfMinimum
und swap
sind Funktionen: Jede von ihnen enthält weitere Codezeilen.Wie viele Zeilen Code werden bei einem einzigen Aufruf von
swap
ausgeführt? In einer normalen Implementation sind es drei Zeilen Code. Daher ist die Laufzeit jedes Aufrufs von swap
konstant.Wie viele Zeilen Code werden bei einem einzigen Aufruf von mal. Wenn das Subarray von der Größe 6 ist, dann läuft der Schleifen-Körper 6 mal.
indexOfMinimum
ausgeführt? Wir müssen dazu die Schleife in indexOfMinimum
betrachten. Wie oft wird diese Schleife während eines Aufruf von indexOfMinimum
durchlaufen? Das hängt von der Größe des Subarrays ab. Wenn das Subarray das ganze Array ist (wie es im ersten Schritt der Fall ist), läuft der Schleifen-Körper Nehmen wir an, das Array ist von der Größe 8. Wir analysieren im folgenden wie Selectionsort funktioniert.
- Beim ersten Aufruf von
indexOfMinimum
muss jeder Wert im Array betrachtet werden, so dass der Schleifen-Körper inindexOfMinimum
8 mal läuft. - Im zweiten Aufruf von
indexOfMinimum
muss er jeden Wert im Subarray mit den Indizes 1 bis 7 betrachten, und so läuft der Schleifen-Körper inindexOfMinimum
7 mal. - Im dritten Aufruf betrachtet er das Subarray mit den Indizes 2 bis 7; Der Schleifen-Körper läuft 6 mal.
- Im vierten Aufruf werden die Indizes 3 bis 7 betrachtet; Der Schleifen-Körper läuft 5 mal.
- …
- Im achten und letzten Aufruf von
indexOfMinimum
läuft der Schleifen-Körper nur 1 mal.
Wenn wir die Wiederholungen des Schleifen-Körper von
indexOfMinimum
addieren, erhalten wir 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 36 Wiederholungen.Hinweis: Berechnung der Summe der Zahlen von 1 bis
Wie berechnen wir schnell die Summe 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1? Hier ist ein Trick. Zuerst addieren wir die größte und die kleinste Zahl, also 8 + 1 = 9. Dann addieren wir die zweitgrößte und die zweitkleinste Zahl: 7 + 2 = 9. Auch 6 + 3 resultiert in 9 und ebenso 5 + 4 = 9. Damit erhalten wir:
Es gab vier Zahlenpaare deren Addition jeweils 9 ergab. Hier ist die allgemeine Vorgehensweise, um jede Folge von aufeinanderfolgenden Ganzzahlen zu addieren:
- Addiere die kleinste und die größte Zahl.
- Multipliziere das Ergebnis mit der Anzahl der Paare.
Was passiert, wenn die Anzahl der ganzen Zahlen in der Sequenz ungerade ist, so dass eine Zahl nicht gepaart werden kann? Betrachte einfach die ungepaarte Zahl in der Mitte der Sequenz als ein halbes Paar. Als Beispiel wollen wir 1 + 2 + 3 + 4 + 5 bestimmen. Wir haben zwei volle Paare (1 + 5 und 2 + 4, deren Summe jeweils 6 ist) und ein "halbes Paar" (3, das ist die Hälfte von 6), was insgesamt 2,5 Paare ergibt. Wir multiplizieren , und erhalten die richtige Antwort.
Allgemein ausgedrückt für eine Sequenz von 1 bis (auch Artihmetische Reihe genannt): Die Summe der kleinsten und größten Zahlen ist . Weil es Zahlen gibt, gibt es Paare (unabhängig davon ob gerade oder ungerade ist). Daher ist die Summe der Zahlen von 1 bis gleich , was . Probiere diese Formel doch mal für und aus.
Asymptotische Laufzeitanalyse von Selectionsort
Die Gesamtlaufzeit von Selectionsort besteht aus drei Teilen:
- Die Laufzeit für alle Anrufe von
indexOfMinimum
. - Die Laufzeit aller Anrufe von
swap
. - Die Laufzeit des Rests der Schleife in der
selectionSort
-Funktion.
Teile 2 und 3 sind einfach. Wir wissen, dass es Anrufe von .Der Rest der Schleife in Iterationen, und damit erhalten wir ein weiteres .
swap
gibt, und jeder Anruf nimmt konstante Zeit in Anspruch. Gemäß unserer Asymptotischen Notation ist die Zeit für alle Anrufe zu swap
gleich selectionSort
testet und inkrementiert lediglich die Schleifenvariable und ruft indexOfMinimum
und swap
auf und das dauert eine konstante Zeit für jede der Teil 1: Die Laufzeit der Anrufe von im ersten Aufruf, dann , dann und so weiter. Wir haben gesehen, dass diese Summe eine arithmetische Reihe ist und sie gleich ist. Daher ist die Gesamtzeit aller Anrufe von . In Bezug auf die Big-Θ-Notation kümmern wir uns nicht um diesen konstanten Faktor, noch kümmern wir uns um den Faktor 1/2 oder den niederwertigen Term n. Im Ergebnis ist die Laufzeit für alle Anrufe von .
indexOfMinimum
haben wir bereits bestimmt. Jede einzelne Iteration der Schleife in indexOfMinimum
dauert eine konstante Zeit. Die Anzahl der Iterationen dieser Schleife ist indexOfMinimum
ein konstantes Vielfaches von indexOfMinimum
gleich Addieren wir nun die Laufzeiten der drei Teile, haben wir für die Aufrufe von für die Anrufe von für den Rest der Schleife in -Term ist der bedeutendste, und so können wir aussagen, dass die Laufzeit von Selectionsort ist.
indexOfMinimum
, swap
und selectionSort
. Der Beachte auch, dass kein Fall besonders gut oder besonders schlecht für die Selectionsort ist. Die Schleife in Iterationen durchführen, unabhängig von der Eingabe. Daher können wir sagen, dass Selectionsort in allen Fällen Zeit benötigt.
indexOfMinimum
wird immer Mal sehen, wie die Laufzeit die tatsächliche Ausführungszeit beeinflusst. Angenommen, dass Selectionsort auf einem Computer ungefähr Sekunden benötigt, um Werte zu sortieren. Wir beginnen mit einem kleinen Wert von , z.B. mit . Dann ist die Laufzeit der Selectionsort ca. Sekunden. Das scheint ziemlich schnell zu sein. Aber was ist, wenn ist? Dann dauert Selectionsort Sekunde. Das Array wuchs um den Faktor 10, aber die Laufzeit wurde um das 100fache erhöht. Was ist, wenn ist? Dann dauert Selectionsort Sekunden, was ein wenig mehr als 11,5 Tage ist. Die Erhöhung der Arraygröße um den Faktor 1000 erhöht die Laufzeit eine Million Mal!
Dieses Tutorial ist in Zusammenarbeit zwischen den Professoren Thomas Cormen und Devin Bock von Dartmouth Computer Sience und dem Khan Academy Computing Curiculum-Team entstanden und wurde von der KA Deutsch Community übersetzt. Das Tutorial ist unter der Lizenz CC-BY-NC-SA lizenziert.
Willst du an der Diskussion teilnehmen?
Noch keine Beiträge.