Suchen Datenstrukturen und Algorithmen FS 2016 Daniel Graf, 3. März 2016, [email protected] Suchen Gefragt: Gegeben: • n Datensätze mit Schlüsselmenge A mit A[1], A[2], ..., A[n] • Kommt k in A vor? Gibt es ein i mit A[i]=k? • gesuchter Schlüssel k A k=3 5 2 1 4 3 8 2 k=7 Suchen in sortierten Listen Gegeben: Gefragt: • n Datensätze mit Schlüsselmenge A mit A[1] ≤ A[2] ≤ ... ≤ A[n] • Kommt k in A vor? Gibt es ein i mit A[i]=k? • gesuchter Schlüssel k A k=3 1 2 2 3 4 5 8 k=7 Binäre Suche • Falls A leer ist, endet die Suche erfolglos. • Sonst betrachte das Element A[m] an mittlerer Position m. • Falls k<A[m], rekursiv: binäre Suche in der Teilliste A[1],…,A[m−1]. • Falls k>A[m], rekursiv: binäre Suche in der Teilliste A[m+1],…,A[n]. • Sonst ist k=A[m] und wir haben das gesuchte Element gefunden. Ist das korrekt? Ist das schnell? Binäre Suche Pseudocode Binäre Suche Korrektheit Wir brechen nur ab, falls A leer ist oder wir k gefunden haben. Schleifeninvariante „Falls k in A vorkommt, dann ist k im Bereich A[left, ..., right]." Beweis durch Induktion • Induktionsanfang: Zu Beginn betrachten wir das ganze Array A[0,...,n]. • Induktionsannahme: Die Invariante gilt nach i Schritten. • Induktionsschritt: Zeige, dass sie auch nach i+1 Schritten gilt. Falls k < A[middle], dann kann k nur in A[left,...,middle-1] sein. Falls k > A[middle], dann kann k nur in A[middle+1,...,right] sein. Binäre Suche Laufzeit n Nach einer Iteration mit n Elementen sind höchstens Elemente übrig. 2 Somit: T(n) = d T n 2 falls n = 1 sonst +c Teleskopieren: T(n) = T =T =T =T n 2 n 4 n i 2 n n +c + 2c +i·c + log n · c Vermutung: T(n) = d + c · log n Binäre Suche Laufzeit n Nach einer Iteration mit n Elementen sind höchstens Elemente übrig. 2 Somit: T(n) = d T n 2 +c falls n = 1 sonst Vermutung: T(n) = d + c · log n Beweis durch Induktion • Induktionsanfang: T(1) = d + c log 1 = d !n" !n" = d + c log • Induktionshypothese: T 2 2 n • Induktionsschritt von 2 nach n: T(n) = T n 2 IH + c = d + c log n 2 + c = d + c(log n Laufzeit in Θ(log n) 1) + c = d + c log n Power of the log _ n 2 Laufzeit n log n Problemgrösse Power of the log Live Demo Wie viele Personen sind im Raum? 8 4 Algorithmus: 1. Stehen Sie auf und denken Sie an die Zahl 1. 2. Suchen Sie den direkten Blickkontakt mit jemand anderem, der noch steht, und berechnen Sie die Summe Ihrer beiden Zahlen. 3. Einer von Ihnen beiden sitzt ab, der/die andere geht zurück zu Schritt 2. 12 Binäre Suche Untere Schranke Geht es besser als Θ(log n) ? Suchalgorithmus als Entscheidungsbaum 1 2 4 5 6 8 Binäre Suche Untere Schranke Geht es besser als Θ(log n) ? Suchalgorithmus als Entscheidungsbaum k<4 k<2 1 2 4 k<6 5 • Suchbaum mit mindestens n Knoten k>4 6 • Höhe = Worst Case Suchzeit k>6 8 • Ein Binärbaum der Höhe h hat h+1 höchstens 2 − 1 Knoten • n . h+1 2 1 h log(n + 1) • o(log n) ist nicht möglich Binäre Suche „I was amazed: given ample time, only about ten percent of professional programmers were able to get this small program right.“ Jon Bentley in Programming Pearls Geschichte • 1946: Binäre Suche publiziert • 1960: Erstes Verfahren, das i auch für n ̸= 2 − 1 stimmt Donald Knuth in TAoCP, Volume 3, Section 6.2.1 Interpolationssuche ,S‘ liegt wohl eher rechts der Mitte zwischen ,A‘ und ,Z‘. Lineare Interpolation zwischen den beiden Schlüsseln am Rand k A[l] m= l+ (r A[r] A[l] A[r] l) k Eigenschaften • Im schlimmsten Fall: n Vergleiche A[l] l m r • Im Mittel bei zufälligen Schlüsseln: rund log log n Vergleiche Exponentielle Suche Wie suchen wir in unendlichen sortierten Listen? A < [1,1] Exponentielle Suche Wie suchen wir in unendlichen sortierten Listen? A < < [1,2] Exponentielle Suche Wie suchen wir in unendlichen sortierten Listen? A < < [1,4] < Exponentielle Suche Wie suchen wir in unendlichen sortierten Listen? A < < < [1,8] > Exponentielle Suche Wie suchen wir in unendlichen sortierten Listen? A < < < binäre Suche auf [1,8] > Exponentielle Suche Wie suchen wir in unendlichen sortierten Listen? A < < < > binäre Suche auf [1,8] Eigenschaften • Falls k an konstanter Position i: O(1) • Falls alle Schlüssel verschieden: O(log k) Lineare Suche Was können wir tun, wenn A nicht sortiert ist? Jedes Element einzeln prüfen in O(n) Geht es wirklich nicht besser? Lineare Suche Behauptung: Wir brauchen mindestens n Vergleiche. Argument: Wer nicht jedes Element mit k vergleicht riskiert Korrektheit! A k Lineare Suche Behauptung: Wir brauchen mindestens n Vergleiche. h c Argument: Wer nicht jedes Element mit k vergleicht riskiert Korrektheit! s l Fa Problematisch: Wir können auch die Schlüssel untereinander vergleichen. A k Lineare Suche Behauptung: Wir brauchen mindestens n Vergleiche. Besseres Argument: • a Vergleiche ohne k und b Vergleiche mit k • die Vergleiche teilen Elemente in g Gruppen; zu Beginn n Gruppen • Zusammenlegen zweier Gruppen braucht min. einen Vergleich, a ≥ n-g • ein Element pro Gruppe muss mit k verglichen werden, b ≥ g • Anzahl Vergleiche a + b ≥ n - g + g = n Lineare Suche Min und Max Wie finden wir das Minimum und Maximum in A? • separat in je n Vergleichen • geht es in weniger als 2n Vergleichen für beides zusammen? < > > < 3 n Vergleiche 2 min max Auswahlproblem Datenstrukturen und Algorithmen FS 2016 Daniel Graf, 3. März 2016, [email protected] Auswahlproblem Gefragt: Gegeben: • n Datensätze mit Schlüsselmenge A mit A[1], A[2], ..., A[n] • Was ist das i-kleinste Element in A? • Index i • Z.B. Was ist der Median? A i=5 5 2 9 3 11 18 4 Ausgabe: 9 Auswahlproblem Wer hat die Median-Legi-Nummer? Motivation Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen A i=5 5 2 9 3 11 18 4 Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen 2 A i=4 5 9 3 11 18 4 Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen 23 A i=3 5 9 11 18 4 Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen 234 A i=2 5 9 11 18 Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen O(i · n) O(n ) 234 5 A i=1 9 11 18 Ausgabe: 9 2 Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen 2. Lösung: Sortieren und A[i] ausgeben A i=5 5 2 9 3 11 18 4 O(i · n) 2 O(n ) Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen O(i · n) 2. Lösung: Sortieren und A[i] ausgeben O(n log n) A i=5 2 3 4 5 9 11 18 Ausgabe: 9 2 O(n ) Auswahlproblem Simple Ansätze 1. Lösung: Wiederholt das Minimum entfernen O(i · n) 2. Lösung: Sortieren und A[i] ausgeben O(n log n) 3. & 4. Lösung: Technik des Pivotierens O(n) 2 O(n ) Auswahlproblem Grundidee A Pivotieren Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement A p Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement • Bestimme den Rang r von p, also zähle Anzahl Elemente ≤p ≤ A > > p Rang r = 9 ≤ ≤ ≤ ≤ > > ≤ ≤ ≤ > Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement • Bestimme den Rang r von p, also zähle Anzahl Elemente ≤p • Teile A entsprechend in zwei Teile auf und vergiss den irrelevanten ≤ A p ≤ ≤ ≤ ≤ ≤ ≤ ≤ > > > > > Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement • Bestimme den Rang r von p, also zähle Anzahl Elemente ≤p • Teile A entsprechend in zwei Teile auf und vergiss den irrelevanten A ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ > p > > > > Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement • Bestimme den Rang r von p, also zähle Anzahl Elemente ≤p • Teile A entsprechend in zwei Teile auf und vergiss den irrelevanten A ≤ Fall i=r: ≤ ≤ ≤ ≤ ≤ ≤ ≤ > p Resultat > > > > Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement • Bestimme den Rang r von p, also zähle Anzahl Elemente ≤p • Teile A entsprechend in zwei Teile auf und vergiss den irrelevanten A ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ > p Fall i<r: Suche das i-te Element hier > > > > Auswahlproblem Pivotieren Grundidee • Wähle ein Element p als Pivotelement • Bestimme den Rang r von p, also zähle Anzahl Elemente ≤p • Teile A entsprechend in zwei Teile auf und vergiss den irrelevanten A ≤ Fall i>r: ≤ ≤ ≤ ≤ ≤ ≤ ≤ > > > > > p Suche das (i-r-1)-te Element hier Auswahlproblem Pivotieren Was ist ein guter Pivot? • Das Minimum ist ein schlechter Pivot > A i=n p1 > > > > > > > > > > > > Auswahlproblem Pivotieren Was ist ein guter Pivot? • Das Minimum ist ein schlechter Pivot > A i=n p1 p2 > > > > > > > > > > > > Auswahlproblem Pivotieren Was ist ein guter Pivot? • Das Minimum ist ein schlechter Pivot A i=n p1 > > p2 p3 > > > > > > > > > > > Auswahlproblem Pivotieren Was ist ein guter Pivot? 2 Worst Case Θ(n ) • Das Minimum ist ein schlechter Pivot A i=n p1 > > > > > p2 p3 p4 p5 p6 > > > > > > > > Auswahlproblem Pivotieren Was ist ein guter Pivot? • Das Minimum ist ein schlechter Pivot 2 Worst Case Θ(n ) • Ein guter Pivot hat linear viele Elemente auf beiden Seiten A ε·n T(n) p Pivot irgendwo hier Pivot bestimmen + Aufteilen + Rekursion = c1 · n + c2 · n + T((1 ε) · n) = c · n + T((1 ε) · n) ε·n Auswahlproblem Pivotieren Was ist ein guter Pivot? 2 Worst Case Θ(n ) • Das Minimum ist ein schlechter Pivot • Ein guter Pivot hat linear viele Elemente auf beiden Seiten T(n) c · n + T((1 log1 ε (n) ... = 1 (1 i=0 log1 ε (n) = i ε) · c · n + T((1 1 (1 i=0 ε) · n) = c · n + c · (1 i ε) · c · n + T(1) ε) ε) · n + T((1 log1 ε (n) 2 ε) · n) · n) c ·n + T(1) 1 (1 ε) O(n) Auswahlproblem Pivotieren Was ist ein guter Pivot? • Das Minimum ist ein schlechter Pivot 2 Worst Case Θ(n ) • Ein guter Pivot hat linear viele Elemente auf beiden Seiten T(n) c · n + T((1 log1 ε (n) ... = i=0 log1 ε (n) = ε) · n) = cgeometrische · n + c · (1 Reihe ε) · n + T((1 1 ∞ ! a k i log1 ε (n) a · q = (1 ε) · c · n + T((1 ε) · n) 1−q ε) · n) k=0 1 (1 i=0 2 i ε) · c · n + T(1) c ·n + T(1) 1 (1 ε) O(n) Quickselect Tony Hoare 1961: Versuche es mit einem zufälligen Schlüssel als Pivot? A n 4 p schlechte Pivots n 2 gute Pivots n 4 schlechte Pivots Quickselect Tony Hoare 1961: Versuche es mit einem zufälligen Schlüssel als Pivot? A n 4 schlechte Pivots p n 2 gute Pivots n 4 schlechte Pivots 1 • Wahrscheinlichkeit einen guten Pivot zu erwischen: 2 • E = erwartete Anzahl Versuche bis wir einen guten Pivot treffen 1 • E = 1 + E ⇒ E = 2 Versuche genügen im Schnitt 2 Erwartete Laufzeit: O(n) Median nach Blum Idee Blum, Floyd, Pratt, Rivest, Tarjan 1973: Garantiert schnell guter Pivot! • Deterministisch einen guten Pivot finden und trotzdem lineare Laufzeit • Eher theoretisch interessant als praxisrelevant Median nach Blum Idee Blum, Floyd, Pratt, Rivest, Tarjan 1973: Garantiert schnell guter Pivot! • Deterministisch einen guten Pivot finden und trotzdem lineare Laufzeit • Eher theoretisch interessant als praxisrelevant 1. Fünfergruppen bilden Median nach Blum Idee Blum, Floyd, Pratt, Rivest, Tarjan 1973: Garantiert schnell guter Pivot! • Deterministisch einen guten Pivot finden und trotzdem lineare Laufzeit • Eher theoretisch interessant als praxisrelevant 2. Median pro Gruppe Median nach Blum Idee Blum, Floyd, Pratt, Rivest, Tarjan 1973: Garantiert schnell guter Pivot! • Deterministisch einen guten Pivot finden und trotzdem lineare Laufzeit • Eher theoretisch interessant als praxisrelevant 3. Gruppenmediane sammeln Median nach Blum Idee Blum, Floyd, Pratt, Rivest, Tarjan 1973: Garantiert schnell guter Pivot! • Deterministisch einen guten Pivot finden und trotzdem lineare Laufzeit • Eher theoretisch interessant als praxisrelevant 4. Median der Gruppenmediane bestimmen Wie machen wir das? Median nach Blum Idee Blum, Floyd, Pratt, Rivest, Tarjan 1973: Garantiert schnell guter Pivot! • Deterministisch einen guten Pivot finden und trotzdem lineare Laufzeit • Eher theoretisch interessant als praxisrelevant 5. Das ist unser Pivot! Median nach Blum Pseudocode Algorithmus von Blum mit Eingabe (A, i) • Bilde beliebige Fünfergruppen aus den Elementen in A, !n" • Bestimme in jeder Fünfergruppe den Median direkt/naiv 5 viele • Sammle alle Fünfergruppenmediane in A‘ • Bestimme p, den Median der Fünfergruppenmediane ! "# $ %& n 1 ′ → Blum A , · Rekursion! 5 2 • Teile A mit p in A1 und A2 auf Rekursion! • Rekursion auf dem Rest → Blum (A1 , i) oder Blum (A2 , i − r − 1) Median nach Blum Pseudocode Algorithmus von Blum mit Eingabe (A, i) • Basisfall: Falls n ≤ n0 = 100, berechne das i-te Element ! n " naiv • Bilde beliebige Fünfergruppen aus den Elementen in A, viele 5 • Bestimme in jeder Fünfergruppe den Median direkt/naiv • Sammle alle Fünfergruppenmediane in A‘ • Bestimme p, den Median der Fünfergruppenmediane ! "# $ %& n 1 ′ → Blum A , · 5 2 • Teile A mit p in A1 und A2 auf • Rekursion auf dem Rest → Blum (A1 , i) oder Blum (A2 , i − r − 1) Median nach Blum Pseudocode Algorithmus von Blum mit Eingabe (A, i) • Basisfall: Falls n ≤ 100, berechne das i-te Element naiv! " n • Bilde beliebige Fünfergruppen aus den Elementen in A, viele 5 • Bestimme in jeder Fünfergruppe den Median direkt/naiv • Sammle alle Fünfergruppenmediane in A‘ • Bestimme p, den Median der Fünfergruppenmediane ! "# $ %& n 1 ′ → Blum A , · 5 2 • Teile A mit p in A1 und A2 auf • Rekursion auf dem Rest → Blum (A1 , i) oder Blum (A2 , i − r − 1) Median nach Blum 1. Rekursion: A‘ Visualisierung Median nach Blum 1. Rekursion: A‘ Basisfall: n≤5 Visualisierung Median nach Blum 1. Rekursion: A‘ Basisfall: n≤5 Pivotieren in A‘ Visualisierung Median nach Blum 1. Rekursion: A‘ Basisfall: n≤5 Pivotieren in A‘ Visualisierung Median nach Blum 1. Rekursion: A‘ Basisfall: n≤5 Pivotieren in A‘ Basisfall: n≤5 Visualisierung Median nach Blum 1. Rekursion: A‘ Basisfall: n≤5 Pivotieren in A‘ Basisfall: n≤5 Visualisierung Median nach Blum Visualisierung Median nach Blum Visualisierung 2. Rekursion: A1, i Median nach Blum Visualisierung 2. Rekursion: A1, i Median nach Blum Visualisierung 2. Rekursion: A1, i Basisfall: n≤5 und so weiter... Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? Wo liegt der Median der Mediane? Gedankenexperiment: • Sortiere innerhalb der Gruppen • Sortiere die Gruppen nach Gruppenmedian Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? Wo liegt der Median der Mediane? Gedankenexperiment: • Sortiere innerhalb der Gruppen • Sortiere die Gruppen nach Gruppenmedian Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? Wo liegt der Median der Mediane? Gedankenexperiment: • Sortiere innerhalb der Gruppen • Sortiere die Gruppen nach Gruppenmedian Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? innerhalb der Gruppe aufsteigend Wo liegt der Median der Mediane? Gedankenexperiment: • Sortiere innerhalb der Gruppen • Sortiere die Gruppen nach Gruppenmedian Gruppenmediane aufsteigend Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? grosse Elemente in der Gruppe auf jeder Seite mindestens kleine Elemente in der Gruppe kleine Mediane grosse Mediane Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? grosse Elemente in der Gruppe ≤ ≥ auf jeder Seite mindestens kleine Elemente in der Gruppe kleine Mediane grosse Mediane Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? ≥ ≤ Auf jeder Seite mindestens !" # $% & 1 n 3 −2 2 5 3 ≥ n − 6 Elemente. 10 Zweiter rekursiver Aufruf ! " 7 mit höchstens n+6 10 Elementen. Median nach Blum Analyse T(n) Algorithmus von Blum mit Eingabe (A, i) O(1) • Basisfall: Falls n ≤ n0 = 100, berechne das i-te Element! naiv " n • Bilde beliebige Fünfergruppen aus den Elementen in A, vieleO(n) 5 • Bestimme in jeder Fünfergruppe den Median direkt/naiv O(n) • Sammle alle Fünfergruppenmediane in A‘ • Bestimme p, den Median der Fünfergruppenmediane ! "# $ %& n 1 ′ → Blum A , · 5 2 • Teile A mit p in A1 und A2 auf T O(n) !" n #$ 5 O(n) !" #$ 7n T +6 r − 1) • Rekursion auf dem Rest → Blum (A1 , i) oder Blum (A2 , i −10 Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? Zu zeigen: T(n) c · n für konstantes c Induktionsbeweis • Induktionsanfang: wähle c so gross, dass T(n) c · n für alle n • Induktionsannahme: für alle i < n gilt bereits T(i) • Induktionsschritt: T(n) T n 5 +T 7n +6 10 +d·n c · i. n0 . Median nach Blum Analyse Funktioniert das wirklich? Ist der Pivot gut? Die Laufzeit linear? T(n) T n 5 +T n c· +c+c· 5 Nun wählen wir c T(n) 7n n 7n +6 +d·n=c· +c· +6 +d·n 10 5 10 7n 9 +6 +c+d·n= · c · n + 8c + d · n 10 10 80 · d und fahren fort mit 72 1 73 · c · n + 8c + · c ·n = · c · n + 8c = 80 80 80 d 73 · n + 8 ·c 80 n, da n 100 c·n Median nach Blum Varianten Warum genau Fünfergruppen? Vierergruppen Dreiergruppen T(n) n T +T 3 / O(n) Sechsergruppen 4n 6 T(n) n T +T 4 / O(n) 6n 8 T(n) n T +T 6 O(n) Ab fünf funktionieren alle Gruppengrössen (auf Kosten von n0). 9n 12 Auswahlproblem Überblick 2 1. Lösung: Wiederholt das Minimum entfernen O(i · n) 2. Lösung: Sortieren und A[i] ausgeben O(n log n) 3. Lösung: Quickselect mit zufälligem Pivot erwartet O(n) 4. Lösung: Median nach Blum immer O(n) O(n ) A ε·n p Pivot irgendwo hier ε·n