Die asymptotische Notation f , g : N → R≥0 seien Funktionen, die einer Eingabelänge n ∈ N eine nicht-negative Laufzeit f (n), bzw. g(n) zuweisen. Asymptotik 1/9 Die asymptotische Notation f , g : N → R≥0 seien Funktionen, die einer Eingabelänge n ∈ N eine nicht-negative Laufzeit f (n), bzw. g(n) zuweisen. Die Groß-Oh Notation: f = O(g) ⇔ Es gibt eine positive Konstante c > 0 und eine natürliche Zahl n0 ∈ N, so dass f (n) ≤ c · g(n) für alle n ≥ n0 gilt: f wächst höchstens so schnell wie g. Asymptotik 1/9 Die asymptotische Notation f , g : N → R≥0 seien Funktionen, die einer Eingabelänge n ∈ N eine nicht-negative Laufzeit f (n), bzw. g(n) zuweisen. Die Groß-Oh Notation: f = O(g) ⇔ Es gibt eine positive Konstante c > 0 und eine natürliche Zahl n0 ∈ N, so dass f (n) ≤ c · g(n) für alle n ≥ n0 gilt: f wächst höchstens so schnell wie g. f = Ω(g) ⇔ g = O(f ) : f wächst mindestens so schnell wie g. Asymptotik 1/9 Die asymptotische Notation f , g : N → R≥0 seien Funktionen, die einer Eingabelänge n ∈ N eine nicht-negative Laufzeit f (n), bzw. g(n) zuweisen. Die Groß-Oh Notation: f = O(g) ⇔ Es gibt eine positive Konstante c > 0 und eine natürliche Zahl n0 ∈ N, so dass f (n) ≤ c · g(n) für alle n ≥ n0 gilt: f wächst höchstens so schnell wie g. f = Ω(g) ⇔ g = O(f ) : f wächst mindestens so schnell wie g. f = Θ(g) ⇔ f = O(g) und g = O(f ) : f und g wachsen gleich schnell. Asymptotik 1/9 Die asymptotische Notation f , g : N → R≥0 seien Funktionen, die einer Eingabelänge n ∈ N eine nicht-negative Laufzeit f (n), bzw. g(n) zuweisen. Die Groß-Oh Notation: f = O(g) ⇔ Es gibt eine positive Konstante c > 0 und eine natürliche Zahl n0 ∈ N, so dass f (n) ≤ c · g(n) für alle n ≥ n0 gilt: f wächst höchstens so schnell wie g. f = Ω(g) ⇔ g = O(f ) : f wächst mindestens so schnell wie g. f = Θ(g) ⇔ f = O(g) und g = O(f ) : f und g wachsen gleich schnell. f (n) n→∞ g(n) Die Klein-Oh Notation: f = o(g) ⇔ lim = 0: f wächst langsamer als g. Asymptotik 1/9 Wie schnell dominiert die Asymptotik? Annahme: Ein einfacher Befehl benötigt 10−9 Sekunden. Asymptotik 2/9 Wie schnell dominiert die Asymptotik? Annahme: Ein einfacher Befehl benötigt 10−9 Sekunden. n 16 32 n2 256 1.024 n3 4.096 32.768 n10 ≥ 1012 ≥ 1015 2n 65536 ≥ 4 · 109 64 4.096 262.144 ≥ 1018 | {z } ≥ 6 · 1019 | {z } mehr als 10 Jahre mehr als 600 Jahre 128 256 512 1024 Million 16.384 65.536 262.144 1.048.576 ≥ 1012 | {z } mehr als 15 Minuten Asymptotik 2.097.152 16.777.216 134.217.728 ≥ 109 ≥ 1018 | {z } mehr als 10 Jahre n! ≥ 1013 ≥ 1031 | {z } mehr als 1014 Jahre 2/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge Asymptotik f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Wenn 0 < c < ∞, dann ist Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Wenn 0 < c < ∞, dann ist f = Θ(g): f und g wachsen gleich schnell. Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Wenn 0 < c < ∞, dann ist f = Θ(g): f und g wachsen gleich schnell. Wenn 0 ≤ c < ∞, dann ist Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Wenn 0 < c < ∞, dann ist f = Θ(g): f und g wachsen gleich schnell. Wenn 0 ≤ c < ∞, dann ist f = O(g): f wächst höchstens so schnell wie g. Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Wenn 0 < c < ∞, dann ist f = Θ(g): f und g wachsen gleich schnell. Wenn 0 ≤ c < ∞, dann ist f = O(g): f wächst höchstens so schnell wie g. Wenn 0 < c ≤ ∞, dann ist Asymptotik 3/9 Grenzwerte Grenzwerte sollten das Wachstum vorausssagen! Der Grenzwert der Folge f (n) g(n) f (n) n→∞ g(n) existiere und es sei lim = c. Wenn c = 0, dann ist f = o(g): f wächst langsamer als g. Wenn 0 < c < ∞, dann ist f = Θ(g): f und g wachsen gleich schnell. Wenn 0 ≤ c < ∞, dann ist f = O(g): f wächst höchstens so schnell wie g. Wenn 0 < c ≤ ∞, dann ist f = Ω(g): f wächst mindestens so schnell wie g. Asymptotik 3/9 Die Regel von de l’Hospital f (n) n→∞ g(n) lim f 0 (n) , 0 g n→∞ (n) = lim falls der letzte Grenzwert existiert und falls lim f (n) = lim g(n) ∈ {0, ∞}. n→∞ Asymptotik n→∞ 4/9 Die Regel von de l’Hospital f (n) n→∞ g(n) lim f 0 (n) , 0 g n→∞ (n) = lim falls der letzte Grenzwert existiert und falls lim f (n) = lim g(n) ∈ {0, ∞}. n→∞ n→∞ log2 n = o(n). Warum? I lim log2 n = lim n = ∞, n→∞ I I n→∞ log02 (n) n0 n→∞ der Grenzwert lim (log2 e ln(n))0 n0 n→∞ = lim = lim log2 e · n→∞ 1/n 1 =0 existiert und log2 (n) lim = 0 folgt mit der Regel von de l’Hospital. n n→∞ Asymptotik 4/9 Die Regel von de l’Hospital f (n) n→∞ g(n) lim f 0 (n) , 0 g n→∞ (n) = lim falls der letzte Grenzwert existiert und falls lim f (n) = lim g(n) ∈ {0, ∞}. n→∞ n→∞ log2 n = o(n). Warum? I lim log2 n = lim n = ∞, n→∞ I I n→∞ log02 (n) n0 n→∞ der Grenzwert lim (log2 e ln(n))0 n0 n→∞ = lim = lim log2 e · n→∞ 1/n 1 =0 existiert und log2 (n) lim = 0 folgt mit der Regel von de l’Hospital. n n→∞ Weitere Anwendungen: I log2 log2 n = o(log2 n). Asymptotik 4/9 Die Regel von de l’Hospital f (n) n→∞ g(n) lim f 0 (n) , 0 g n→∞ (n) = lim falls der letzte Grenzwert existiert und falls lim f (n) = lim g(n) ∈ {0, ∞}. n→∞ n→∞ log2 n = o(n). Warum? I lim log2 n = lim n = ∞, n→∞ I I n→∞ log02 (n) n0 n→∞ der Grenzwert lim (log2 e ln(n))0 n0 n→∞ = lim = lim log2 e · n→∞ 1/n 1 =0 existiert und log2 (n) lim = 0 folgt mit der Regel von de l’Hospital. n n→∞ Weitere Anwendungen: I I log2 log2 n = o(log2 n). log2 log2 log2 n = o(log2 log2 n). Asymptotik 4/9 Die Regel von de l’Hospital f (n) n→∞ g(n) lim f 0 (n) , 0 g n→∞ (n) = lim falls der letzte Grenzwert existiert und falls lim f (n) = lim g(n) ∈ {0, ∞}. n→∞ n→∞ log2 n = o(n). Warum? I lim log2 n = lim n = ∞, n→∞ I I n→∞ log02 (n) n0 n→∞ der Grenzwert lim (log2 e ln(n))0 n0 n→∞ = lim = lim log2 e · n→∞ 1/n 1 =0 existiert und log2 (n) lim = 0 folgt mit der Regel von de l’Hospital. n n→∞ Weitere Anwendungen: I I I log2 log2 n = o(log2 n). log2 log2 log2 n = o(log2 log2 n). (k +1) (k ) log2 n = o(log2 n) für jedes k . Asymptotik 4/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. Asymptotik Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. Asymptotik Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. Asymptotik Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. log2 n = o(n1/k ) für jedes k > 1, wende de l’Hospital an. Asymptotik Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. log2 n = o(n1/k ) für jedes k > 1, wende de l’Hospital an. n1/k = o(n) und n = o(n · log2 n) für jedes k > 1, limn→∞ Asymptotik n1/k n = limn→∞ 1 n1−1/k = 0 und limn→∞ log2 n = ∞. Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. log2 n = o(n1/k ) für jedes k > 1, wende de l’Hospital an. n1/k = o(n) und n = o(n · log2 n) für jedes k > 1, limn→∞ n · log2 n = Asymptotik n1/k n = limn→∞ o(nk ) 1 n1−1/k = 0 und limn→∞ log2 n = ∞. für jedes k > 1. Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. log2 n = o(n1/k ) für jedes k > 1, wende de l’Hospital an. n1/k = o(n) und n = o(n · log2 n) für jedes k > 1, limn→∞ n1/k n = limn→∞ 1 n1−1/k = 0 und limn→∞ log2 n = ∞. o(nk ) n · log2 n = für jedes k > 1. k n n = o(b ) für jedes b > 1, nk = bk ·logb n und Asymptotik Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. log2 n = o(n1/k ) für jedes k > 1, wende de l’Hospital an. n1/k = o(n) und n = o(n · log2 n) für jedes k > 1, limn→∞ n1/k n = limn→∞ 1 n1−1/k = 0 und limn→∞ log2 n = ∞. o(nk ) n · log2 n = für jedes k > 1. k n n = o(b ) für jedes b > 1, nk = bk ·logb n und k limn→∞ nbn = limn→∞ Asymptotik bk ·logb n bn = limn→∞ bk ·logb n−n = 0. Eine Wachstums-Hierarchie 5/9 Eine Wachstums-Hierarchie f1 (n) = 1, dann ist f1 = o(log2 log2 n), limn→∞ log2 log2 n = ∞. log2 log2 n = o(log2 n), wende de l’Hospital an. log2 n = Θ(loga n) für jedes a > 1, log2 n = log2 a · loga n. log2 n = o(n1/k ) für jedes k > 1, wende de l’Hospital an. n1/k = o(n) und n = o(n · log2 n) für jedes k > 1, limn→∞ n1/k n = limn→∞ 1 n1−1/k = 0 und limn→∞ log2 n = ∞. o(nk ) n · log2 n = für jedes k > 1. k n n = o(b ) für jedes b > 1, nk = bk ·logb n und k limn→∞ nbn = limn→∞ bk ·logb n bn = limn→∞ bk ·logb n−n = 0. Und bn = o(n!) für jedes b > 1. Asymptotik Eine Wachstums-Hierarchie 5/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). for (i=1; i < n ; i++) for (j=i+1; j < n ; j++) zwei einfache Anweisungen; I Laufzeit = Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). for (i=1; i < n ; i++) for (j=i+1; j < n ; j++) zwei einfache Anweisungen; I Laufzeit = O(n2 ). Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). for (i=1; i < n ; i++) for (j=i+1; j < n ; j++) zwei einfache Anweisungen; I Laufzeit = O(n2 ). while (n >1) n = 3n/4; I Laufzeit = Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). for (i=1; i < n ; i++) for (j=i+1; j < n ; j++) zwei einfache Anweisungen; I Laufzeit = O(n2 ). while (n >1) n = 3n/4; I Laufzeit = O(log2 n). Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). for (i=1; i < n ; i++) for (j=i+1; j < n ; j++) zwei einfache Anweisungen; I Laufzeit = O(n2 ). while (n >1) n = 3n/4; I Laufzeit = O(log2 n). while (n >1) {for (i=1; i < n; i++) {drei einfache Anweisungen;} n = 4n/5; } I Laufzeit = Laufzeitbestimmung 6/9 For-und While-Schleifen for (i=1; i < n ; i++) vier einfache Anweisungen; I Laufzeit = O(n). for (i=1; i < n ; i++) for (j=i+1; j < n ; j++) zwei einfache Anweisungen; I Laufzeit = O(n2 ). while (n >1) n = 3n/4; I Laufzeit = O(log2 n). while (n >1) {for (i=1; i < n; i++) {drei einfache Anweisungen;} n = 4n/5; } I Laufzeit = O(n). Laufzeitbestimmung 6/9 Anwendungen des Sortierens Wann soll was sortiert werden? Laufzeitbestimmung 7/9 Anwendungen des Sortierens Wann soll was sortiert werden? 1 Wie bestimmt man den Durchschnitt von n Intervallen [ai , bi ] möglichst schnell? Laufzeitbestimmung 7/9 Anwendungen des Sortierens Wann soll was sortiert werden? 1 2 Wie bestimmt man den Durchschnitt von n Intervallen [ai , bi ] möglichst schnell? Wie bestimmt man den Durchschnitt von n Rechtecken [ai , bi ] × [ci , di ] möglichst schnell? Laufzeitbestimmung 7/9 Anwendungen des Sortierens Wann soll was sortiert werden? 1 2 3 Wie bestimmt man den Durchschnitt von n Intervallen [ai , bi ] möglichst schnell? Wie bestimmt man den Durchschnitt von n Rechtecken [ai , bi ] × [ci , di ] möglichst schnell? Wir sollen die Vereinigung von n Intervallen [ai , bi ] möglichst schnell als eine Vereinigung von disjunkten Intervallen darstellen. Wie? Laufzeitbestimmung 7/9 Anwendungen des Sortierens Wann soll was sortiert werden? 1 2 3 4 Wie bestimmt man den Durchschnitt von n Intervallen [ai , bi ] möglichst schnell? Wie bestimmt man den Durchschnitt von n Rechtecken [ai , bi ] × [ci , di ] möglichst schnell? Wir sollen die Vereinigung von n Intervallen [ai , bi ] möglichst schnell als eine Vereinigung von disjunkten Intervallen darstellen. Wie? Die k größten Zahlen aus einem unsortierten Array A sollen bestimmt werden. I I I Sollte man A sortieren oder einen Heap aus A bauen und k mal Delete_Max anwenden oder ....? Laufzeitbestimmung 7/9 Anwendungen des Sortierens Wann soll was sortiert werden? 1 2 3 4 Wie bestimmt man den Durchschnitt von n Intervallen [ai , bi ] möglichst schnell? Wie bestimmt man den Durchschnitt von n Rechtecken [ai , bi ] × [ci , di ] möglichst schnell? Wir sollen die Vereinigung von n Intervallen [ai , bi ] möglichst schnell als eine Vereinigung von disjunkten Intervallen darstellen. Wie? Die k größten Zahlen aus einem unsortierten Array A sollen bestimmt werden. I I I 5 Sollte man A sortieren oder einen Heap aus A bauen und k mal Delete_Max anwenden oder ....? Wir sollen feststellen, ob alle Schlüssel im Array A auch im Array B vorkommen. Wie? Laufzeitbestimmung 7/9 Wasserkrüge Gegeben sind n blaue und rote Wasserkrüge, wobei - alle blauen Krüge unterschiedliche Kapazität besitzen - und es zu jedem blauen Krug genau einen roten Krug gleicher Kapazität gibt. Finde alle Paare blauer und roter Krüge gleicher Kapazität mit möglichst wenigen Vergleichen. Laufzeitbestimmung 8/9 Wasserkrüge Gegeben sind n blaue und rote Wasserkrüge, wobei - alle blauen Krüge unterschiedliche Kapazität besitzen - und es zu jedem blauen Krug genau einen roten Krug gleicher Kapazität gibt. Finde alle Paare blauer und roter Krüge gleicher Kapazität mit möglichst wenigen Vergleichen. Eine Vergleichsoperation: Fülle einen blauen Krug b mit Wasser und entleere Krug b in einen roten Krug r . Wieviele Vergleichsoperationen sind ausreichend? Laufzeitbestimmung 8/9 Sortieren: Zusammenfassung Quicksort: I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Zusammenfassung: Sortieren 9/9 Sortieren: Zusammenfassung Quicksort: I I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Die zufällige Pivotwahl garantiert, dass jede Folge von n Zahlen in erwarteter Zeit O(n · log2 n) sortiert wird. Zusammenfassung: Sortieren 9/9 Sortieren: Zusammenfassung Quicksort: I I I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Die zufällige Pivotwahl garantiert, dass jede Folge von n Zahlen in erwarteter Zeit O(n · log2 n) sortiert wird. Eine Quicksort-Variante löst das Auswahlproblem in Zeit O(n). Zusammenfassung: Sortieren 9/9 Sortieren: Zusammenfassung Quicksort: I I I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Die zufällige Pivotwahl garantiert, dass jede Folge von n Zahlen in erwarteter Zeit O(n · log2 n) sortiert wird. Eine Quicksort-Variante löst das Auswahlproblem in Zeit O(n). Mergesort: I Sortiert jede Folge von n Zahlen in worst case Zeit O(n · log2 n). Zusammenfassung: Sortieren 9/9 Sortieren: Zusammenfassung Quicksort: I I I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Die zufällige Pivotwahl garantiert, dass jede Folge von n Zahlen in erwarteter Zeit O(n · log2 n) sortiert wird. Eine Quicksort-Variante löst das Auswahlproblem in Zeit O(n). Mergesort: I I Sortiert jede Folge von n Zahlen in worst case Zeit O(n · log2 n). Eine nicht-rekursive Variante sortiert n auf einem Externspeicher gespeicherte Zahlen mit höchstens O( Bn log M Mn ) Speicherzugriffen, B solange B Zahlen in einem „Schwung“ vom Externspeicher in den Hauptspeicher der Größe M gebracht werden können. Zusammenfassung: Sortieren 9/9 Sortieren: Zusammenfassung Quicksort: I I I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Die zufällige Pivotwahl garantiert, dass jede Folge von n Zahlen in erwarteter Zeit O(n · log2 n) sortiert wird. Eine Quicksort-Variante löst das Auswahlproblem in Zeit O(n). Mergesort: I I Sortiert jede Folge von n Zahlen in worst case Zeit O(n · log2 n). Eine nicht-rekursive Variante sortiert n auf einem Externspeicher gespeicherte Zahlen mit höchstens O( Bn log M Mn ) Speicherzugriffen, B solange B Zahlen in einem „Schwung“ vom Externspeicher in den Hauptspeicher der Größe M gebracht werden können. Jedes vergleichsorientierte Sortierverfahren benötigt mindestens Ω(n · log2 n) Vergleiche, aber Zusammenfassung: Sortieren 9/9 Sortieren: Zusammenfassung Quicksort: I I I Ein schnelles in place Sortierverfahren. Quicksort ist ideal, wenn alle Daten in den Hauptspeicher passen. Die zufällige Pivotwahl garantiert, dass jede Folge von n Zahlen in erwarteter Zeit O(n · log2 n) sortiert wird. Eine Quicksort-Variante löst das Auswahlproblem in Zeit O(n). Mergesort: I I Sortiert jede Folge von n Zahlen in worst case Zeit O(n · log2 n). Eine nicht-rekursive Variante sortiert n auf einem Externspeicher gespeicherte Zahlen mit höchstens O( Bn log M Mn ) Speicherzugriffen, B solange B Zahlen in einem „Schwung“ vom Externspeicher in den Hauptspeicher der Größe M gebracht werden können. Jedes vergleichsorientierte Sortierverfahren benötigt mindestens Ω(n · log2 n) Vergleiche, aber Radixsort sortiert n Zahlen aus der Menge {0, . . . , nL − 1} in Zeit O(n · L) ohne irgendeinen Vergleich auszuführen. Zusammenfassung: Sortieren 9/9