Datenstrukturen und Algorithmen VO INF.02031UF 6. Untere Schranke für Sortieren, RadixSort 6. Schranke Sortieren [email protected] 1 Untere Schranke für Sortieren • Die bisher betrachteten schnellen Sortieralgorithmen (MergeSort, HeapSort, QuickSort) brauchen O(n log n) Zeit • Gibt es einen schnelleren Sortieralgorithmus? • Wir zeigen: Jedes Sortierverfahren, das mittels Vergleichen arbeitet, braucht mindestens c⋅n⋅log n Vergleiche im worst case 6. Schranke Sortieren [email protected] 2 Untere Schranke für Sortieren • Der Kontrollfluss von vergleichsbasierten Sortierverfahren kann als Entscheidungsbaum dargestellt werden: Beispiel: drei Zahlen a1, a2, a3: alle möglichen Programmverzweigungen Innere Knoten: Vergleiche zwischen Elementen Blätter: Sortierte Reihenfolge des Inputs ⇒ Wie viele Blätter gibt es mindestens? Ast: Kontrollfluss für best. Input 6. Schranke Sortieren [email protected] 3 Untere Schranke für Sortieren • Das worst-case Verhalten des Algorithmus entspricht dem längsten Ast im Entscheidungsbaum (# Knoten = # Vergleiche) • Der längste Ast wird kürzestmöglich, wenn alle Äste ungefähr gleich lang sind • Idealer Algorithmus entspricht einem vollständigen Binärbaum mit n! Blättern 6. Schranke Sortieren [email protected] 4 Untere Schranke für Sortieren • Die Höhe eines Binärbaums mit n! Blättern ist Ω(n log n) • ⇒ Ω(n log n) ist eine untere Schranke für die Anzahl der im worst case zum Sortieren notwendigen Vergleiche • ⇒ Die worst case Laufzeit vergleichsorientierter Sortierverfahren ist Ω(n log n) • MergeSort und HeapSort sind worst-case optimal 6. Schranke Sortieren [email protected] 5 Radixsort • Methoden die nicht nur auf Vergleichen basieren – CountingSort, BucketSort, RadixSort, ... • Wenn man annehmen kann dass die Anzahl der Stellen d (z.B. Dezimalstellen) der zu sortierenden Zahlen konstant ist. • Meist nur bei großen Datenmengen effizient • Hoher Speicheraufwand (Aber es gibt auch in-place RadixSort) • Hybride Sortierverfahren (z.B. InsertionSort für kleine Datensätze dann RadixSort) 21.11.2013 [email protected] 6 RadixSort Sortieren von n Dezimalzahlen der Länge d: RADIXSORT (A, d) 1: FOR i = 1 TO d 2: Ordne A nach i-ter Ziffer v.h. in Fächer ein (Streuphase) 3: Fasse die Fächer in aufsteigender Reihenfolge wieder in A zusammen (Sammelphase) T(n) = O(d n) … linear, wenn d als konstant betrachtet wird! • Nach den ersten k Durchläufen sind die Zahlen, eingeschränkt auf die letzten k Ziffern, sortiert • Wichtig: Die vorige Reihenfolge innerhalb der Fächer muss aufrechterhalten werden 6. Schranke Sortieren [email protected] 7 RadixSort • A=[08, 19, 02, 05, 14] mit n=5 und d=2. Streuphase 0 8 1 9 0 2 0 5 1 4 i=1 Fach 0 Fach 1 Sammelphase Streuphase 0 2 Sammelphase Fach 0 02, 05, 08 Fach 1 14, 19 0 2 Fach 2 0 5 Fach 3 0 8 Fach 4 1 4 Fach 6 Fach 5 1 9 Fach 7 Fach 6 Fach 2 02 Fach 3 Fach 4 14 Fach 5 05 Fach 8 08 1 4 0 5 0 8 1 9 i=2 Fach 7 Fach 8 Fach 9 19 Fach 9 6. Schranke Sortieren [email protected] 8 RadixSort • Beispiel für einen nicht vergleichsorientierten Sortieralgorithmus • Wenn d unterschiedlich: z.B. Auffüllen mit Nullen. 6. Schranke Sortieren [email protected] 9