Datenstrukturen und Algorithmen FS 2016

Werbung
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
Herunterladen