1 Algorithmen und Datenstrukturen Wintersemester 2016/17 10. Vorlesung Das Auswahlproblem Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I 2-1 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. n+1 ” index 2 Beispiel: 3 0 arithmetisches Mittel P 1 i A[i ] n Beob.: Median A[b n+1 2 c] Der Median ist stabiler gegen Ausreißer als das arithmetische Mittel. −19 -19 Berechnung? 3-5 Das Auswahlproblem Aufgabe: Gegeben ein Feld A[1..n], finde das i .-kleinste Element von A. Lösung: Sortiere und gib A[i ] zurück! Worst-Case-Laufzeit: Θ (n log n) Das heißt. . . 4-1 Spezialfälle Geht das auch in linearer Zeit?? i = b n+1 2 c: Median o i = 1: Minimum Laufzeit Θ (n) i = n: Maximum Minimum(Feld A) min = A[1] for i = 2 to A.length do if min > A[i ] then min = A[i ] Anzahl Vergleiche = n − 1 return min Ist das optimal? Betrachte ein Turnier. Bis ein Gewinner feststeht, muss jeder – außer dem Gewinner – mindestens einmal verlieren. Also sind n − 1 Vergleiche optimal. 5-2 Eine Randbemerkung... Def. Klar: Sei Vminmax (n) die Anz. der Vgl., die man braucht um Minimum und Maximum von n Zahlen zu bestimmen. Vminmax (n) ≤ 2 · Vmin (n) = 2(n − 1) Frage: Geht es auch mit weniger Vergleichen? > 1 < 3 > 3 min max Ist das optimal? ... 3 (n gerade) = 1 · 1 + (n/2 − 1) · 3 = 3n/2 − 2 6-1 Auswahl per Teile & Herrsche Zur Erinnerung... Finde i .-kleinstes Element in A[`..r ]! Randomized QuickSort(A, `, r ) if ` < r then Randomized m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) k A ` m r | {z } | {z } ≤ A[m] > A[m] RandomizedSelect(A, `, r , i ) if ` == r then return A[`] m = RandomizedPartition(A, `, r ) k = m − ` + 1 // A[m] k .-kleinstes El. von A[`..r ] if i == k then return A[m] else if i < k then return RSelect(A, `, m−1, i) else return RSelect(A, m+1, r , i −k) Ist Ihnen klar warum? 7-1 Laufzeit-Analyse Anz. Vgl. von RandomizedSelect ist ZV; hängt von n und i ab. Trick: Geh davon aus, dass das gesuchte i . Element immer im m n 1 größeren Teilfeld liegt. ⇒ resultierende Zufallsvariable V (n) ist – obere Schranke für tatsächliche Anzahl von Vergleichen – unabhängig von i V (n − 1) falls m = 1 V (n − 2) falls m = 2 Alle Fälle gleich . . . V (n) = VPart (n) + V (b n2 c) falls m = b n2 c + 1 wahrscheinlich! | {z } ... vorausgesetzt =n−1 V ( n − 2) falls m = n − 1 alle Elem. sind verschieden! V (n − 1) falls m = n h Pn−1 1 ⇒ E [V (n)] ≤ n −1 + 2· n k =bn/2c E [V (k )] ≤ i ? c ·n für ein c >0 8-6 Substitutionsmethode Wir schreiben f (n) für E [V (n)]. Pn−1 2 Dann gilt f (n) ≤ n + n k =bn/2c f (k ) Wir wollen prüfen, ob es ein c > 0 gibt, so dass f (n) ≤ cn. Pn−1 2 Also: f (n) ≤ n + n k =bn/2c c · k [laut Annahme] Aufgabe: Bestimmen Sie ein c , so dass f (n) ≤ cn! (Ignorieren Sie das Abrunden b...c.) E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-1 Substitutionsmethode Wir schreiben f (n) für E [V (n)]. Pn−1 2 Dann gilt f (n) ≤ n + n k =bn/2c f (k ) Wir wollen prüfen, ob es ein c > 0 gibt, so dass f (n) ≤ cn. Pn−1 2 Also: f (n) ≤ n + n k =bn/2c c · k [laut Annahme] Pn−1 Pbn/2c−1 2c =n+ n k k =1 k − k =1 = n + 2nc n(n2−1) − bn/2c(b2n/2c−1) ≤n+ c n n(n − 1) − (n/2 − 1)(n/2 − 2) ?! ≥0 ≤ n + c · 3n4+2 = cn − (c · n−2 − n ) 4 4 n + −→ = 1−2/ ≤ cn falls c ≥ n4−2 4 n n→∞ Für jedes ε > 0 gilt: c}| := { h i z P falls n−1 1 E [V (n)] ≤ n −1 + 2· n k =bn/2c E [V (k )] ≤ (4 + ε)n n ≥ ε8 +2 9-6 Ergebnis und Diskussion Satz. Das Auswahlproblem kann in erwartet linearer Zeit gelöst werden. Genauer: Für jedes ε > 0 gilt, dass man in einer Folge von n ≥ ε8 + 2 Zahlen die i .-kleinste Zahl (1 ≤ i ≤ n) mit erwartet (4 + ε)n Vergleichen finden kann. Frage: Geht das auch deterministisch, d.h. ohne Zufall? M.a.W.: Kann man das Auswahlproblem auch im schlechtesten Fall in linearer Zeit lösen? 10 - Vorbereitung Wir verwenden wieder Teile-und-Herrsche – aber diesmal mit einer garantiert guten Aufteilung in Teilfelder. d.h. balanciert: jede Seite sollte ≥ γ n Elem. enthalten, für ein festes 0 < γ ≤ 12 . Wir gehen für die Analyse wieder davon aus, dass alle Elemente verschieden sind. Partition0(A, `, r ) , pivot) pivot = A[r ] i =`−1 for j = ` to r − 1 do if A[j ] ≤ pivot then i =i +1 Swap(A, i , j ) Swap(A, i + 1, r ) return i + 1 11 - Select: deterministisch Select(A, `, r , i ) 1. Teile die n Elem. der Eingabe in bn/5c 5er-Gruppen und eine Gruppe mit den restlichen (n mod 5) Elem. 2. Sortiere jede der dn/5e Gruppen und bestimme ihren Median. 3. Bestimme rekursiv den Median x der Gruppen-Mediane. 4. m = Partition0 (A, `, r , x ) ; k = m − ` + 1 5. if i == k then return A[m] |{z} else x if i < k then return Select(A, `, m − 1, i) else return Select(A, m + 1, r , i − k) 1 n Anzahl ≥ 3 2 5 − 2 ≥ 310n − 6 // A[m] k .-kleinstes El. ≤ x > 11 - Select: deterministisch Select(A, `, r , i ) 1. Teile die n Elem. der Eingabe in bn/5c 5er-Gruppen und eine Gruppe mit den restlichen (n mod 5) Elem. 2. Sortiere jede der dn/5e Gruppen und bestimme ihren Median. 3. Bestimme rekursiv den Median x der Gruppen-Mediane. 4. m = Partition0 (A, `, r , x ) ; k = m − ` + 1 5. if i == k then return A[m] |{z} else x if i < k then return Select(A,|`, m{z− 1, } i) ≤ 7n/10 + 6 Elem. else z }| { return Select(A, m + 1, r , i − k) 1 n Anzahl ≥ 3 2 5 − 2 ≥ 310n − 6 // A[m] k .-kleinstes El. ≤ x > 12 - Laufzeit-Analyse Beob. Es genügt wieder, Vergleiche zu zählen! Partition0 : ≈ 1n , Sortieren: ≈ n5 · VIS (5) = 2n Vgl. 3 Ansatz: (zSchritt }| { V (dn/5e) + V (7n/10 + 6) + 3n V (n) ≤ | {z } O (1) Schritt 5 falls n ≥ n0 , sonst. 12 - Laufzeit-Analyse Beob. Es genügt wieder, Vergleiche zu zählen! Partition0 : ≈ 1n , Sortieren: ≈ n5 · VIS (5) = 2n Vgl. Ansatz: ( V (n) ≤ V (dn/5e) + V (7n/10 + 6) + 3n O (1) falls n ≥ n0 , sonst. Behauptung: Es gibt c , n0 > 0, so dass für alle n ≥ n0 gilt: V (n) ≤ cn. ⇒ V (n) ≤ c · (n/5 + 1) + c · (7n/10 + 6) + 3n ?! ≥ 0 = c · (9n/10 + 7) + 3n = cn − c · (n/10 − 7) − 3n falls c ≥ 3n n/10−7 = 30 1−70/n −→ n→∞ 12 - Laufzeit-Analyse Beob. Es genügt wieder, Vergleiche zu zählen! Partition0 : ≈ 1n , Sortieren: ≈ n5 · VIS (5) = 2n Vgl. Ansatz: ( V (n) ≤ V (dn/5e) + V (7n/10 + 6) + 3n O (1) falls n ≥ n0 , sonst. Behauptung: Es gibt c , n0 > 0, so dass für alle n ≥ n0 gilt: V (n) ≤ cn. ⇒ V (n) ≤ c · (n/5 + 1) + c · (7n/10 + 6) + 3n = c · (9n/10 + 7) + 3n = cn − c · (n/10 − 7) − 3n falls c ≥ 3n n/10−7 = 30 1−70/n ⇒ für jedes ε > 0 und n ≥ −→ n→∞ 2100 ε 30+ bzw. n ≥ 70c c −30 . + 70 gilt: V (n) ≤ (30 + ε) · n | {z c } Kann man das verbessern? Laufzeit-Analyse Beob. Hausaufgabe! Es genügt wieder, Vergleiche zu zählen! Partition0 : ≈ 1n , Sortieren: ≈ n5 · VIS (5) = 2n Vgl. Ansatz: ( V (n) ≤ 12 - V (dn/5e) + V (7n/10 + 6) + 3n O (1) falls n ≥ n0 , sonst. Behauptung: Es gibt c , n0 > 0, so dass für alle n ≥ n0 gilt: V (n) ≤ cn. ⇒ V (n) ≤ c · (n/5 + 1) + c · (7n/10 + 6) + 3n = c · (9n/10 + 7) + 3n = cn − c · (n/10 − 7) − 3n falls c ≥ 3n n/10−7 = 30 1−70/n ⇒ für jedes ε > 0 und n ≥ −→ n→∞ 2100 ε 30+ bzw. n ≥ 70c c −30 . + 70 gilt: V (n) ≤ (30 + ε) · n 13 - Ergebnis und Diskussion Satz: Das Auswahlproblem kann auch im schlechtesten Fall in linearer Zeit gelöst werden. Genauer: Für jedes ε > 0 gilt, dass man in einer Folge von n ≥ 2100/ε + 70 Zahlen die i .-kleinste Zahl mit höchstens (30 + ε)n Vergleichen finden kann. Literatur: Randomized Algorithms [Motwani+Raghavan, Cambridge U Press, ’95] Algorithmen und Zufall [Vorlesungsskript, Jochen Geiger, Uni KL] • Der Algorithmus LazySelect [Floyd & Rivest, 1975] löst das √ Auswahlproblem mit WK 1 − O (1/ 4 n) mit 32 n + o (n) Vgl. • Die besten deterministischen Auswahl-Algorithmen (sehr kompliziert!) benötigen 3n Vergleiche im schlechtesten Fall. • Jeder deterministische Auswahl-Alg. benötigt im Zufall hilft! schlechtesten Fall mindestens 2n Vergleiche.