RadixSort

Werbung
Datenstrukturen und
Algorithmen
VO 708.031
5. Untere Schranke für Sortieren,
RadixSort
5. 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
5. 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
⇒ Es gibt n! Blätter
Ast:
Kontrollfluss für best. Input
5. 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
5. 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
5. 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
5. 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
5. Schranke Sortieren
[email protected]
8
RadixSort
• Beispiel für einen nicht vergleichsorientierten
Sortieralgorithmus
• Wenn d unterschiedlich: z.B. Auffüllen mit Nullen.
5. Schranke Sortieren
[email protected]
9
Herunterladen