2.2 Allgemeine (vergleichsbasierte) Sortierverfahren Vergleichsbaum: Der Aufbau des Verbleichsbaum ist für jeden Algorithmus und jede Eingabelänge n gleich. Jede Permutation der Eingabe, muss zu einem anderen Blatt führen, sofern alle Elemente verschieden sind. Dies führt zu einer Laufzeit ≥ n! Blätter. Die Anzahl der Vergleiche ist im schlechtsten Fall gleich der Höhe des Vergleichsbaums. Also ist die Anzahl der Vergleiche ≥ log(Anzahl der Blätter) ≥ log (n!) Die Abschätzen von n! ergibt Grob“ : ” n! = 1 · 2 · 3 · . . . · n ≤ nn Anderseits ist: n! = 1 · 2 · 3 · . . . · n 2 j n k + 1 · ... · n ≥ + 1 · ... · n ≥ {z } | 2 ≥ n2 =⇒ n n2 2 n 2 n2 ≤ n! ≤ nn Es folgt n n 2 n n n n log = (log (n) − 1) = log (n) − ≤ log (n!) ≤ log (n) ≤ n log (n) 2 2 2 2 =⇒ log (n!) = Θ (n log (n)) Eine bessere Abschätzung für n! ist mit Hilfe der Stirlingschen Formel möglich. Stirlingschen Formel wurde 1730 von James Stirling (1692-1770) entwickelt und dient zur Berechnung von Näherungswerten großer Fakultäten. n n √ Θ n! = 2πn · · e( 12n ) wobei 0 < Θ < 1 e log (n!) = n log (n) − n log (e) + 18 1 1 log (n) + log (2π) + O (1) 2 2 = n log (n) − O (n) (O (1) ist eine Funktion, die durch eine Konstante beschränkt ist.) Daraus folgt: Jeder vergleichsbasierte Sortieralgorithmus benötigt zum Sortieren von n Elementen Ω (n log (n)) Vergleiche. Genauer: Der Algorithmus benötigt im schlechtesten Fall mindestens n log (n) − O (n) Vergleiche. Daher ist z.B. Mergesort im schlechtsten Fall asymptotisch (d.h. bis auf eine multiplikative Konstante) optimal für vergleichsbasierte Sortieralgorithmen. Daraus kann man schließen, dass man nicht schneller Sortieren kann als mit n log (n) Vergleichen. 2.3 Sortieren in linearer Zeit Sortieren in linearer Zeit ist ausschließlich mit Sortierverfahren möglich, die nicht nur auf Vergleichen beruhen und des weiteren nur für spezielle Universen (Menge der Eingabedaten). Sortieren durch Zählen (im endlichen Universum) Voraussetzung: Universum ist endlich U = {a1 , a2 , . . . , ak } 1. Stelle k Zähler zur Verfügung 2. Durchlaufe die Eingabefolge Zähle Anzahl der a1 en, a2 en, . . . , ak en 3. Dann i = 1, . . . , k Gib so viele ai s aus wie gezählt wurden. Laufzeit: θ (n) im EKM Speicher: θ (k) mit k ist Größe des Universums U 2.3.1 Bucket Sort Bucket Sort ist eine Verallgemeinerung des Sortierens in linearer Zeit. Die Idee des Algorithmus besteht darin, das zu sortierende Intervall in gleichgroße Teilintervalle aufzuteilen, in so genannte Buckets“ und in dies dann die Elemente ” einzusortieren. Pseudocode für Bucket Sort Gegeben: ein beliebiges Universum und eine Abbildung f : U → {1, . . . , r}. Die Abbildung muss mit der Ordnungsrelation kompatibel sein, d.h. f (x) ≤ f (y) ⇒ x ≤ y (∀x, y ∈ U) 1. Stelle r Buckets“ (Listen) zur Verfügung. ” 19 2. Durchlaufe die Liste und berechen f (x) für alle Elemente x und werfe“ x in bucket Nummer f (x). ” Anschließend werden die Buckets“ intern mit Hilfe eines geeigneten Verfahren ” sortiert und die Listen aus den buckets“ 1, 2, . . . , r hintereinander gehängt. ” 2.3.2 Radixsort Das Radixsort Sortierverfahren basiert auf dem Bucket Sort Algorithmus. Man P verwendet Radixsort für Wörter über einem endlichen Alphabet = a1 , q2 , . . . , ak Bsp.: Theoretisch Radixsort beginnt minimieren. M ON DIE M IT bräuchte man pro Schritt 26 Buckets, insgesamt also 263 . die Buchstaben von hinten zu sortieren, um die Laufzeit zu DIE F RE SAM letzter DON F RI SAM SON Buchstabe −→ SAM DIE M IT zweiter M ON DON SON M IT Buchstabe −→ DIE DON F RE Erster M ON DON SON F RE Buchstabe −→ M IT M ON SAM SON Pseudocode für Radixsort Eingabe: n Wörter w1 , . . . , wn der gleichen Länge l 1. FOR i = l, . . . , 1 DO Bucketsort bezüglich des i-ten Zeichen der Wörter 2. THEN konkateniere die Buckets in richtiger Reihenfolge. Dies kann verallgemeinert werden auf Wörter unterschiedlicher Länge. Korrektheit: Zeige, dass die Worte nach dem i-ten Durchlauf bzgl. der i letzten Zeichen lexikografisch sortiert sind. Beweis durch Induktion über i. Laufzeit: Für l Durchläufe mit je Θ (n) Laufzeit, ergibt sich eine Gesamtlaufzeit von Θ (l · n) = Θ (N ), wobei N = die Gesamtanzahl der Zeichen in der Eingabe, l die Länge der Worte und n die Anzahl der Worte ist. Man kann auch Zahlen mit diesem Algorithmus sortieren, dabei wird eine Darstellung der Zahlen bzgl. einer Basis gewählt und diese Zahlen werden dann wie Worte sortiert. Dafür ergibt sich eine Laufzeit von insgesamt Θ (N ), wobei N die Gesamtlänge aller Darstellungen ist. 20 2.4 Das Auswahlproblem (selection, order statistics) Gegeben: Folge S der Länge n mit S ⊂ U und (U, ≤) sei ein linear geordnetes Universum. Finde: k-t-kleinstes Element von S (d.h. das Element, das an k-ter Stelle steht, wenn S aufsteigend sortiert ist). k = 1, dann M inimum → n − 1 V ergleiche k = n, dann M aximum Frage: Wie findet man das k = b n2 c Element, also genau den Median“? ” Antwort: Folge sortieren und k-te Stelle ausgeben Θ (n · log (n)) z.B. Mergesort. 2.4.1 Randomisierter Algorithmus (randomized selection) SELECT(k,S) 1. Falls |S| = 1 return a, mit S = {a} 2. Sonst wähle zufällig (gleichverteilt) ein a ∈ S 3. Teile S auf in S1 (Elemente < a) S2 (Elemente = a) S3 (Elemente > a) 4. Falls |S1 | < k ≤ |n − S3 | return a 5. Sonst falls |S1 | ≥ k : return SELECT(k, S1 ) 6. Sonst return SELECT(k − (n − |S3 |), S3 ) Analyse: Die erwartete Laufzeit (im EKM der RAM) ist T (1) = b, wobei b konstant ist. Annahme: Das ausgewählte Element sei das i-t kleinste, falls i < k. Wir durchsuchen rekursiv eine Folge der Größe n − 1 falls i > k. Rekursiver Aufruf der Größe i − 1. 21 Damit folgt die Rekursion für T (n): Pk−1 Pn T (n) = n1 [ i=1 T (n − i) + i=k+1 T (n − 1) + c · n Was wird summiert? 1. Teil der Summe: T (n − 1) + T (n − 2) + . . . + T (n − k + 1) 2. Teil der Summe: T (n − 1) + T (n − 2) + . . . + T (k) 3. Teil der Summe: Eine Konstante c für das Aufteilen Annahme: n ≤ n2 Falls das helle“ Stück durch das dunkle“ ersetzt wird, wird die Summe asym” ” ptotisch größer, da T (n) monoton wächst. Dies ist für den anderen Fall asymmetrisch. Also gilt: P n−1 T (n) ≤ n2 · i=b n c T (i) + c · n 2 Behauptung: T (n) = O(n) Beweis durch Induktion über n. 22