1 Algorithmen und Datenstrukturen Wintersemester 2013/14 11. Vorlesung Das Auswahlproblem Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: P 3 0 arithmetisches Mittel i A[i ] n 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 −19 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 arithmetisches Mittel −19 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 arithmetisches Mittel −19 -19 2 Analyse von Messreihen Problem: Gegeben eine Reihe von n Messwerten A[1..n], finde einen guten“ Mittelwert. ” Beispiel: 3 0 arithmetisches Mittel −19 -19 2 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 −19 -19 2 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 −19 -19 Median A[b n+1 2 c] 2 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 −19 -19 Median A[b n+1 2 c] 2 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 2 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 Das Auswahlproblem Aufgabe: Gegeben ein Feld A[1..n], finde das i .-kleinste Element von A. 3 Das Auswahlproblem Aufgabe: Gegeben ein Feld A[1..n], finde das i .-kleinste Element von A. Lösung: 3 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! 3 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) 3 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 Spezialfälle i = b n+1 2 c: i = 1: i = n: 4 Spezialfälle i = b n+1 2 c: Median i = 1: Minimum i = n: Maximum 4 Spezialfälle i = b n+1 2 c: Median i = 1: Minimum i = n: Maximum Minimum(Feld A) min = A[1] for i = 2 to A.length do if min > A[i ] then min = A[i ] return min 4 Spezialfälle i = b n+1 2 c: Median i = 1: Minimum 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 = return min 4 Spezialfälle i = b n+1 2 c: Median i = 1: Minimum 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 4 Spezialfälle 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 4 Spezialfälle 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? 4 Spezialfälle 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. 4 Spezialfälle 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. 4 Spezialfälle 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. 4 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 Eine Randbemerkung... Def. Sei Vminmax (n) die Anz. der Vgl., die man braucht um Minimum und Maximum von n Zahlen zu bestimmen. 5 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) ≤ 5 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) = 5 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) 5 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? 5 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? min max 5 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? min max 5 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? > min max 5 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? > min max 5 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? > min max 5 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? > min max < 5 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? > min max < 5 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? > min max < 5 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? > min max < > 5 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? > min max < > 5 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? > < > ... min max 5 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 min max < > ... 5 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 min max < 3 > ... 5 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 min max < 3 > 3 ... 5 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 min max < 3 > 3 ... 3 5 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 min max < 3 > 3 ... 3 = (n gerade) 5 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 min max < 3 > 3 ... 3 (n gerade) = 1 · 1 + (n/2 − 1) · 3 5 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 min max < 3 > 3 ... 3 (n gerade) = 1 · 1 + (n/2 − 1) · 3 = 3n/2 − 2 5 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 Auswahl per Teile & Herrsche Zur Erinnerung... QuickSort(A, `, r ) if ` < r then m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` r 6 Auswahl per Teile & Herrsche Zur Erinnerung... QuickSort(A, `, r ) if ` < r then m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` m r 6 Auswahl per Teile & Herrsche Zur Erinnerung... QuickSort(A, `, r ) if ` < r then m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` m r | {z } | {z } ≤ A[m] > A[m] 6 Auswahl per Teile & Herrsche Zur Erinnerung... QuickSort(A, `, r ) if ` < r then m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` m r | {z } | {z } ≤ A[m] > A[m] 6 Auswahl per Teile & Herrsche Zur Erinnerung... QuickSort(A, `, r ) if ` < r then m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` m r | {z } | {z } ≤ A[m] > A[m] 6 Auswahl per Teile & Herrsche Zur Erinnerung... QuickSort(A, `, r ) if ` < r then m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` r 6 Auswahl per Teile & Herrsche Zur Erinnerung... Randomized QuickSort(A, `, r ) if ` < r then Randomized m = Partition(A, `, r ) QuickSort(A, `, m − 1) QuickSort(A, m + 1, r ) A ` r 6 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 ) A ` r 6 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 ) A ` r RandomizedSelect(A, `, r , i ) 6 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 ) A ` r RandomizedSelect(A, `, r , i ) if ` == r then return A[`] m = RandomizedPartition(A, `, r ) k =m−`+1 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) 6 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 ) A ` m r RandomizedSelect(A, `, r , i ) if ` == r then return A[`] m = RandomizedPartition(A, `, r ) k =m−`+1 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) 6 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 RandomizedSelect(A, `, r , i ) if ` == r then return A[`] m = RandomizedPartition(A, `, r ) k =m−`+1 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) 6 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 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) 6 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) 6 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) 6 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 Laufzeit-Analyse Anz. Vgl. von RandomizedSelect ist ZV; hängt von n und i ab. 7 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. 7 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 7 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 . . . V (n) = VPart (n) + V (b n2 c) falls m = b n2 c + 1 ... V (n − 2) falls m = n − 1 V (n − 1) falls m = n 7 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 . . . V (n) = VPart (n) + V (b n2 c) falls m = b n2 c + 1 | {z } ... V (n − 2) falls m = n − 1 V (n − 1) falls m = n 7 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 . . . V (n) = VPart (n) + V (b n2 c) falls m = b n2 c + 1 | {z } ... =n−1 V (n − 2) falls m = n − 1 V (n − 1) falls m = n 7 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 } ... =n−1 V ( n − 2) falls m = n − 1 V (n − 1) falls m = n 7 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 i 7 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 i 7 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 ⇒ E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] i 7 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-1 Substitutionsmethode E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-2 Substitutionsmethode Wir schreiben f (n) für E [V (n)]. E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-3 Substitutionsmethode Wir schreiben f (n) für E [V (n)]. Pn−1 2 Dann gilt f (n) ≤ n + n k =bn/2c f (k ) E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-4 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. E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-5 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] E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 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-7 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 E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-8 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) E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-9 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+ E [V (n)] ≤ n −1 + 2· n1 c n n(n − 1) − (n/2 − 1)(n/2 − 2) Pn−1 k =bn/2c E [V (k )] 8-10 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) <n+c · E [V (n)] ≤ n −1 + 2· n1 Pn−1 3n+2 4 k =bn/2c E [V (k )] 8-11 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) <n+c · E [V (n)] ≤ n −1 + 2· n1 Pn−1 3n+2 4 k =bn/2c = cn − (c · E [V (k )] n−2 4 − n) 8-12 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) <n+c · 3n+2 4 = cn − (c · ≤ cn E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] n−2 4 − n) 8-13 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) <n+c · 3n+2 4 = cn − (c · ≤ cn E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] n−2 4 ?! − n) ≥ 0 8-14 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) < n + c · 3n4+2 = cn − (c · ≤ cn falls n(c − 4) ≥ 2c E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] n−2 4 ?! − n) ≥ 0 8-15 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 2c ≤ cn falls n(c − 4) ≥ 2c d.h. n ≥ c −4 E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-16 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 2c ≤ cn falls n(c − 4) ≥ 2c d.h. n ≥ c −4 c >4 E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c E [V (k )] 8-17 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 2c ≤ cn falls n(c − 4) ≥ 2c d.h. n ≥ c −4 E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c c >4 c := z }| { E [V (k )] ≤ (4 + ε)n 8-18 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 2c ≤ cn falls n(c − 4) ≥ 2c d.h. n ≥ c −4 E [V (n)] ≤ n −1 + 2· n1 Pn−1 k =bn/2c c >4 c := z }| { h falls i E [V (k )] ≤ (4 + ε)n n≥ 8+2ε ε 8-19 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+ Für jedes ε > 0 gilt: E [V (n)] ≤ n −1 + c n n(n − 1) − (n/2 − 1)(n/2 − 2) ?! ≥0 < n + c · 3n4+2 = cn − (c · n−2 − n ) 4 2c ≤ cn falls n(c − 4) ≥ 2c d.h. n ≥ c −4 2· n1 Pn−1 k =bn/2c c >4 c := z }| { h falls i E [V (k )] ≤ (4 + ε)n n≥ 8+2ε ε 9 Ergebnis und Diskussion Satz. Das Auswahlproblem kann in erwartet linearer Zeit gelöst werden. 9 Ergebnis und Diskussion Satz. Genauer: Das Auswahlproblem kann in erwartet linearer Zeit gelöst werden. 9 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. 9 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: 9 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? 9 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 – 10 Vorbereitung Wir verwenden wieder Teile-und-Herrsche – aber diesmal mit einer garantiert guten Aufteilung in Teilfelder. 10 Vorbereitung Wir verwenden wieder Teile-und-Herrsche – aber diesmal mit einer garantiert guten Aufteilung in Teilfelder. 10 Vorbereitung Wir verwenden wieder Teile-und-Herrsche – aber diesmal mit einer garantiert guten Aufteilung in Teilfelder. d.h. balanciert: 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 . 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 . Partition (A, `, r ) 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 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 . Partition0(A, `, r ) 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 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 . 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 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 . 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 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-1 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. 11-2 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. 11-3 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. 11-4 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. 11-5 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. 11-6 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. x 11-7 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 ) x 11-8 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 ) x 11-9 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 ) x 11-1 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 ) x > 11-1 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 ) ≤ x > 11-1 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 ≤ x > 11-1 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 // A[m] k .-kleinstes El. ≤ x > 11-1 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] else if i < k then return Select(A, `, m − 1, i) else return Select(A, m + 1, r , i − k) // A[m] k .-kleinstes El. ≤ x > 11-1 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) // A[m] k .-kleinstes El. ≤ x > 11-1 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) Anzahl ≥ // A[m] k .-kleinstes El. ≤ x > 11-1 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 // A[m] k .-kleinstes El. ≤ x > 11-1 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-1 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-2 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) 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 > 11-2 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-1 Laufzeit-Analyse Beob. Es genügt wieder, Vergleiche zu zählen! 12-2 Laufzeit-Analyse Beob. Es genügt wieder, Vergleiche zu zählen! Partition0 : ≈ 1n 12-3 Laufzeit-Analyse Beob. Es genügt wieder, Vergleiche zu zählen! Partition0 : ≈ 1n , Sortieren: ≈ n5 · VIS (5) = 2n Vgl. 12-4 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. 12-5 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-6 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. 12-7 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 12-8 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 12-9 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 12-1 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 12-1 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 12-1 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 n · (c − 30) ≥ 70c 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ 70c c −30 und c > 30. 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ 70c c −30 und c > 30. 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und c > 30. + 70 gilt: V (n) ≤ (30 + ε) · n | {z c } 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und c > 30. + 70 gilt: V (n) ≤ (30 + ε) · n | {z c } 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und c > 30. + 70 gilt: V (n) ≤ (30 + ε) · n 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und c > 30. + 70 gilt: V (n) ≤ (30 + ε) · n 12-1 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und c > 30. + 70 gilt: V (n) ≤ (30 + ε) · n Kann man das verbessern? 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und c > 30. + 70 gilt: V (n) ≤ (30 + ε) · n 12-2 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-2 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 n · (c − 30) ≥ 70c , d.h. falls n ≥ ⇒ für jedes ε > 0 und n ≥ 2100 ε 70c c −30 und 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. 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. 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] 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. 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. 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 schlechtesten Fall mindestens 2n Vergleiche. 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.