External Quicksort Optimierung des Quicksort-Verfahrens für Speicherhierarchien Martin Gronemann, Bernd Zey
Überblick Quicksort - Erinnerung Intuitive Lösung Distribution-Sort (external Quicksort)
Quicksort - Erinnerung Pivot-Element: 23 R L 12 5 23 1 60 17 55 22 42 L 42 12 L L 22 1 L 1 60 55 23 17 R 23 17 R 60 55 R 12 5 22 1 60 17 55 42 23 12 5 22 1 60 23 55 42 17 12 5 23 1 60 17 55 22 42 12 5 23 1 60 17 55 22 42 12 12 5 42 23 1 60 17 55 22 5 12 5 22 1 17 55 42 60 23 1 5 22 17 42 60 12 23 55 1 5 17 22 42 60 12 23 55
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
Intuitive Lösung: Beispiel EM: L R L R L R L R L R L R MM: L R L R L R L R Pivot
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/M Chunks 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
Beispiel µ=4 Pivot 1 Pivot 2 Pivot 3 -∞ ∞ 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