Hauptinhalt
Kurs: Informatik > Lerneinheit 1
Lektion 8: MergesortAnalyse von Mergesort
Wenn die Funktion Zeit läuft, wenn sie Elemente zusammenführt, wie können wir dann zeigen, dass Zeit läuft? Wir fangen an, indem wir über die drei Teile von Teile-und-Herrsche nachdenken und wie wir ihre Laufzeiten berücksichtigen können. Wir nehmen an, dass wir insgesamt Elemente im gesamten Array sortieren.
merge
in mergeSort
in - Im Teile-Schritt wird der Mittelpunkt
der Indizes und berechnet. Die Laufzeit ist damit unabhängig von der Subarray-Größe und dauert immer eine konstante Zeit. Zur Erinnerung: In der Big-Θ Notation geben wir konstante Zeit als an. - Der Herrsche-Schritt, wo rekursiv zwei Subarrays von jeweils etwa
Elementen sortiert werden, dauert etwas, aber wir werden uns das gleich genauer anschauen, wenn wir die Unterprobleme betrachten. - Im Kombinations-Schritt werden insgesamt
Elemente kombiniert. Diese Dauer können wir mit angeben.
Betrachten wir die Teile- und Kombinations-Schritte gemeinsam: Die Laufzeit für den Teile-Schritt ist vernachlässigbar klein im Vergleich zur Laufzeit des Kombinations-Schritts . Also können wir die Größenordnung der gemeinsamen Laufzeit der beiden Schritte mit angeben. Um etwas konkreter zu werden sagen wir, dass der Teile- und Kombinations-Schritt zusammen Zeit in Anspruch nehmen, wobei eine Konstante ist.
Zur Vereinfachung gehen wir davon aus, dass wenn ist, dann ist immer gerade, also ist eine Ganzzahl. (Der Fall, in dem ungerade ist, ändert nicht das Ergebnis der Betrachtung in Bezug auf die Big-Θ Notation.) Damit ist die Laufzeit von -Elemente Subarray das Doppelte der Laufzeit von -Elemente Subarray (für den Eroberungsschritt) plus (für die Teile- und Kombinations-Schritte).
mergeSort
auf einem mergeSort
auf einem Jetzt müssen wir die Laufzeit der beiden rekursiven Anrufe auf Elemente bestimmen. Jeder dieser beiden rekursiven Anrufe dauert doppelt solange wie die Laufzeit von -Elemente Subarray (weil wir halbieren müssen) plus zum Zusammenführen. Wir haben zwei Teilprobleme der Größe , und jedes dauert Zeit zum Kombinieren, und so ist die benötigte Gesamtzeit zum Kombinieren der Teilprobleme der Größe gleich .
mergeSort
auf einem Wir können die Kombinations-Zeit als "Baum" darstellen"
Informatiker zeichnen Bäume gerne auf den Kopf, also verkehrt herum wie natürliche Bäume wachsen. Ein Baum ist ein Graph ohne Zyklen (Pfade, die am gleichen Knoten beginnen und enden). Die Konvention ist, die Astgabeln in einem Baum als seine Knoten zu bezeichnen. Die Wurzel ist der Knoten ganz oben. Hier ist die Wurzel mit gekennzeichnet, also der Größe des Subarrays für das ursprüngliche -Elemente Array. Unterhalb der Wurzel sind zwei Kinder-Knoten, die jeweils mit markiert sind, um die Größen des Subarrays für die beiden Teilprobleme der Größe darzustellen.
Jedes der Teilprobleme der Größe sortiert rekursiv zwei Subarrays der Größe oder . Weil es zwei Teilprobleme der Größe gibt, gibt es vier Teilprobleme der Größe . Jedes dieser vier Teilprobleme kombiniert insgesamt Elemente, und so ist die Kombinations-Zeit für jedes der vier Teilprobleme . Zusammengefasst über die vier Teilprobleme sehen wir, dass die gesamte Kombinations-Zeit für alle Teilprobleme der Größe gleich ist:
Wie geht das wohl für die Teilprobleme der Größe weiter? Es wird acht von ihnen geben. Die Kombinations-Zeit für jedes Teilproblem wird sein, für eine Gesamt-Kombinations-Zeit von :
Im selben Maß in dem die Teilprobleme kleiner werden, verdoppelt sich die Anzahl der Teilprobleme auf jeder "Ebene" der Rekursion, wobei sich die Kombinations-Zeit halbiert. Die Verdopplung und Halbierung heben sich gegenseitig auf, und so ist die gesamte Verschmelzungszeit auf jeder Rekursionsebene . Irgendwann erreichen wir Unterprobleme der Größe 1: Dem Basisfall. Wir müssen dann Zeit verwenden, um Subarrays der Größe 1 zu sortieren, denn wir müssen testen, ob ist, und dieser Test benötigt konstante Zeit. Wie viele Subarrays der Größe 1 gibt es? Da wir mit Elementen begonnen haben, muss es von ihnen geben. Da jeder Basisfall Zeit dauert, nehmen die Basisfälle insgesamt Zeit in Anspruch:
Jetzt wissen wir, wie lange das Zusammenführen für jede Teilproblemgröße dauert. Die Gesamtzeit für Ebenen in dem Baum gibt, dann ist die Gesamtzeit für das Zusammenführen . Was ist also ? Wir beginnen mit Teilproblemen der Größe und halbieren immer wieder, bis wir zu Teilproblemen der Größe kommen. Wir haben diese Eigenschaft gesehen, als wir die binäre Suche analysiert haben, und die Antwort ist . Wenn zum Beispiel , dann ist , und sicher, der Baum hat vier Ebenen: . Die Gesamtzeit für . Wenn wir die big-Θ Notation verwenden, um diese Laufzeit zu beschreiben, können wir den Term niedriger Ordnung ( ) und den konstanten Koeffizienten ( ) verwerfen, was uns eine Laufzeit von gibt, wie versprochen.
mergeSort
ist die Summe der Zeit zum Zusammenführen aller Ebenen. Wenn es mergeSort
ist also Noch eine Sache über Merge Art ist bemerkenswert. Beim Kombinieren wird eine Kopie des gesamten zu sortierenden Arrays erzeugt, mit einem Teil der Daten in
lowHalf
und dem anderen Teil in highHalf
. Mergesort benötigt also zusätzlichen Speicher für eine Kopie des gesamten Arrays wo die eigentliche Kombinations-Arbeit geschieht. Daher sagen wir, dass Mergesort nicht in-place funktioniert. Im Gegensatz dazu arbeiten sowohl Selectionsort als auch Insertionsort in-place, da sie niemals eine Kopie von mehr als einer konstanten Anzahl von Arrayelementen zu irgendeinem Zeitpunkt machen. Der zusätzliche Speicherbedarf ist also von der Größe des Arrays unabhängig. Informatiker wissen gern, wie ein Algorithmus arbeitet, denn es gibt einige Systeme (z.B. Embedded-Systeme), in denen Speicherplatz besonders knapp ist, und somit werden dort gerne in-place Algorithmen verwendet.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.