Zum Inhalt springen
L

Das Video kommt von YouTube: erst beim Abspielen verbindet sich die Seite mit YouTube (Google).

Mergesort Algorithmus [mit Animation, Deutsch]

HappyCoders9:36 20.214 Aufrufe veröffentlicht Auf YouTube

Das Wichtigste aus dem Video

Tipp auf eine Zeit – das Video springt genau dorthin.

Transkriptautomatisch erstellt · 60 Zeilen
Herunterladen
  1. In diesem Video zeige ich euch, wie Mergesort funktioniert, wie man die Zeit- und Platzkomplexität von Mergesort bestimmt,
  2. und wie „Natural Mergesort“ den Algorithmus für teilweise vorsortierte Listen optimiert. Merge Sort funktioniert nach dem „Divide and Conquer“-Prinzip. Das heißt: Wir teilen die
  3. zu sortierende Liste von Elementen in immer kleinere Teil-Listen auf … und führen sie dann so wieder zusammen, dass jeweils eine sortierte Teilliste bzw. das sortierte Endergebnis entsteht.
  4. Wie das genau funktioniert, zeige ich euch an einem Beispiel. Wir wollen diese 8 Zahlen mit Mergesort sortieren.
  5. Wir teilen die Liste in der Mitte auf. Die zwei Teillisten teilen wir erneut jeweils in der Mitte auf.
  6. Und noch einmal. Jetzt haben wir nur noch Teillisten mit einem Element. Diese gelten als sortiert.
  7. Jetzt mergen wir jeweils zwei Teillisten zu einer. Wir beginnen mit der 3 und der 6.
  8. Wir nehmen jeweils das kleinste Element vom Anfang der zwei Teillisten, also zuerst die 3, dann die 6.
  9. Bei der 7 und der 1 nehmen wir zuerst die 1, dann die 7; hier ändert sich also die Reihenfolge der Elemente.
  10. Bei der 2 und der 5 bleibt sie wieder unverändert. Und bei der 8 und der 4 ändert sich die Reihenfolge wieder.
  11. Weiter geht es mit der 3–6 und der 1–7. Wir nehmen wieder jeweils das kleinste Element vom Anfang der zwei Teillisten, also zuerst die 1,
  12. da diese kleiner ist als die 3. Dann die 3, da diese kleiner ist als 7. Dann die 6, da auch diese kleiner ist als die 7. Und zuletzt die 7, da die andere Teilliste leer ist.
  13. Auf die gleiche Art mergen wir die 2–5 und die 4–8: Zuerst die 2, da diese kleiner ist als 4. Dann die 4, da diese kleiner ist als 5. Dann die 5,
  14. da diese kleiner ist als 8. Und schließlich die 8. Und zuletzt mergen wir diese zwei Teillisten zum Endergebnis.
  15. Das funktioniert nicht nur mit Zweierpotenzen, also mit zwei, vier, acht, 16 usw. Elementen. Aber damit lässt es sich besonders gut grafisch darstellen.
  16. Hier noch mal ein Beispiel mit elf Elementen. Eine ungerade Anzahl von Elementen teilen wir links oder rechts von der
  17. Mitte. Im Beispiel teile ich links von der Mitte. Noch einmal … und noch einmal.
  18. Jetzt haben wir acht Teillisten – fünf davon mit nur einem Element und drei mit zwei Elementen. Die mit zwei Elementen teilen wir noch einmal … und fügen sie als erstes wieder zusammen.
  19. Die anderen fünf Teillisten lassen wir dabei unverändert. Und so haben wir wieder acht Teillisten,
  20. die wir zu vier Teillisten mergen … dann zu 2 Teillisten … und schließlich zu einer Liste. Kommen wir zur Zeitkomplexität von Mergesort.
  21. Schauen wir uns zuerst die Teilungsphase an. Die Anzahl der zu sortierenden Elemente bezeichnen wir mit n.
  22. Bei n = 4 haben wir drei Teilungen. Bei n = 8 haben wir sieben Teilungen. Und bei n = 16 haben wir 15 Teilungen.
  23. Die Anzahl der Teilungen ist also n-1. Pro Teilung müssen wir die Mitte einer Liste bestimmen,
  24. der Aufwand dafür ist konstant. Konstanten sind für die O-Notation aber irrelevant, also auch die -1. Und wir erhalten als Zeitkomplexität für die Teilungsphase: O(n).
  25. Kommen wir zur Merge-Phase. Bei vier Elementen haben wir zwei Merge-Stufen,
  26. auf denen wir jeweils insgesamt vier Elemente mergen, nämlich vier mal eines und zwei mal zwei. Bei acht Elementen haben wir drei Merge-Stufen, auf denen wir jeweils acht Elemente mergen:
  27. acht mal eines, vier mal zwei und zwei mal vier. Und bei 16 Elementen haben wir vier Merge-Stufen, auf denen wir jeweils
  28. insgesamt 16 Elemente mergen: 16 mal eines, acht mal zwei, vier mal vier und zwei mal 8. Bei einer Verdopplung der Elemente erhöht sich die Anzahl der Merge-Stufen um eins. Die
  29. Anzahl der Merge-Stufen kann also berechnet werden als Logarithmus zur Basis 2 von n. Für die O-Notation können wir die Basis weglassen, und wir erhalten: O(log n).
  30. Da die jeweils zwei zu mergenden Listen in sich bereits sortiert sind, müssen beide genau einmal durchlaufen werden. Entsprechend ist der Aufwand
  31. proportional zur Anzahl der gemergten Elemente. Die Anzahl der Elemente pro Merge-Stufe ist n; entsprechend ist der Aufwand pro Merge-Stufe O(n).
  32. Den Gesamtaufwand für die Merge-Phase berechnen wir, indem wir den Aufwand pro Merge-Stufe mit der Anzahl der Merge-Stufe multiplizieren. Das können wir zusammenfassen zu: O(n × log n).
  33. Fügen wir nun Teilung- und Merge-Phasen zusammen, ergibt sich: O(n) + O(n × log n). Die kleinere Komplexitätsklasse O von n können wir weglassen;
  34. und als Gesamt-Zeitkomplexität bleibt: O(n × log n). Die Zeitkomplexität von Merge Sort lautet also: O(n × log n).
  35. Und das ist unabhängig davon, ob und wie die Zahlen vorsortiert sind. Wir haben also bei Mergesort keine Unterscheidung in Best, Worst und Average Case.
  36. Die Komplexitätsklasse O(n log n) bezeichnen wir als „quasilinear“, da der logarithmische Anteil bei großen n kaum noch ins Gewicht fällt und die
  37. Kurve fast nicht mehr von einer Linearen zu unterscheiden ist. Ein Beispiel:
  38. Auf meinem Laptop benötigt Mergesort für 100.000 zufällig angeordnete Zahlen etwa elf Millisekunden. Für eine Million Elemente 124 Millisekunden. Bei zehn
  39. Millionen Elementen 1,4 Sekunden. Und bei 100 Millionen Elementen 15 Sekunden. Das quasi-lineare Wachstum ist hier sehr gut zu erkennen.
  40. Bei Mergesort müssen wir nicht nur die Zeitkomplexität beachten, sondern auch die Platzkomplexität. Denn beim Mergen zweier Teillisten benötigen
  41. wir zusätzlichen Speicherplatz, um die gemergte Liste aufzunehmen. Hier noch mal ein Beispiel einer Merge-Phase mit acht Elementen.
  42. Für die ersten zwei Merges benötigen wir je eine zusätzliche Liste der Größe zwei. Um diese zwei Teillisten zu mergen, benötigen wir eine Liste der Größe vier.
  43. Die zwei Teillisten benötigen wir jetzt nicht mehr. Genauso mergen wir die hinteren vier Zahlen.
  44. Und zuletzt mergen wir diese zwei Teillisten. In diesem letzten Schritt benötigen wir den maximalen zusätzlichen Speicherplatz,
  45. nämlich doppelt so viel, wie wir Elemente haben, also 2 mal n. Es gibt noch einen alternativen Ansatz, der mit weniger Speicher auskommt.
  46. Wir mergen die ersten zwei Elemente und kopieren danach die gemergten und somit sortierten Elemente zurück in das Eingabe-Array.
  47. Wir mergen die nächsten zwei Elemente, kopieren auch diese zurück, mergen die ersten zwei Teillisten und kopieren auch diese zurück.
  48. Genauso gehen wir auf der rechten Seite vor. Und schließlich führen wir die letzten beiden Teillisten zusammen.
  49. Bei dieser Variante benötigen wir zusätzlichen Speicherplatz für maximal n Elemente, also halb so viele wie zuvor. Dafür haben wir allerdings zahlreiche zusätzliche Kopiervorgänge.
  50. So oder so – die Platzkomplexität von Mergesort ist O(n). Jetzt möchte ich euch noch eine Optimierung von Mergesort vorstellen, nämlich „Natural Mergesort“.
  51. Wenn wir uns noch einmal das erste Beispiel ansehen, können wir feststellen, dass unsere Zahlenfolge einige Teilfolgen enthält, die die Zahlen bereits in richtiger Reihenfolge enthalten.
  52. Diese Teilfolgen lassen sich durch einen einzigen Lauf über alle Zahlen ermitteln. Danach können wir direkt zur Merge-Phase übergehen.
  53. Wir mergen die ersten zwei Teillisten. Und wenn wir das Ergebnis mit der dritten Teillisten mergen,
  54. sind auch schon alle Zahlen fertig sortiert. Wenn die Zahlen komplett vorsortiert sind, wird das direkt beim ersten
  55. Durchlauf erkannt. Der Aufwand dafür wächst linear mit der Länge der Liste. Bei Natural Mergesort haben wir also auch einen Best Case,
  56. und dessen Zeitkomplexität ist: O(n). Die Zeitkomplexität im Average und Worst Case bleibt bei O(n × log n).
  57. Ich hoffe euch hat dieses Video über Mergesort gefallen. Auf meiner Webseite HappyCoders.eu findet ihr die Erklärung auch noch einmal zum Nachlesen. Einen
  58. Link dazu findet ihr in der Videobeschreibung. In dem Artikel findet ihr auch den Quellcode von Mergesort und eine Beschreibung von In-Place Mergesort, einer Variante, bei der die Merge-Phase
  59. ohne zusätzlichen Speicherplatz für die gemergten Teillisten auskommt. Wenn euch das Video gefallen hat, gebt mir gerne einen Daumen hoch, schreibt mir einen
  60. Kommentar, und ganz besonders freue ich mich natürlich, wenn ihr meinen Kanal abonniert. Bis bald und Happy Coding!

Zum Nachlesen