150 likes | 400 Views
External Quicksort. Optimierung des Quicksort-Verfahrens für Speicherhierarchien Martin Gronemann, Bernd Zey. Überblick. Quicksort - Erinnerung Intuitive Lösung Distribution-Sort (external Quicksort). 12. 12. 42. 22. 1. 1. 60. 55. 60. 5. 12. 12. 5. 22. 1. 17. 23. 55. 55.
E N D
External Quicksort Optimierung des Quicksort-Verfahrens für Speicherhierarchien Martin Gronemann, Bernd Zey
Überblick • Quicksort - Erinnerung • Intuitive Lösung • Distribution-Sort (external Quicksort)
12 12 42 22 1 1 60 55 60 5 12 12 5 22 1 17 23 55 55 60 22 42 23 17 23 17 55 12 5 22 1 60 17 23 55 22 60 42 1 5 12 22 17 23 42 55 60 L L L R R L L R R 12 12 5 5 5 23 23 23 1 1 60 60 17 17 55 55 22 22 22 42 42 42 12 5 22 1 23 60 17 55 22 60 42 12 5 23 22 1 60 17 55 23 22 42 1 5 12 17 22 23 42 55 60 Quicksort - Erinnerung Pivot-Element: 23 12 42 23 1 60 17 55 22 5
Intuitive Lösung • Lade den Wert des Pivot-Elements und die ersten und letzen B Array-Elemente in den Main Memory • Starte normalen Quicksort • Laden und Schreiben bei Bedarf
R R R R R R R R R R L L L L L L L L L L Pivot Intuitive Lösung: Beispiel EM: MM:
Analyse: Intuitive Lösung • Analyse der I/O‘s äquivalent zur Laufzeitanalyse von Quicksort • Pro Rekursionstiefe: O(N/B) I/O‘s benötigt • Im average case beträgt die Rekursionstiefe O(log2 N) • I/O-Anzahl O(N/B log2 N/B) • interne Laufzeit O(N log2 N) • Im worst case (N2)
Distribution Sort • Mit mehreren Pivot-Elementen arbeiten • Pivot-Elemente definieren „Buckets“ • Element muss in „Bucket“ einsortiert werden • Jeden „Bucket“ rekursiv sortieren bis Blockgröße B erreicht ist
Berechnung der Pivot-Elemente (1) • Unterteile Eingabemenge in N/MChunks • Sortiere jeden Chunk • Nehme jedes a-te Element aus jedem Chunk in Array U auf (|U| = N/a) • Sortiere U • Berechne µ-1 äquidistante Pivot-Elemente aus dem Array U mit BFPRT (Blum-Floyd-Pratt-Rivest-Tarjan)
Berechnung der Pivot-Elemente (2) Chunks (sortiert) Array U (sortiert) BFPRT µ-1 Pivot-Elemente
Analyse:Berechnung der Pivot-Elemente • U kann mit O(N/B) I/O‘s erzeugt werden. • BFPRT benötigt O((|U|/B) lg µ) = O((N/aB) lg µ) I/O‘s Für a ≥ lg µ: O(N/B) • Insgesamt O(N/B) I/O‘s für die Berechnung der Pivot-Elemente
Rekursion • Sortiere jedes Element in den richtigen „Bucket“ (Distribution) Bi := {x | pi ≤ x < pi+1} • Starte Rekursion auf jedem „Bucket“ • Wenn „Bucket“ Blockgröße erreicht hat dann intern sortieren
-∞ Pivot 1 Pivot 2 Pivot 3 ∞ Beispiel µ=4 Blockgröße Rekursionstiefe: O(logµN/B)
Analyse • Rekursionstiefe bis zur Blockgröße: O(logµ N/B) I/O‘s • Einsortieren kostet pro Rekursionstiefe O(N/B) I/O‘s • Gesamt: O(N/B logµ N/B) I/O‘s
Literatur • Alok Aggarwal and Jerey Scott Vitter, 1988: „The Input/Output Complexity of Sorting and Related Problems“ • Jeff Erickson - Prof. an der University of Illinois: „Introduction: the standard external-memory model; upper and lower bounds for scanning (Θ(n)), searching (Θ(logB n) via B-trees), and sorting (Θ(n logm n) via mergesort); external comparison trees“ http://compgeom.cs.uiuc.edu/~jeffe/teaching/473/01-search+sort.pdf