Modul: Algorithmen und Berechenbarkeit WS2013/14

Werbung
Modul: Algorithmen und Berechenbarkeit
WS 2013/14
Volker Diekert1
29. Januar 2014
1
Übungen: Tobias Walter
1 / 370
1. Vorlesung am 14.10.2013
Teil 1: Algorithmen
2 / 370
Landau-Symbole-Oh-oh
Definition:
◮
O(f)
Es gilt g ∈ O(f ), falls
∃c > 0 ∃n0 ∀n ≥ n0 : g (n) ≤ c · f (n).
Also: g wächst nicht schneller als f .
◮
o(f)
Es gilt g ∈ o(f ), falls
∀c > 0 ∃n0 ∀n ≥ n0 : g (n) ≤ c · f (n).
Also: g wächst echt langsamer als f .
3 / 370
Landau-Symbole-Omega-Theta
◮
Ω(f)
g ∈ Ω(f ) ⇔ f ∈ O(g )
Also: g wächst mindestens so schnell wie f .
◮
ω(f)
g ∈ ω(f ) ⇔ f ∈ o(g )
Also: g wächst echt schneller als f .
◮
Θ(f)
g ∈ Θ(f ) ⇔ (f ∈ O(g ) ∧ g ∈ O(f ))
Dies heißt, g und f wachsen asymptotisch gleichschnell.
4 / 370
Reale Rechenzeiten - früher
Eine Eingabe der Länge n werde linear in n Millisekunden verarbeitet.
(Aus dem Buch von Aho, Hopcroft, Ullman, 1974)
Algorithmus
n
n log(n)
n2
n3
2n
1 Minute
Rechenzeit
60.000
4.893
244
39
15
1 Stunde
Rechenzeit
3.6 ∗ 106
200.000
1.897
153
21
Wachstum bei 10-facher
Beschleunigung
∗10
∗10
√ (für große Werte)
∗√10 (ca. 3.16)
∗ 3 10 (ca. 2.15)
+ log2 (10) (ca. 3.3)
Je schneller der Rechner, desto wichtiger sind effiziente
Algorithmen!
5 / 370
Reale Rechenzeiten - heute?
Es wird hier angenommen, dass ein linearer Algorithmus eine Eingabe
der Länge n in n Mikrosekunden verarbeitet:
Algorithmus
n
n log(n)
n2
n3
2n
1 Minute
Rechenzeit
1 Stunde
Rechenzeit
6, 0 · 107
2, 8 · 106
7.746
391
26
3, 6 · 109
1, 3 · 108
60.000
1.533
32
Wachstum bei 10-facher
Beschleunigung
∗10
∗10
√ (für große Werte)
∗√10 (ca. 3,16)
∗ 3 10 (ca. 2,15)
+ log2 (10) (ca. 3,32)
Heute immer noch: Je schneller der Rechner, desto mehr
lohnen sich effiziente Algorithmen!
6 / 370
Reale Rechenzeiten
Vergleich (1 Operation = 1 ms) vs. (1 Operation = 1 µs)
Algorithmus
n
n log(n)
n2
n3
2n
1 Minute Rechenzeit
1 OP=1 ms
1 OP=1 µs
6, 0 · 104
4.893
244
39
15
6, 0 · 107
2, 8 · 106
7.746
391
26
1 Stunde Rechenzeit
1 OP=1 ms
1 OP=1 µs
3, 6 · 106
2, 0 · 105
1.897
153
21
3, 6 · 109
1, 3 · 108
60.000
1.533
32
10-fache
Beschl.
∗ 10
∼√∗ 10
∗√10
∗ 3 10
+ log2 (10)
7 / 370
Komplexitätsmaße
◮
Komplexität im ungünstigsten Fall (worst case).
◮
Komplexität im Mittel (average case) benötigt eine
Wahrscheinlichkeitsverteilung der Eingabe.
Mittlerer Zeitbedarf:
tA,Mittel (n) = E (tA (x), |x| = n)
Dabei sei E (tA (x), |x| = n) der bedingte Erwartungswert von
tA (x) unter der Bedingung |x| = n
8 / 370
Beispiel: Quicksort
Beim Quicksort-Algorithmus ist die Anzahl der Vergleiche im
ungünstigsten Fall tQ (n) ∈ Θ(n2 ).
Mittlerer Zeitbedarf: tA,Mittel (n) = 1.38n log n
9 / 370
Durchschnittsanalyse
Die Durchschnittskomplexitätsanalyse ist oft schwierig.
Gleichverteilung der Eingaben gleicher Länge:
tA,Mittel (n) =
1 X
tA (x)
|Xn |
x∈Xn
mit
Xn := {x ∈ X | |x| = n}
Sinnvoll?
10 / 370
Beispiel binäre Suchbäume
Beispiel 2.1
Gleichverteilung bei binären Suchbäumen:
1 2n
Es gibt n+1
n (= (n + 1)-te Catalansche Zahl) verschiedene
Binärbäume mit n Knoten.
2n
4n
∼√
n
πn
n! ∼
√
2πn
n n
e
√
Gleichverteilung: Mittlere Baumhöhe ist ungefähr n.
Realistischer: eine Verteilung auf der Menge der binären Suchbäume,
die sich durch eine Gleichverteilung von Permutationen ergibt.
Damit: Mittlere Baumhöhe Θ(log(n)). 1 2n
n! wächst wesentlich schneller als n+1
n
11 / 370
Maschinenmodelle: Turingmaschine
Die Turingmaschine (TM) ist ein mathematisch leicht exakt
beschreibbares Berechnungsmodell. Allerdings ist der zeitraubende
Speicherzugriff (Bandzugriff) in der Realität nicht gegeben.
Arbeitet ein Algorithmus auf einer TM schnell, so ist er schnell!
12 / 370
Maschinenmodelle: Registermaschine
x1 x2 x3 x4 x5 x6 x7 x8 x9
.
.
.
Eingabe READ ONLY
Speicher
RAM
0 = Akku
1 = 1.Reg
2 = 2.Reg
3 = 3.Reg
4 = 4.Reg
IC
✲
.
Programm
.
.
y1 y2 y3 y4 y5 y6 y7 y8 y9
.
.
.
Ausgabe WRITE ONLY
13 / 370
Untere Schranken / Beispiel Sortieren
Einer der schwierigen Aspekte der Algorithmentheorie ist die Suche
nach unteren Schranken.
Satz 2.2 (Sortieralgorithmen)
Jeder Sortieralgorithmus, der ausschließlich auf Schlüsselvergleichen
basiert, benötigt Ω(n log n) Vergleiche.
Beweis: Wir fassen Sortieralgorithmen als Entscheidungsbäume auf,
d.h. als Binärbäume, deren inneren Knoten mit Vergleichen der Art
gilt x[i ] < x[j]?“ beschriftet sind. Es gibt n! Permutationen von n
”
Elementen. Fasst man jede Permutation als einen Pfad durch einen
Entscheidungsbaum auf, so muss dieser mindestens n! Blätter haben.
Jeder binäre Baum mit n! Blättern hat eine Mindesthöhe von
log(n!) ∈ Ω(n log(n)). Die Höhe des Entscheidungsbaums entspricht
aber dem Zeitaufwand des Algorithmus.
14 / 370
Beispiel Zwei gleiche Zahlen in einem Feld“
”
Sei ein Feld a[1...n] gegeben. Frage: existiert i 6= j mit a[i ] = a[j]?
Satz 2.3 (Zwei gleiche Zahlen in einem Feld)
Jeder vergleichsbasierte Algorithmus, der die Existenz von zwei
gleichen Zahlen in einem Feld überprüft, benötigt Ω(n log(n))
Vergleiche.
15 / 370
Heiratssätze
Abbildung : Die Sympathie-Beziehungen zwischen den Herren und Damen.
16 / 370
Nobelpreis für Wirtschaftswissenschaften 2012
Laureaten waren US-Amerikaner Alvin E. Roth und Lloyd S. Shapley.
Es wurde ihr Beitrag zur Theorie stabiler Zuordnungen und zur
Gestaltung ganz bestimmter Märkte gewürdigt.
Aus der Laudatio: The Gale-Shapley algorithm Analysis of allocation
mechanisms relies on a rather abstract idea. If rational people – who
know their best interests and behave accordingly – simply engage in
unrestricted mutual trade, then the outcome should be efficient. If it
is not, some individuals would devise new trades that made them
better off. An allocation where no individuals perceive any gains from
further trade is called stable. The notion of stability is a central
concept in cooperative game theory, an abstract area of mathematical
economics which seeks to determine how any constellation of rational
individuals might cooperatively choose an allocation. The primary
architect of this branch of game theory was Lloyd Shapley, who
developed its main concepts in the 1950s and 1960s.
17 / 370
Stabile Heirat
Es seien A und B Mengen von je n Personen. Ohne Einschränkung
seien A die Frauen und B die Männer. Jede Person hat eine
Präferenzliste der Personen vom anderen Geschlecht. Für a ∈ A
können wir uns die Präferenzliste P(a) als eine lineare Ordnung
b1 > · · · > bn mit B = { b1 , . . . , bn } vorstellen. Wenn bi in der
Ordnung vor bj steht, also i < j gilt, so bevorzugt a den Mann bi .
Analog verfügt jeder Mann b ∈ B über eine Präferenzliste P(b).
Treffen eine Frau a und ein Mann b aufeinander und ziehen diese
beiden Personen wechselseitig vor ihren augenblicklichen Partnern vor,
so tun sie sich zusammen, auch wenn es Scheidungen kommt.
Die Heirat (oder das Matching M) heißt stabil, wenn es zu keinen
Scheidungen kommt.
18 / 370
Scheidungen und stabile Heirat
Es kommt zu einer Scheidung, wenn es zwei Paare (a, b ′ ), (a′ , b) gibt
mit b > b ′ in der Präferenz von a und a > a′ in der Präferenz von b.
Dann lassen sich nämlich a und b scheiden und bilden ein neues Paar
(a, b).
19 / 370
Vermeidung von Scheidungen: Gale, Shapley 1962
Satz 3.1 (Gale, Shapley 1962)
Eine stabile Heirat existiert und kann in maximal n2 Runden wie folgt
berechnet werden.
1. Zu Anfang ist niemand verlobt oder verheiratet.
2. Solange noch ein unverlobter Mann b ∈ B existiert, macht er der
Dame a ∈ A einen Antrag, die in der Präferenzliste am weitesten
vorne unter den noch nicht gefragten Frauen steht.
3. Die Frau nimmt den Antrag und verlobt sich mit ihm, wenn sie
noch keinen Partner hat, oder sie den Antragsteller b ihrem
derzeitig Verlobten vorzieht. Gegebenenfalls wird also eine
Verlobung gelöst, um eine andere einzugehen.
4. Sind alle Männer verlobt, so heiraten die Verlobten
untereinander. Dies ist die stabile Heirat.
20 / 370
Zwei Paare
Bevor wir in den Beweis einsteigen wollen wir die Situation von zwei
Paaren analysieren. Es gibt also zwei Frauen a, a′ und zwei Männer
b, b ′ . Haben beide Frauen ihre Präferenz für b, so ist b in der guten
Position, dass er sich seine Partnerin frei wählen kann. Sagen wir, er
wählt a. Der Mann b ′ kann Glück haben, dass a′ seine Favoritin ist,
aber a′ hat sicher nur die zweite Wahl getroffen. Haben die Männer
identische Präferenzen, so ist die Situation symmetrisch. Interessanter
ist, wenn sich die Präferenzen jeweils überkreuzen. Sagen wir a hat als
Favorit b und a′ hat als Favorit b ′ . Ist a auch die erste Wahl von b
oder ist a′ auch die erste Wahl von b ′ , so ist die Paarbildung
(a, b), (a′ , b ′ ) stabil und die einzige Möglichkeit einer stabilen Heirat.
Es verbleibt der Fall, dass a′ die erste Wahl von b und a die erste Wahl
von b ′ . Jetzt kommt es entscheidend darauf an, wer die Anträge stellt.
Beide Paarbildungen (a, b), (a′ , b ′ ) und (a, b ′ ), (a′ , b) stabil. Stellen
also die Männer die Anträge, so setzen sich Ihre Präferenzen durch.
Dies ist die Paarbildung (a, b ′ ), (a′ , b), stellen die Frauen die Anträge,
so setzen sie sich durch. Die Paarbildung ist dann (a, b), (a′ , b ′ ).
21 / 370
Der Gale-Shapley-Algorithmus berechnet eine stabile Heirat
Da es mindestens so viele Frauen wie Männer gibt, sind am Ende alle
Männer verheiratet. Wegen |A| = |B| = n sind also alle Personen
verheiratet.
Angenommen, diese Heirat wäre nicht stabil. Dann gibt es zwei Paare
(a, b) und (a′ , b ′ ), wobei b die Frau a′ der aktuellen Partnerin a
vorzieht. Dann hatte jedoch a′ vor der Verlobung von b und a
entweder einen Antrag von b abgelehnt oder b verlassen. Der Grund
hierfür war ein Mann b ′′ für den sie eine höhere Präferenz hat als für
b. Da sich Frauen im Verlaufe des Verfahrens nur verbessern, ist die
Präferenz auch von ihrem aktuellen Partner b ′ in jedem Fall höher als
für b.
Damit kann es zu keiner Scheidung kommen und das Verfahren ist
stabil.
22 / 370
Das Verfahren ist für die Antragsteller optimal
Behauptung: Die Männer erhalten jeweils die Partnerin, die die
höchste Präferenz unter allen Frauen hat, mit denen überhaupt eine
stabile Paarbildung möglich ist.
Dabei kommt es nicht auf die Reihenfolge der Anträge an. Die
Männer können sich sogar Zeit lassen.
Dies ändert sich, wenn Frauen ihre Präferenzen nur partiell geordnet
haben. Dann ist es wichtig, wer zu erst den Antrag stellt.
23 / 370
Beweis der Behauptung
Wir sagen, dass ein Paar (a, b) ∈ A × B instabil ist, wenn (a, b) in
keiner stabilen Heirat vorkommt.
Wir beweisen, hat a im Gale-Shapley-Verfahren einen Antrag von b
abgelehnt oder b verlassen. Dann ist das Paar (a, b) instabil.
Beweis: Betrachte die zeitlich erste Situation, in der eine Frau a einen
Mann b ablehnt oder verlässt, obwohl das Paar (a, b) in einer stabilen
Heirat M realisierbar ist.
Der Grund ist beiden Fällen ein Mann b ′ für den die Präferenz von a
höher ist. Es kann sein, dass b ′ von anderen Frauen Absagen erhielt
oder verlassen worden ist. Aber keine dieser Partnerschaften liegt in
M, denn das erste realisierbare Paar wird nach Annahme ist (a, b).
Wegen (a, b) ∈ M ist (a, b ′ ) ∈
/ M. Daher gilt a > a′ aus Sicht von b ′ .
Treffen also (a, b), (a′ , b ′ ) aufeinander, so verlassen a und b ′ ihre
Partner und bilden ein neues Paar (a, b ′ ).
24 / 370
Literatur etwa zum stabilen Matching findet sich leicht, etwa:
http://www.cs.princeton.edu/~wayne/kleinberg-tardos
Wiederholungen, Ergänzungen, Fragen, Ausblick.
Mathematische Definitionen: Graphen
25 / 370
Lösung einfacher Rekursionsgleichungen
Satz 3.2
Seien a, b ∈ N und b > 1, g : N → N und es gelte die
Rekursionsgleichung:
t(1) = g (1)
t(n) = a · t(n/b) + g (n)
Dann gilt für n = b k (d.h. für k = logb (n)):
t(n) =
k
X
i =0
ai · g
n
bi
.
26 / 370
Beweis des Satzes
k = 0 : Es gilt n =b 0 =
und t(1) = g(1).
P1k−1
n
k > 0 : Daher t b = i =0 ai · g bin+1 mit Induktion,
also t(n) = a · t
= a
n
b
k−1
X
i =0
=
=
k
X
i =1
k
X
i =0
+ g (n)
!
n ai · g
+ g (n)
b i +1
ai · g
ai · g
n
bi
n
bi
+ a0 g
n
b0
.
27 / 370
Mastertheorem I
Korollar 3.3 (Mastertheorem I)
Seien a, b ∈ N, mit b > 1 und es gelte die Rekursionsgleichung:
t(n) ∈ a · t(n/b) + Θ(nc )
Dann gilt:
Bemerkung:

c

; falls a < b c
 Θ(n )
Θ(nc log n) ; falls a = b c
t(n) ∈
log a

 Θ(n log
b)
; falls a > b c
log a
log b
= logb a. Falls a > b c , so ist logb a > c.
28 / 370
Beweis Mastertheorem I
Sei g (n) = nc . Damit ist t(n) = nc ·
1. Fall a < b c : t(n) ≤ nc ·
Pk
a i
i =0 ( bc )
nach dem Satz.
∞ X
a i
1
= nc ·
∈ O(nc ).
bc
1 − bac
i =0
Außerdem gilt t(n) ∈ Ω(nc ). Hieraus folgt t(n) ∈ Θ(nc ).
2. Fall a = b c : t(n) = (k + 1) · nc ∈ Θ(nc log n).
29 / 370
Beweis Mastertheorem I
3. Fall a > b c :
k a k+1
X
−1
a i
c ( bc )
=
n
·
a
c
b
bc − 1
i =0
a logb (n) Θ nc · c
b
!
nc · alogb (n)
Θ
b c logb (n)
Θ alogb (n) = Θ b logb (a)·logb (n)
Θ nlogb (a)
t(n) = nc ·
∈
=
=
=
30 / 370
Beispiel Mergesort
Algorithmus 3.1 Mergesort
procedure mergesort(l , r )
var m : integer;
begin
if (l < r ) then
m := (r + l ) div 2;
mergesort(l , m);
mergesort(m + 1, r );
mische(l , m, r );
endif
endprocedure
31 / 370
Mastertheorem II
Satz 3.4 (Mastertheorem II)
Sei r > 0,
Pr
i =0 αi
< 1 und für eine Konstante c sei
!
r
X
t(⌈αi n⌉) + c · n
t(n) ≤
i =0
Dann gilt t(n) ∈ O(n).
32 / 370
Beweis Mastertheorem II
Wähle ein ε und ein n0 > 0 so, dass
α
Pi nr 0 ≤ n0 − 1 und
Pr dass
i =0 ⌈αi n⌉ ≤ ( i =0 αi ) · n + r + 1 ≤ (1 − ε)n für alle n ≥ n0 .
Wähle ein γ so, dass c ≤ γε und t(n) ≤ γn für alle n < n0 .
Für den Induktionsschritt (n ≥ n0 ) gilt:
!
r
X
t(⌈αi n⌉) + cn
t(n) ≤
≤
i =0
r
X
i =0
!
γ⌈αi n⌉
+ cn
(mit Induktion)
≤ (γ(1 − ε) + c)n
≤ γn
33 / 370
Aufgabe aus der Scheinklausur 2014
Seien α > 1 und k ∈ N so gewählt, dass 0 ≤ p(n) ≤ nk , 0 < t(0) und
t(n) = αt(n − 1) + p(n) für alle n ≥ 1. Dann gilt
t(n) ∈ Θ(αn ).
Lösung:
Schreibe t(n) = f (n)αn für eine Funktion f (n) > 0. Für n ≥ 1 gilt:
t(n) = f (n)αn = αf (n − 1)αn−1 + p(n).
f (n) = f (n − 1) + p(n)/αn ≥ t(0).
Also gilt t(n) ∈ Ω(αn ).
Wegen α > 1 folgt ferner
f (n) ≤
X
i ≥0
i k /αi ∈ O(1).
Dies zeigt t(n) ∈ O(αn ). Zusammen erhalten wir t(n) ∈ Θ(αn ).
34 / 370
3. Vorlesung, 22.10.2013
Teile und Beherrsche – Divide and Conquer – Divide et impera
Beispiele für Divide and Conquer2 :
◮ Quicksort
◮ Mergesort
◮ Multiplikation ganzer Zahlen (Karatsuba 1960)
◮ Matrixmultiplikation (Strassen 1969)
2
Römisches Herrschaftsprinzip, auch von Machiavelli vorgeschlagen
35 / 370
Multiplikation ganzer Zahlen
Schulmäßige Multiplikation von zwei Binärzahlen der Länge n
erfordert O(n2 ) Operationen.
Teile und Beherrsche:
r =
A
B
s =
C
D
Dabei sind A (C ) die ersten und B (D) die letzten k Bits von r (s).
r = A 2k + B;
s = C 2k + D
r s = A C 22k + (A D + B C ) 2k + B D
Mastertheorem I sagt tmult-ng (n) = 4 · tmult-ng (n/2) + O(n) ∈ O(n2 )
Nichts gewonnen!
36 / 370
Multiplikation ganzer Zahlen
Berechne stattdessen besser rekursiv AC , (A − B)(D − C ) und BD.
Aufwand: 3 · tmult (n/2) + O(n)
rs = A C 22k + (A − B) (D − C ) 2k + (B D + A C ) 2k + B D
Mastertheorem I sagt:
log 3
tmult (n) = 3 · tmult (n/2) + O(n) ∈ O(n log 2 ) = O(n1.58496... ).
Wir haben also durch den Teile-und-Beherrsche Ansatz den
Exponenten des naiven Ansatzes von 2 auf 1.58496... heruntergesetzt.
37 / 370
Schnelle Multiplikation
Nach einem Verfahren von Schönhage-Strassen (diskrete FFT in
geeigneten Restklassenringen) lassen sich zwei Binärzahlen in der Zeit
O(n log n log log n) multiplizieren.
2007: Der log log n-Term lässt sich nach Martin Fürer noch weiter
∗
verkleinern. Wissen heute O(n log n 2log n ) mit log∗ n ≤ 5 für alle
denkbaren“ Werte.
”
38 / 370
Matrixmultiplikation mittels Teile und Beherrsche“
”
Die übliche Multiplikation
zweier n × n Matrizen
P
(ai ,j ) (bi ,j ) = ( nk=1 ai ,k bk,j ) erfordert O(n3 ) skalare Multiplikationen.
Divide-and-Conquer: A, B werden in 4 gleichgroße Untermatrizen
unterteilt, wobei sich das Produkt AB = C wie folgt darstellen lässt:
A11
A12
B11
B12
C11
C12
=
A21
A22
B21
B22
C21
C22
39 / 370
Matrixmultiplikation naiver Divide-and-Conquer
A11
A21
A12
A22
B11
B21
B12
B22
=
C11
C21
C12
C22
Dabei ergeben sich folgende Beziehungen:
C11 = A11 B11 + A12 B21
C12 = A11 B12 + A12 B22
C21 = A21 B11 + A22 B21
C22 = A21 B12 + A22 B22
Also:
t(n) ∈ 8 · t(n/2) + Θ(n2 ) ∈ Θ(n3 )
Keine Verbesserung gegenüber dem Standardverfahren!
40 / 370
Matrixmultiplikation nach Strassen
Berechne das Produkt von 2 × 2 Matrizen mit 7 Multiplikationen:
M1
:=
M2
:=
(A12 − A22 )(B21 + B22 )
M1 + M2 − M4 + M6
C11
=
(A11 + A22 )(B11 + B22 )
C12
=
M4 + M5
(A11 − A21 )(B11 + B12 )
C21
=
M6 + M7
C22
=
M2 − M3 + M5 − M7
M3
:=
M4
:=
(A11 + A12 )B22
M5
:=
M6
:=
A11 (B12 − B22 )
M7
:=
A22 (B21 − B11 )
(A21 + A22 )B11
Laufzeit: t(n) ∈ 7t(n/2) + Θ(n2 ).
Mastertheorem I mit a = 7, b = 2, c = 2 liefert:
t(n) ∈ Θ(nlog2 7 ) = Θ(n2,81... )
41 / 370
Bemerkungen zur Matrixmultiplikation
Die Strassen-Arbeit war 1969 ein theoretischer Durchbruch, da
erstmals die n3 -Schranke unterboten wurde.
Praktisch wird der Strassen-Algorithmus, wenn überhaupt, nur bei
sehr großen Matrizen eingesetzt.
Der Coppersmith–Winograd-Algorithmus eine bessere theoretische
Schranke.
Beste bekannte Schranke 2012: O(n2,3727 ).
42 / 370
4. Vorlesung, 28.10.13
Probabilistische Verfahren
43 / 370
Probabilistische Verifikation der Matrixmultiplikation
Wir betrachten n × n Matrizen A = (aij ), B = (bij ), C = (cij ) mit
Koeffizienten in einem Halbring R wie etwa R = N, Z, Q, R, C oder
der boolesche Halbring B = { 0, 1 } = { ⊥, ⊤ }. Der Halbring R muss
nicht kommutativ sein, soll jedoch 0 6= 1 enthalten.
Es gilt
n
X
A·B =(
aik bkj ).
k=1
O(n2 )
Wir wollen in der Zeit
(genauer: mit O(n2 ) arithmetischen
Operationen) sehr sicher entscheiden können, ob A · B = C gilt.
44 / 370
Monte Carlo und Las Vegas Algorithem
Von Nord nach Süd: von Kogula (59. Breite) über Monte Carlo
(43. Breite) und Las Vegas (36. Breite) nach Tel Aviv (32. Breite)
Tabelle : Übersicht
korrekt
meistens korrekt
korrekt
meistens korrekt
gute Laufzeit
gute Laufzeit
meistens gute Laufzeit
meistens gute Laufzeit
Kogula: kleiner Ort in Estland
Monte Carlo: Mostly Correct
Las Vegas: Verified
C’est la vie
Typische Beispiele
1.
2.
3.
4.
Dijkstra-Algorithmus
Monte Carlo: Primzahlerkennung nach Rabin-Miller
Las Vegas: Quicksort
SAT-Solver
45 / 370
Monte-Carlo-Algorithmus von Rusin Freivalds (1977)
1. Wähle n mal zufällig und unabhängig ri ∈ { 0, 1 } und setze
r T = (r1 , . . . , rn ) ∈ { 0, 1 }n .
Also ist r ein Spaltenvektor, da r T Zeilenvektor.
P
2. Berechne s = (si ) = ( nk=1 bik rk ). Also s = B · r .
P
3. Berechne t = (ti ) = ( nk=1 aik sk ). Also t = A · s = A · B · r .
P
4. Berechne p = (pi ) = (ti − nk=1 cik rk ). Also p = (A · B − C ) · r .
5. Falls p 6= 0, dann A · B 6= C . Ansonsten Pr[A · B = C ] ≥ 1/2.
Beweis der letzten Zeile: Klar ist A · B = C =⇒ p = 0.
Sei also A · B − C = (dij ) und (i , j) fest gewählt mit dij 6= 0.
Es gilt
pi = dij rj +
X
dik rk = dij rj + y .
k6=j
46 / 370
Wahrscheinlichkeitsanalyse
Wegen
pi = dij rj +
X
k6=j
folgt
dik rk = dij rj + y und dij 6= 0
Pr[pi = 0] = Pr[pi = 0 ∧ y = 0] + Pr[pi = 0 ∧ y 6= 0]
= Pr[pi = 0 | y = 0] Pr[y = 0] + Pr[pi = 0 | y 6= 0] Pr[y 6= 0]
≤ Pr[ri = 0] Pr[y = 0] + Pr[ri = 1] Pr[y 6= 0]
= Pr[y = 0] /2 + Pr[y 6= 0] /2
= Pr[y = 0] /2 + (1 − Pr[y = 0])/2 = 1/2
Beachte, ist dij der einzige Nicht-Null-Eintrag, so folgt
Pr[pi = 0] = 1/2.
Durch k-fache Wiederholung kann die Fehlerwahrscheinlichtkeit unter
2−k gedrückt werden. Zeit: O(kn2 ).
47 / 370
Entwurfstrategien
Gierige Algorithmen – Greedy Algorithms
48 / 370
Optimalitätsprinzip
Greedy ( gierig“) bezeichnet Lösungsstrategien, die auf der
”
schrittweisen Berechnung von Teillösungen (lokalen Optima) basieren.
Dieses Verfahren eignet sich für Probleme, bei denen jede Teilfolge
einer optimalen Folge auch optimal ist (Optimalitätsprinzip).
49 / 370
Wiederholung aus DSAlg
Kürzeste Wege
Graph: G = (V , E , γ) mit
V die Knotenmenge,
E ⊆ V × V die gewichteten Kanten,
γ : E → N0 die Gewichtsfunktion.
Das Gewicht eines Pfades ist gleich der Summe der Kantengewichte.
Sei d(u, v ) für u, v ∈ V das Minimum der Gewichte aller Pfade von u
nach v (mit der üblichen Konvention, dass d(u, v ) = ∞ gilt, falls kein
Pfad von u nach v existiert).
Die Aufgabe ist es, bei gegebenen Graphen G und Knoten u ∈ V für
jedes v ∈ V einen Pfad
P u = u0 , u1 , u2 , . . . , un−1 , un = v mit
minimalem Gewicht ni=1 γ(ui −1 , ui ) = d(u, v ) zu bestimmen.
50 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
∞
1
6
3
8
2
13
4
∞
3
∞
6
∞
51 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
1
7
6
3
8
2
13
4
∞
3
∞
6
14
52 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
1
7
6
3
8
2
4
11
7
13
3
6
14
53 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
1
7
6
3
8
2
4
11
7
13
3
6
13
54 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
1
7
6
3
8
2
4
9
7
13
3
6
13
55 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
1
7
6
3
8
2
4
9
7
13
3
6
12
56 / 370
Beispiel Dijkstra-Algorithmus
Startknoten
0
1
3
1
7
6
3
8
2
4
9
7
13
3
6
12
57 / 370
Komplexität Dijkstra
Folgende Operationen werden benötigt:
insert
decrease-key
delete-min
Füge ein neues Element in R ein.
Verringere den Schlüsselwert eines Elements von R
(und erhalte die Eigenschaften des Datentyps R).
Suche ein Element mit minimalem Schlüsselwert
und entferne dieses aus R (und erhalte die Eigenschaften des Datentyps R).
58 / 370
Pseudocode und Komplexität vom Dijkstra-Algorithmus
Eingabe:
V = Knoten, E = Kanten, γ : E → N Gewicht
B := ∅; R := {u}; U := V \ {u}; v (u) := nil; D(u) := 0;
while (R 6= ∅) do
x := delete-min(R);
B := B ∪ {x};
forall (x, y ) ∈ E do
if y ∈ U then
U := U \ {y }; v (y ) := x; D(y ) := D(x) + γ(x, y );
insert(R, y , D(y ));
elsif D(x) + γ(x, y ) < D(y ) then
v (y ) := x; D(y ) := D(x) + γ(x, y );
decrease-key(R, y , D(y ));
endif
endfor
endwhile
59 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
∞
3
8
2
-13
4
∞
∞
3
6
∞
60 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
7
3
8
2
-13
4
∞
∞
3
6
∞
61 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
7
3
8
2
-13
4
11
7
3
6
∞
62 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
7
3
8
2
-13
4
11
7
3
6
13
63 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
7
3
8
2
-13
4
9
7
3
6
13
64 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
7
3
8
2
-13
4
9
7
3
6
12
65 / 370
Problem negativer Kantengewichte
Startknoten
0
1
1
6
3
7
3
8
2
-13
4
9
7
3
6
12
66 / 370
Problem negativer Kantengewichte
Startknoten
0
1
−∞
3
−∞
6
3
8
2
4
Negativer Zyklus
-13
7
−∞
3
6
−∞
67 / 370
Lösung: Bellman-Ford-Algorithmus
Wikipedia sagt:
Der Algorithmus von Bellman und Ford (nach seinen Erfindern
Richard Bellman und Lester Ford) dient der Berechnung der kürzesten
Wege ausgehend von einem Startknoten in einem kantengewichteten
Graphen. Anders als beim Algorithmus von Dijkstra, dürfen hier die
Gewichte der Kanten auch negativ sein. Kreise negativen Gewichtes,
die vom Startknoten aus erreichbar sind, müssen jedoch
ausgeschlossen werden, denn andernfalls könnten diese beliebig oft
durchlaufen und somit Wege immer geringeren Gewichts konstruiert
werden. Der Bellman-Ford-Algorithmus kann das Vorhandensein von
Kreisen negativen Gewichtes erkennen.
68 / 370
Minimale Aufspannende Bäume
Definition 5.1
Ein Graph G = (V , E ) heißt zusammenhängend, wenn je zwei Knoten
durch einen Pfad verbunden sind.
Definition 5.2
Ein Baum ist ein zusammenhängender, kreisfreier, ungerichteter
Graph.
Bemerkung 5.3
Jeder Baum mit n Knoten besitzt genau n − 1 Kanten.
Definition 5.4
Ein minimaler aufspannender Baum (MSB, engl. minimal spanning
tree, MST) zu einem gewichteten Graphen G = (V , E , γ) ist ein
Baum T P
= (V , T , γ|T ) mit T ⊆ E mit minimalem Gewicht
γ(T ) := e∈T γ(e).
69 / 370
Beispiel Prim-Algorithmus, 1
Startknoten
1
3
6
8
2
4
13
3
6
70 / 370
Beispiel Prim-Algorithmus, 2
Startknoten
1
3
6
8
2
4
13
3
6
71 / 370
Beispiel Prim-Algorithmus, 3
Startknoten
1
3
6
8
2
4
13
3
6
72 / 370
Beispiel Prim-Algorithmus, 4: Decrease Key
Startknoten
1
3
6
8
2
4
13
3
6
73 / 370
Beispiel Prim-Algorithmus, 5
Startknoten
1
3
6
8
2
4
13
3
6
74 / 370
Beispiel Prim-Algorithmus, 6
Startknoten
1
3
6
8
2
4
13
3
6
75 / 370
Beispiel Prim-Algorithmus, 7
Startknoten
1
3
6
8
2
4
13
3
6
76 / 370
Beispiel Prim-Algorithmus, 8
Startknoten
1
3
6
8
2
4
13
3
6
77 / 370
Beispiel Prim-Algorithmus, 9
Startknoten
1
3
6
8
2
4
13
3
6
78 / 370
Prim-Algorithmus
Eingabe:
V = Knoten, E = Kanten, γ : E → N Gewicht
Wähle ein x0 ∈ V ; B := {x0 }; R := ∅, U := V \ {x0 }; T := ∅;
forall (x0 , y ) ∈ E do
U := U \ {y }; v (y ) := x0 ; D(y ) := γ(x, y ); insert(R, y , D(y ))
endfor
while R 6= ∅ do
x := delete-min(R); B := B ∪ {x}; T := T ∪ {v (x)x};
forall (x, y ) ∈ E , y 6∈ B do
if y ∈ U then
U := U \ {y }; v (y ) := x; D(y ) := γ(x, y ); insert(R, y , D(y ));
elsif γ(x, y ) < D(y ) then
v (y ) := x; D(y ) := γ(x, y ); decrease-key(R, y , D(y ));
endif
endfor
endwhile
return T
79 / 370
Korrektheit des Prim-Algorithmus
Idee: Austauschsatz
Bi −1
y′
Ri −1
∈T
y
v (x)
6∈ T
x
80 / 370
Bemerkungen zum Dijkstra-und Algorithmus
1. Randverwaltung als Feld ergibt ein Aufwand von O(n2 ).
2. Für dünne Graphen (O(e) ⊆ o(n2 / log n)) ist es günstiger, den
Rand R in einer Prioritätswarteschlange (Heap) zu verwalten.
Der Aufwand des Algorithmus wird damit nach der obigen
Herleitung O(e log n + n log n) ⊆ O(e log n).
3. Bei Verwendung der Datenstruktur der Fibonacci-Heaps ergibt
sich ein Aufwand von O(e + n log n). (→ später)
4. Der Dijkstra-Algorithmus liefert für negative Kantengewichte
nicht nicht notwendigerweise ein korrektes Ergebnis.
5. Der Prim-Algorithmus liefert auch bei negativen
Kantengewichten ein korrektes Ergebnis.
81 / 370
Thema: Minimale Schnitte
Das Ziel ist die Berechnung eines Schnittes C mit minimalem Gewicht.
Der nachfolgende Algorithmus zur Berechnung eines minimalen
Schnittes stammt von Mechthild Stoer und Frank Wagner (1994).
Erschienen als Zeitschriftenversion in Journal of the ACM (1997)
585-591.
Der Stoer-Wagner-Algorithmus benutzt in n Runden jeweils eine
Unterprozedur, die genau dem Schema im Dijkstra- bzw.
Prim-Algorithmus entspricht.
82 / 370
Minimale Schnitte
Sei G = (V , E , γ) ein ungerichteter Graph
γ : V2 → N das Kantengewicht mit E = { vw | γ(vw ) > 0 }.
Ṡ
Ein Schnitt C = (C1 , C2 ) ist eine Partition: V = C1 C2 mit
6 C2 und C1 ∩ C2 = ∅ .
C1 6= ∅ =
Das Gewicht g (C ) von C ist die Summe der Gewichte der Kanten, die
die beiden Teilmengen trennen:
g (C ) =
X
γ(vw )
v ∈C1 ,w ∈C2
Ein s-t-Schnitt ist ein Schnitt (C1 , CP
2 ) mit s ∈ C1 und t ∈ C2 .
Für A ⊆ V , v ∈ V setze g (A, v ) = a∈A γ(av ).
Oder einheitlich:
X
g (A, B) =
γ(ab)
a∈A,b∈B
83 / 370
Bemerkungen
Setze g (G ) = min { g (C ) | C ist Schnitt }.
◮
g (G ) = 0 gdw. E = ∅ oder G ist nicht zusammenhängend.
Ab jetzt sei E 6= ∅ und G zusammenhängend.
◮
min { γ(e) | e ∈ E } ≤ g (G ) ≤ min { γ(V − x, x) | x ∈ V }
◮
Ab drei Knoten gilt
g (G ) ≤ min { γ(V − x, x) + γ(V − y , y ) − 2γ(xy ) | xy ∈ E }
84 / 370
Bemerkungen
Sei jetzt g (G ) = g (C ) für einen Schnitt C = (C1 , C2 ).
◮
Dann sind C1 und C2 zusammenhängend.
Sei e = xy ∈ E mit x ∈ C1 . Dann gibt es zwei Fälle:
1. Es ist auch y ∈ C1 .
Dann: g (G ) = g (G /(x = y )) (Kantenkontraktion).
2. Es ist y ∈ C2 .
Dann: γ(e) ≤ g (G ) ≤ g (G − e) + γ(e).
Denn die Schnitte (C1 , C2 ) von G und G − e sind identisch, nur ihr
Gewicht ist unterschiedlich.
Ist (C1 , C2 ) minimal für G − e mit x, y ∈ C1 , so ist dieser auch
minimal für G . Der zweite Fall ist klar.
85 / 370
Phasen
Der Algorithmus arbeitet in Phasen.
1) Berechne für zwei Punkte s, t ∈ V , s 6= t einen minimalen
s-t-Schnitt Cphase .
Achtung: Die Punkte s und t liegen vorher nicht fest!
2) Verschmelze s und t zu einem neuen Punkt {s, t}:
Die Kanten zwischen s und t werden gelöscht und für x ∈
/ {s, t} setzt
man γ({s, t}x) = γ(sx) + γ(tx).
Der neue Graph heiße G /(s = t).
3) Rekursion: Sei C ′ der rekursiv berechnete Schnitt in G /(s = t).
Dann ist C ′ ein minimaler Schnitt von G unter der Nebenbedingung,
dass C ′ die Knoten s und t nicht trennt.
Der minimale Schnitt ist das Minimum von g (Cphase ) und g (C ′ ).
86 / 370
Minimale s-t-Schnitte
Es kommt also im Wesentlichen darauf an, den minimalen s-t-Schnitt
für gewisse Knoten s, t ∈ V , s 6= t zu berechnen. Diese Phase verläuft
analog zum Dijkstra- bzw. Prim-Algorithmus.
Zu Beginn der Phase gelte B = {v1 } und R = V \ {v1 }. Die Knoten
aus B werden Baumknoten und die Knoten aus R Randknoten
genannt.
P
Für einen Randknoten v ∈ R sei stets g (v ) = x∈B γ(xv ).
(Gibt es keine Kante zwischen B und v , so hat diese Summe den
Wert Null. Damit ist der Wert g (v ) = γ(v1 v ) in der Zeit O(|R|) für
den Rand initialisiert.)
87 / 370
while |R| > 1 do
Zu Beginn jeder Schleife wird ein delete max ausgeführt. Dies
bestimmt einen Knoten v ∈ R mit g (v ) ≥ g (w ) ∀w ∈ R und entfernt
v aus R.
Es wird B um v ergänzt (v wird also ein Baumknoten) und die
Schlüsselwerte werden mit increase key vergrößert:
Für w ∈ R \ {v } setzt man g (w ) := g (w ) + γ(vw ). Eine Invariante
ist also
∀w ∈ R : g (w ) = g (B, w )
88 / 370
Termination
Die Schleife wird solange durchlaufen,
P bis der Rand nur noch einen
Knoten t enthält. Dann gilt g (t) = vt∈E γ(vt), d.h. g (t) ist die
Summe der Gewichte aller von t ausgehenden Kanten. Sei s der
Knoten, der unmittelbar vor t zum Baumknoten wurde. Dann
definiert die Zerlegung (V \ {t}, {t}) einen s-t-Schnitt Cphase mit
dem Gewicht g (t).
89 / 370
Korrektheitslemma
Lemma 6.1
Der Schnitt Cphase ist ein minimaler s-t-Schnitt im Eingabegraphen
der Phase.
Beweis:
Sei v1 , v2 , . . . , vn eine Anordnung der Knoten in der Reihenfolge, in
der sie zu Baumknoten wurden. Es gilt vn−1 = s, vn = t. Sei
C = (C1 , C2 ) ein minimaler s-t-Schnitt mit s ∈ C1 , t ∈ C2 .
Wir zeigen:
g (Cphase ) ≤ g (C )
90 / 370
g (Cphase) ≤ g (C )
In der Folge v1 , . . . , vn−1 , vn wird ein Knoten vi aktiv genannt, falls C
ein vi −1 -vi -Schnitt ist.
Da C ein s-t-Schnitt ist, ist insbesondere vn = t aktiv.
Sei vi aktiv; setze B(i ) = {v1 , . . . , vi −1 } und betrachte den durch
B(i ) ∪ {vi } induzierten Untergraphen. Durch Einschränkung definiert
C auf diesem Untergraphen einen Schnitt. Diesen bezeichnen wir mit
C (i ) und das Gewicht mit g (C (i )).
Da t = vn aktiv ist und g (Cphase ) = g (B(n), t) sowie C (n) = C
gelten, genügt es, die Behauptung g (B(i ), vi ) ≤ g (C (i )) für alle
aktiven Knoten vi zu zeigen.
Für den bzgl. der obigen Folge ersten aktiven Knoten vi gilt
g (B(i ), vi ) = g (C (i )), denn die durch C induzierte Partition ist
({v1 , . . . , vi −1 }, {vi }). Dies ist die Induktionsverankerung.
91 / 370
Fortsetzung: Beweis
Sei jetzt vi ein aktiver Knoten für den die Behauptung richtig ist und
vj der nächste auf vi folgende aktive Knoten. Dann gilt 1 < i < j ≤ n.
Zu zeigen ist: g (B(j), vj ) ≤ g (C (j)).
Es gilt zunächst:
g (B(j), vj ) = g (B(i ), vj ) + g ({vi , . . . , vj−1 }, vj )
Da der Knoten vi vor vj gewählt wurde, gilt g (B(i ), vj ) ≤ g (B(i ), vi )
und nach Induktion gilt g (B(i ), vi ) ≤ g (C (i )). Alle Kanten zwischen
{vi , . . . , vj−1 } und vj sind Schnittkanten und tragen somit zum
Gewicht von C (j) bei.
Daher
g (C (i )) + g ({vi , . . . , vj−1 }, vj ) ≤ g (C (j)), und
insgesamt g (B(j), vj ) ≤ g (C (j)).
92 / 370
Laufzeit Phase
In jeder Phase wird also ein minimaler s-t-Schnitt berechnet. Die
Laufzeitanalyse einer Phase ist identisch zum Prim-Algorithmus:
Wird der Rand R als ein Feld oder als eine Liste verwaltet, so ergibt
sich die Zeit n · O(n) + e · O(1) = O(n2 ).
Bei Verwendung eines Heaps erhalten wir
n · O(log n) + e · O(log n) = O(e log n).
Mit Fibonacci-Heaps ergibt die beste Abschätzung:
n · O(log n) + e · O(1) = O(e + n log n)
93 / 370
Gesamtlaufzeit
Nach jeder Phase wird der Graph durch Verschmelzen der beiden
Knoten s und t verkleinert. Dies ist eine O(n)-Operation. Das
Gewicht des jeweils aktuellen minimalen Schnittes ergibt sich in O(1)
durch einen direkten Gewichtsvergleich. Die Aktualisierung der
Partition (C1 , C2 ) kostet dann O(n) Schritte. Der Algorithmus
terminiert, wenn der Graph nur noch einen Punkt enthält, d. h., es
werden (n − 1) Phasen durchlaufen. Dies ergibt die Gesamtzeit O(n3 )
für Felder oder Listen, O(ne log n) für Heaps und O(ne + n2 log n) für
Fibonacci-Heaps.
94 / 370
Phase
Algorithmus 6.1
function Phase (G = (V , E , γ) || |V | ≥ 2; v1 ∈ V );
Die Ausgabe besteht aus zwei Knoten s, t mit dem Gewicht gphase
*)
var
B : Knotenmenge;
R : Knotenmenge;
s, t, v , w : V ;
begin
B := {v1 }; R := V \ {v1 };
forall v ∈ R do
g (v ) := γ(v1 v );
endfor
s := v1 ;
eines minimalen s-t-Schnittes.
(∗ Baumknoten ∗)
(∗ Randknoten ∗)
(∗ Initialisierungen ∗)
95 / 370
Berechnung eines minimalen Schnittes
Algorithmus 6.2 Fortsetzung
while |R| > 1 do
s := Knoten v ∈ R mit g (v ) ≥ g (w )∀w ∈ R;
R := R \ {s};
B := B ∪ {s};
forall sw ∈ E , w ∈ R do
g (w ) := g (w ) + γ(sw )
endfor
endwhile
t := der letzte Knoten in R
return (s, t, g (t))
endfunction
(∗ begin delete max ∗)
(∗ end delete max ∗)
(∗ increase key ∗)
96 / 370
Berechnung eines minimalen Schnittes
Algorithmus 6.3
function Min Cut( G = (V , E , γ), |V | ≥ 2)
(Partition C1 , C2 mit minimalem Schnitt g );
var
C1 , C2 : Knotenmenge;
(∗ Partition von V ∗)
s, t : V ; g , gphase : integer;
begin
wähle ein v1 ∈ V ; (s, t, gphase ) := Phase(G , v1 );
verschmelze s und t; der neue Graph sei G /(s = t);
if |V | = 2 then C1 := {s}; C2 := {t}; g := gphase ;
else (C1 , C2 , g ) := Min Cut (G /(s = t));
endif
(∗ Die Partition (C1 , C2 ) von G /(s = t) ist auch ein Schnitt von G . ∗)
97 / 370
Berechnung eines minimalen Schnittes
Algorithmus 6.4 Fortsetzung und Ende von Min Cut
if gphase ≤ g then
C1 := V \ {t};
C2 := {t};
g := gphase ;
endif
return (C1 , C2 , g )
endfunction
98 / 370
Beispiel: Berechnung eines minimalen Schnittes
2
1
3
2
5
3
2
2
3
6
2
1
4
3
4
2
7
2
3
8
Abbildung : Ein Graph G = (V , E ) mit Kantengewichten γ : E → N. Der
Startknoten ist Knoten 2.
99 / 370
Beispiel: Berechnung eines minimalen Schnittes
t
2
1
3
a
2
2
5
s
2
3
6
f
b
3
3
2
1
4
c
4
2
7
d
2
3
8
e
Abbildung : Der Graph nach der ersten Phase mit Startknoten 2. Die Knoten
wurden in der Reihenfolge a, b, c, d, e, f , s, t besucht. Der gefundene Schnitt
ist die Partition {1} , {2, 3, 4, 5, 6, 7, 8} mit Gewicht g = 5.
100 / 370
Beispiel: Berechnung eines minimalen Schnittes
a
2
4
1,5
b
2
3
6
c
d
3
3
2
1
4
c
4
2
7
s
2
3
8
t
Abbildung : Der Graph nach der zweiten Phase. Die Knoten wurden in der
Reihenfolge a, b, c, d, e, s, t besucht. Der gefundene Schnitt ist die Partition
{8} , {1, 2, 3, 4, 5, 6, 7} mit Gewicht g = 5.
101 / 370
Beispiel: Berechnung eines minimalen Schnittes
a
2
4
1,5
b
6
c
3
2
2
3
d
3
1
4
s
4
4
7,8
t
Abbildung : Nach der dritten Phase. Der gefundene Schnitt ist die Partition
{7, 8} , {1, 2, 3, 4, 5, 6} mit Gewicht g = 7.
102 / 370
Beispiel: Berechnung eines minimalen Schnittes
a
3
2
4
1,5
b
s
3
6
2
3
6
c
1
4,7,8
t
Abbildung : Nach der vierten Phase. Der gefundene Schnitt ist die Partition
{4, 7, 8} , {1, 2, 3, 5, 6} mit Gewicht g = 7.
103 / 370
Beispiel: Berechnung eines minimalen Schnittes
t
a
3
2
4
1,5
b
2
3
3,4,7,8
1
6
s
Abbildung : Nach der fünften Phase. Der gefundene Schnitt ist die Partition
{3, 4, 7, 8} , {1, 2, 5, 6} mit Gewicht g = 4.
104 / 370
Beispiel: Berechnung eines minimalen Schnittes
a
2
5
4
1,5
t
3
3,4,6,7,8
s
Abbildung : Nach der sechsten Phase. Der gefundene Schnitt ist die
Partition {1, 5} , {2, 3, 4, 6, 7, 8} mit Gewicht g = 7.
105 / 370
Beispiel: Berechnung eines minimalen Schnittes
s
2
9
V \2
t
Abbildung : Nach der siebten Phase. Der gefundene Schnitt ist die Partition
{2} , {1, 3, 4, 5, 6, 7, 8} mit Gewicht g = 9.
106 / 370
Übung: Wie verhält sich der Algorithmus bei negativen
Kantengewichten, bleibt er korrekt?
107 / 370
Antwort: siehe Übungen :-)
108 / 370
7. und 8. Vorlesung am 5. und 11.11.2013
Thema: Randomisierte Verfahren
◮
Las Vegas (Quicksort)
◮
Monte Carlo (Primzahlerkennung: Fermat bzw. Rabin-Miller,
Freivalds’ Verifikation der Matrixmultiplikation).
◮
Monte Carlo für minimale Schnitte nach David Karger und
Clifford Stein:
A New Approach to the Minimum Cut Problem
Journal of the ACM (1996) 601-640.
109 / 370
Wiederholung
Monte-Carlo-Algorithmen sind randomisierte Algorithmen, die bei
beschränkter Laufzeit mit einer kleinen Wahrscheinlichkeit ein falsches
Ergebnis liefern dürfen. Mostly Correct
Durch Wiederholen des Algorithmus kann die Fehlerwahrscheinlichkeit
gesenkt werden.
Im Gegensatz zu Monte-Carlo-Algorithmen dürfen
Las-Vegas-Algorithmen nur korrekte Lösungen berechnen, aber mit
einer geringen Wahrscheinlichkeit ist die Laufzeit lang.
Kann man die Richtigkeit eines Ergebnisses effizient überprüfen, so
kann man Monte-Carlo-Algorithmen in Las-Vegas-Algorithmen
überführen, indem man sie solange wiederholt, bis ein richtiges
Ergebnis gefunden wird.
110 / 370
Monte-Carlo Methode zur Berechnung minimaler Schnitte
1. Wähle eine Kante zufällig.
2. Kontrahiere.
3. Wiederhole.
Analyse: Zur Vereinfachung der Rechnung sei das Gewicht einer
Kante stets 1. (Wir erlauben Mehrfachkanten.)
Sei k das Gewicht des minimalen Schnitts, dann gilt:
k ≤ min { deg(v ) | v ∈ V } .
Die Anzahl (das Gewicht) aller Kanten ist |E | ≥ kn/2, aber die Zahl
der Schnittkanten ist ≤ k.
Wähle Kante e zufällig, dann wird nur mit W’keit ≤ 2k/(kn) = 2/n
eine Schnittkante getroffen.
Also ist die W’keit keine Schnittkante zu treffen ≥ 1 − 2/n =
Es ist also im Prinzip eine gute Idee, die gewählte Kante e zu
kontrahieren.
n−2
n .
111 / 370
Monte-Carlo-Ansatz
Wiederholen wir das Experiment c-mal, so haben wir immer noch die
W’keit keine Schnittkante zu treffen:
≥
n−2 n−3
n−c −1
(n − c)(n − c − 1)
·
···
=
.
n
n−1
n−c +1
n(n − 1)
Für c = n − 2 ist die Schranke für die W’keit allerdings ziemlich klein
geworden. Immerhin:
≥
2
.
n(n − 1)
112 / 370
Die maximale Anzahl minimaler Schnitte
Sei { 1, . . . , n } die Menge der Knoten. Die Anzahl aller Schnitte ist
durch
{C , C } ∅ =
6 C ⊆ V,∅ =
6 C = V \ C = 2n−1 − 1.
Es gibt also exponentiell viele Schnitte. Beachte jedoch: Sind
A1 , . . . , Am paarweise disjunkte Ereignisse, so können höchstens 1/p
eine W’keit größer oder gleich p haben. Daher gilt.
Die Anzahl der minimalen Schnitte ist durch n2 begrenzt, denn jeder
2
gefunden.
minimale Schnitt wird mit mindestens der W’keit n(n−1)
113 / 370
Monte-Carlo Ansatz nach Karger
Wiederhole das Experiment z.B. n2 log n-mal und behalte das beste
Ergebnis. Dann ist die W’keit groß, einen fest gewählten minimalen
Schnitt zu finden.
Problem: Zu langsam! Die Kantenkontraktionen pro Experiment
kosten O(n2 ), also Laufzeitabschätzung > n4 .
114 / 370
Monte-Carlo-Ansatz nach Karger und Stein
Nächste Idee: Die Chancen, einen minimalen Schnitt zu treffen, sind
zu Anfang gering und nehmen dann zu.
Erfolg ist ab jetzt keine Schnittkante zu treffen. Misserfolg ist, eine
zu treffen (und daher nicht den gewünschten Schnitt zu finden).
Für c = n/2 ist die Erfolgs-W’keit noch mindestens
≥
(2n − n)(2n − n − 1)
= 1/4.
4n(n − 1)
√
Für n − c = n/ 2 ist die Erfolgs-W’keit mindestens
1/2.
Dies ist daher unser Cut-Off-Point.
115 / 370
Karger-Stein-Algorithmus
Sei G ein Eingabegraph
mit n Knoten und C ein fester minimaler
√
Schnitt, n = ( 2)k . (Wir vernachlässigen bewusst Rundungsfehler
und kleine n.)
1.) Ist n klein, dann löse das Problem direkt. Sonst:
2.) Wiederhole das
√ Folgende zweimal:
3.) Wähle n − n/ 2-mal eine Zufallskante und kontrahiere diese.
◮
◮
◮
◮
Zeit für alle Kantenkontraktionen O(n2 ).
Wir behandeln nicht, wie man effizient zufällige Kanten wählt, die
ein Gewicht haben. (Die ist durchaus nicht trivial!)
W’keit, Schnitt C nicht
√ getroffen zu haben, ist ≥ 1/2.
Restgraph G ′ hat ( 2)k−1 Knoten.
Starte rekursiv den ganzen Algorithmus für G ′ .
4.) Behalte das bessere Ergebnis, also den kleineren Schnitt.
Laufzeit:
Mastertheorem I:
oder direkt:
√
t(n) = 2t(n/ 2) + O(n2 ).
t(n) ∈ O(n2 log n).
t(n) = 2n2 log n.
116 / 370
Erfolgswahrscheinlichkeit: Ω(1/log n)
Es sei pk die (Mindest-)Erfolgswahrscheinlichkeit.√Wir können pk = 1
für kleine Werte von k ansetzen. Betrachte n = ( 2)k+1 .
1. Schnitt C wird bei den initialen Kantenkontraktionen mit W’keit
1/2 nicht getroffen.
2. Erfolg beim rekursiven Aufruf auf G ′ ist ≥ pk .
3. Erfolg beim ersten Durchlauf insgesamt ≥ p2k ,
Misserfolg also ≤ 1 − p2k .
2
4. Misserfolg bei beiden Durchläufen auf G ist ≤ 1 − p2k .
5. Erfolg insgesamt bei G ist
pk 2
)
2
p2
= 1 − 1 + pk − k
4
pk2
= pk −
4
pk+1 ≥ 1 − (1 −
117 / 370
Lösung der Rekursion pk+1 ≥ pk − pk2 /4
Ansatz, definiere eine reelle Zahl zk ≥ 3 durch:
4
pk =
zk + 1
Also z3 = 3 wegen p3 = 1 und dann für k ≥ 3:
1
1
1
≥
−
zk+1 + 1
zk + 1 (zk + 1)2
zk
=
(zk + 1)2
zk
= 2
zk + 2zk + 1
Damit folgt für die Kehrbrüche:
zk2 + 2zk + 1
1
= zk + 2 +
zk
zk
1
≤ zk + 1 +
zk
zk+1 + 1 ≤
zk+1
118 / 370
Zack zack.
Wegen zk > 1 folgt
zk+1 ≤ zk + 1 +
1
< zk + 2
zk
Also wegen z2 = 3 mit Induktion zk ≤ 2k − 1 für k ≥ 2:
zk ≤ 2k − 1 ∈ O(k)
2
1
pk ≥ ∈ Ω( )
k
k
Wegen k = log√2 n = 2 log2 n folgt für die Erfolgswahrscheinlichkeit
P(n) des Karger-Stein-Algorithmus:
1
1
P(n) ≥
∈Ω
.
log2 n
log n
119 / 370
Finde minimale Schnitte mit hoher W’keit
Satz 6.2
Wiederholen wir den Karger-Stein-Algorithmus 3 · ln n · log2 n-mal, so
finden wir alle minimalen Schnitte in der Zeit O(n2 log3 n) mit einer
1
.
Fehlerwahrscheinlichkeit kleiner als 2n
Beweis: Sei C zunächst ein fester minimaler Schnitt:
3·ln n·log2 n
1
Pr(C wird nicht gefunden) ≤ 1 −
log2 n
≤e
Es gibt höchstens
n
2
−3·ln n·log2 n
log2 n
≤ e −3 ln n =
1
n3
minimale Schnitte. Also
n 1
1
<
Pr(Nicht alle gefunden) ≤
3
2n
2 n
120 / 370
Das Geburtstagsparadoxon
Befinden sich mindestens 23 Personen in einem Raum, so die W’keit
mehr als 1/2, dass zwei Personen am gleichen Tag Geburtstag haben.
121 / 370
Herleitung vom Geburtstagsparadoxon
∀x ∈ R : (1 − x) ≤ e −x .
Gleichheit gilt nur bei x = 0. Falls |x| nahe bei Null ist, erhalten wir
eine sehr gute Abschätzung.
Angenommen, es gibt n mögliche Geburtstage und m Personen. Die
Wahrscheinlichkeit p(m, n), dass alle m Geburtstage verschieden sind,
ist dann:
m−1
Y
i
n−m+1
n n−1
1−
···
=
p(m, n) = ·
n
n
n
n
i =0
m−1
Y
i =0
i
1−
n
≤
m−1
Y
i
e− n = e−
Pm−1
i =0
i
n
= e−
m(m−1)
2n
i =0
Der Grenzwert 1/2 wird also spätestens im Bereich von m =
unterschritten. Für n = 365 (oder 366) ist dies 23.
√
2n ln 2
122 / 370
Entwurfstrategie:
Dynamisches Programmieren
Beispiele:
◮ Rucksack
◮ NFA 2 REG
◮ Warshall, Floyd
◮ Optimale Klammerung bei Matrizenprodukten
◮ CYK
◮ Optimale Suchbäume
Reduktion Matrixmultiplikation auf Transitive Hülle und
umgekehrt
123 / 370
Entwurfsstrategie: Dynamisches Programmieren
Beim Verfahren der dynamischen Programmierung werden tabellarisch
alle Teillösungen eines Problems bestimmt, bis schließlich die
Gesamtlösung erreicht ist. Die Teillösungen werden dabei mit Hilfe der
bereits existierenden Einträge berechnet.
124 / 370
Dynamisches Programmieren vs Backtracking
Dynamischen Programmieren ist eng verwandt mit der Problemlösung
durch Backtracking. Die zusätzliche Idee ist, Rekursion durch Iteration
zu ersetzen und durch tabellarisches Festhalten von Teillösungen
Mehrfachberechnungen zu vermeiden.
BEISPIEL: Erinnerung an die Theorie-Vorlesung: Satz von Kleene.
Bestimmung reguläre Ausdrücke:
NEA A = (Q, Σ, δ ⊆ Q × Σ × Q, I , F ),
Lk [i , j] = Sprache von i nach j über erlaubte Zwischenzustände aus
der Menge {1, . . . , k}.
L0 [i , j] = Kantenbeschriftung, (bzw. ε).
Gesucht Ln [i , j] für alle i ∈ I und j ∈ F .
Lk [i , j] := Lk−1 [i , j] + Lk−1 [i , k] · Lk−1 [k, k]∗ · Lk−1 [k, j]
125 / 370
Bestimmung reguläre Ausdrücke: Gesamtschrittalgorithmus
Algorithmus 8.1 Reguläre Ausdrücke aus einem endlichen Automaten
Eingabe : NEA A = (Q, Σ, δ ⊆ Q × Σ × Q, I , F )
procedure NEA2REGEXPGS
(Initialisiere: L[i , j] := {a | (i , a, j) ∈ δ ∨ a = ε ∧ i = j})
begin
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
Ltemp [i , j] := L[i , j] + L[i , k] · L[k, k]∗ · L[k, j]
endif
endfor
endfor
L := Ltemp
endfor
end
126 / 370
Bestimmung reguläre Ausdrücke: Einzelschrittalgorithmus
Algorithmus 8.2 Reguläre Ausdrücke aus einem endlichen Automaten
Eingabe : NEA A = (Q, Σ, δ ⊆ Q × Σ × Q, I , F )
procedure NEA2REGEXP
(Initialisiere: L[i , j] := {a | (i , a, j) ∈ δ ∨ a = ε ∧ i = j})
begin
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
L[i , j] := L[i , j] + L[i , k] · L[k, k]∗ · L[k, j]
endif
endfor
endfor
endfor
end
127 / 370
Vergleich der beiden Algorithmen
Vergleich der Algorithmen ausgeführt auf einem vollständigen
Automaten (von jedem Zustand zu jedem Zustand gibt es genau
einen Übergang).
n
1
2
3
4
5
6
7
8
9
10
11
12
13
Länge des entstehenden
regulären Ausdrucks beim
Gesamtschrittalgorithmus
16
52
200
784
3 104
12 352
49 280
196 864
786 944
3 146 752
12 584 960
50 335 744
201 334 784
Länge des entstehenden
regulären Ausdrucks beim
Einzelschrittalgorithmus
16
278
6 034
148 102
3 694 306
92 332 918
2 308 248 754
57 705 996 262
1 442 649 238 786
36 066 228 966 358
901 655 718 149 074
22 541 392 935 697 222
563 534 823 338 341 666
128 / 370
Wortproblem für kontext-freie Sprachen
Das Wortproblem für kontext-freie Sprachen lässt sich in der Zeit
O(n3 ) lösen: Stichwort CYK (siehe unten).
Eine Reduktion auf Multiplikation boolescher Matrizen liefert nach
Strassen:
O(nlog2 7 ).
129 / 370
CYK-Algorithmus
for i := 1 to N do
Var[i , i ] := {A ∈ V | (A → ai ) ∈ P};
for j := i + 1 to N do
Var[i , j] := ∅;
endfor
Eingabe: w = a1 · · · aN
endfor
Var[i , j] := {A ∈ V | A ⇒∗ ai · · · aj }
for d := 1 to N − 1 do
(1 ≤ i ≤ j ≤ N)
for i := 1 to N − d do
j := i + d;
for k := i to j − 1 do
Var[i , j] := Var[i , j] ∪
{A ∈ V | (A → BC ) ∈ P, B ∈ Var[i , k], C ∈ Var[k + 1, j]}
endfor
endfor
endfor
return Var[1, N]
130 / 370
Transitive Hülle
Algorithmus 8.3 Warshall-Algorithmus: Berechnung transitiver Hülle
Eingabe : Graph als Adjazenzmatrix (A[i , j]) ∈ Booln×n
procedure Warshall (var A : Adjazenzmatrix)
begin
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
if (A[i , k] = 1) and (A[k, j] = 1) then
A[i , j] := 1
endif
endfor
endfor
endfor
end
131 / 370
Korrektheit: Warshall
Die Korrektheit des Warshall-Algorithmus folgt aus der Invarianten:
1. Nach dem k-ten Durchlauf der ersten for-Schleife gilt A[i , j] = 1,
falls ein Pfad von i nach j über Knoten mit Nummern ≤ k
existiert.
– Beachte, k steht ganz außen!
2. Gilt A[i , j] = 1, so existiert ein Pfad von i nach j.
132 / 370
Transitive Hülle?
Algorithmus 8.4 Ist dies Verfahren korrekt?
Eingabe : Graph als Adjazenzmatrix (A[i , j]) ∈ Booln×n
procedure Warshall’ (var A : Adjazenzmatrix)
begin
for i := 1 to n do
for j := 1 to n do
for k := 1 to n do
if (A[i , k] = 1) and (A[k, j] = 1) then
A[i , j] := 1
endif
endfor
endfor
endfor
end
133 / 370
Antwort
Antwort in den Übungen
134 / 370
Von Warshall zu Floyd
Trägt man in die Adjazenz-Matrix vom Warshall-Algorithmus
Kantengewichte statt Boolesche Werte ein, so entsteht der
Floyd-Algorithmus zur Berechnung kürzester Wege.
135 / 370
Floyd-Algorithmus
Algorithmus 8.5 Floyd: Alle kürzesten Wege in einem Graphen
Eingabe : Gewichteter Graph als Adjazenzmatrix A[i , j] ∈ (N ∪ ∞)n×n ,
wobei A[i , j] = ∞ bedeutet, dass es keine Kante von i nach j gibt.
procedure Floyd (var A : Adjazenzmatrix)
begin
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
A[i , j] := min{A[i , j], A[i , k] + A[k, j]};
endfor
endfor
endfor
endprocedure
136 / 370
10. Vorlesung, 18.11.2013
Thema: Dynamisches Programmieren
137 / 370
Floyd-Algorithmus
Der Floyd-Algorithmus liefert ein korrektes Ergebnis auch wenn die
Gewichte negativ sind, unter der Bedingung, dass keine negative
Schleifen vorhanden sind.
Zeitaufwand von Warshall und Floyd ist Θ(n3 ). Verbesserung“
”
dadurch, dass vor der j-Schleife zuerst getestet wird, ob A[i , k] = 1
(bzw. ob A[i , k] < ∞) gilt.
Damit erreicht man den Aufwand O(n3 ):
138 / 370
Floyd-Algorithmus
Algorithmus 8.6 Floyd-Algorithmus in O(n3 )
Eingabe : Adjazenzmatrix (A[i , j]) ∈ (N ∪ {∞})n×n
procedure Floyd (var A : Adjazenzmatrix)
begin
for k := 1 to n do
for i := 1 to n do
if A[i , k] < ∞ then
for j := 1 to n do
A[i , j] := min{A[i , j], A[i , k] + A[k, j]};
endfor
endif
endfor
endfor
endprocedure
139 / 370
Floyd-Algorithmus
Algorithmus 8.7 Floyd-Algorithmus mit negativen Zyklen
Eingabe : Adjazenzmatrix (A[i , j]) ∈ (Z ∪ {±∞})n×n
procedure Floyd (var A : Adjazenzmatrix)
begin
for k := 1 to n do for i := 1 to n do
if A[i , k] < ∞ then for j := 1 to n do
if A[k, j] < ∞ then
if A[k, k] < 0
then A[i , j] := −∞
else A[i , j] := min{A[i , j], A[i , k] + A[k, j]}
endif
endif
endfor endif endfor endfor
endprocedure
140 / 370
Transitive Hülle und Matrixmultiplikation
Sei A = (Aij ) die Adjazenzmatrix eines gerichteten Graphen mit n
Knoten. Der Warshall-Algorithmus berechnet den reflexiven
transitiven Abschluss A∗ in O(n3 ) Schritten. Hierbei ist
X
A∗ =
Ak
mit A0 = In und ∨ als Addition boolescher Matrizen
k≥0
Mit Induktion ergibt sich, dass Ak (i , j) = 1 genau dann gilt, wenn es
von i P
nach j einen Weg der Länge k gibt. Klar ist auch
k
A∗ = n−1
k=0 A .
141 / 370
Transitive Hülle ≤ Matrixmultiplikation
Setze B = In + A. Dann gilt A∗ = B m für alle m ≥ n − 1. Also reicht
es, eine Matrix ⌈log2 (n − 1)⌉-mal zu quadrieren, um A∗ zu berechnen.
Sei M(n) der Aufwand, zwei boolesche n × n-Matrizen zu
multiplizieren, und sei T (n) der Aufwand, die reflexive transitive Hülle
zu berechnen. Dann gilt also:
T (n) ∈ O(M(n) · log n).
Hieraus folgt für alle ε > 0 nach Strassen
T (n) ∈ O(nε+log2 7 ).
Ziel ist jedoch:
T (n) ∈ Θ(M(n)) ⊆ O(nlog2 7 ).
142 / 370
Matrixmultiplikation ≈ Transitive Hülle
Die Beziehung M(n) ∈ O(T (n)) gilt unter der plausiblen Annahme
M(3n) ∈ O(M(n)). Denn seien A und B beliebige Matrizen, dann gilt:

∗ 

0 A 0
In A AB
 0 0 B  =  0 In B  .
0 0 0
0 0 In
Unter den (ebenfalls plausiblen) Annahmen M(n) ∈ Ω(n2 ) und
M(2n) ≥ (2 + ε)M(n) zeigen wir
T (n) ∈ O(M(n)).
Dies bedeutet: die Berechnung der transitiven Hülle ist bis auf
konstante Faktoren genauso aufwendig wie die Matrixmultiplikation.
143 / 370
Transitive Hülle mittels Teile und Beherrsche
Teile und Beherrsche = Divide et impera3
Eingabe: E ∈ Bool(n × n)
1. Teile E in vier Teilmatrizen A, B, C , D so, dass A und D quadratisch sind und jede Matrix ungefähr die Größe n/2 × n/2 hat:
A B
E=
.
C D
2. Berechne rekursiv D ∗ : Aufwand T (n/2).
3. Berechne F = A + BD ∗ C : Aufwand O(M(n/2)), da
M(n) ∈ Ω(n2 ).
4. Berechne rekursiv F ∗ : Aufwand T (n/2).
5. Setze
∗
E =
3
F∗
F ∗ BD ∗
D ∗ CF ∗ D ∗ + D ∗ CF ∗ BD ∗
.
Römisches Herrschaftsprinzip, auch von Machiavelli vorgeschlagen
144 / 370
Berechnung der Transitive Hülle
Damit erhalten wir die Rekursionsgleichung
T (n) ≤ 2T (n/2) + c · M(n)
für ein c > 0.
Dies ergibt
P
i · M(n/2i )
2
k≥0
i
P
2
≤ c · k≥0 2+ε
· M(n)
T (n) ≤ c ·
(nach Mastertheorem)
(da M(n/2) ≤
1
2+ε M(n))
∈ O(M(n)).
145 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von links
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
146 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von links
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
100 Multiplikationen
(10 × 10)
147 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von links
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
100 Multiplikationen
(10 × 10)
100 Multiplikationen
(10 × 1)
148 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von links
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
100 Multiplikationen
(10 × 10)
100 Multiplikationen
(10 × 1)
100 Multiplikationen
(10 × 10)
(10 × 1)
149 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von links
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
100 Multiplikationen
(10 × 10)
100 Multiplikationen
(10 × 1)
100 Multiplikationen
(10 × 10)
100 Multiplikationen
(10 × 1)
(10 × 1)
150 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von links
Insgesamt: 400 Multiplikationen
151 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von rechts
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
152 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von rechts
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
10 Multiplikationen
(10 × 1)
(1 × 1)
153 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von rechts
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(1 × 10)
10 Multiplikationen
10 Multiplikationen
(10 × 1)
(1 × 1)
(10 × 1)
154 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von rechts
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
10 Multiplikationen
(10 × 1)
(1 × 1)
10 Multiplikationen
10 Multiplikationen
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 1)
155 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von rechts
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
10 Multiplikationen
(10 × 1)
(1 × 1)
10 Multiplikationen
(10 × 1)
10 Multiplikationen
(10 × 1)
(1 × 10)
(1 × 1)
10 Multiplikationen
(10 × 1)
156 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation von rechts
Insgesamt: 40 Multiplikationen
157 / 370
Beispiel: Multiplikation einer Matrizenfolge
Multiplikation in optimaler Reihenfolge
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
(10 × 1)
158 / 370
Beispiel: Multiplikation einer Matrizenfolge
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
(1 × 10)
10 Multiplikationen
(10 × 1)
(1 × 1)
159 / 370
Beispiel: Multiplikation einer Matrizenfolge
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
10 Multiplikationen
(10 × 1)
(1 × 10)
10 Multiplikationen
(1 × 1)
(10 × 1)
(1 × 1)
(1 × 1)
160 / 370
Beispiel: Multiplikation einer Matrizenfolge
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
10 Multiplikationen
(10 × 1)
(10 × 1)
(1 × 10)
10 Multiplikationen
(1 × 1)
(10 × 1)
(1 × 1)
(1 × 1)
1 Multiplikation
(1 × 1)
161 / 370
Beispiel: Multiplikation einer Matrizenfolge
(10 × 1)
(1 × 10)
(10 × 1)
(10 × 1)
(1 × 10)
(10 × 1)
10 Multiplikationen
(10 × 1)
(10 × 1)
(1 × 10)
10 Multiplikationen
(1 × 1)
(10 × 1)
(1 × 1)
(1 × 1)
1 Multiplikation
(1 × 1)
10 Multiplikationen
(10 × 1)
162 / 370
Beispiel: Multiplikation einer Matrizenfolge
Insgesamt: 31 Multiplikationen
Dies ist optimal.
Wir haben also ein Optimum unter allen möglichen Klammerungen zu
bestimmen. Die Anzahl aller Klammerungen ist der Anzahl der
Binärbäumen. Für n Knoten ist die n-te Catalan-Zahl
2n
1
2n
Cn =
≈ 1.5 .
n+1 n
n
163 / 370
I saw the man on the hill with the telescope
und was soll es bedeuten?
(((Ich sah den Mann) auf dem Berg) mit dem Fernrohr)
((Ich sah (den Mann auf dem Berg)) mit dem Fernrohr)
(((Ich sah den Mann) (auf dem Berg mit dem Fernrohr)
(Ich sah ((den Mann auf dem Berg) mit dem Fernrohr))
(Ich sah (den Mann (auf dem Berg mit dem Fernrohr)))
5 Klammerungen mit 5 = C3 =
1 6
4 3
164 / 370
Multiplikation einer Matrizenfolge
A(n,m) sei eine Matrix A mit n Zeilen und m Spalten.
Annahme: A(n,m) := B(n,q) · C(q,m) benötigt n · q · m skalare
Multiplikationen.
1
2
3
N
.
, M(n
, M(n
, . . . , M(n
Eingabe: Matrizenfolge M(n
2 ,n3 )
0 ,n1 )
1 ,n2 )
N−1 ,nN )
cost(M 1 , . . . , M N ) := minimale Zahl der skalaren Multiplikationen,
um das Produkt M[1, N] = M 1 · · · M N zu berechnen.
Dynamisches Programmierung liefert:
cost(M i , . . . , M j ) =
mink {cost(M i , . . . , M k ) + cost(M k+1 , . . . , M j ) + ni −1 · nk · nj }
165 / 370
Multiplikation einer Matrizenfolge
for i := 1 to N do
cost[i , i ] := 0;
for j := i + 1 to N do
cost[i , j] := ∞;
endfor
endfor
for d := 1 to N − 1 do
for i := 1 to N − d do
j := i + d;
for k := i to j − 1 do
t := cost[i , k] + cost[k + 1, j]
+ n[i − 1] · n[k] · n[j];
if t < cost[i , j] then
cost[i , j] := t;
best[i , j] := k;
endif
endfor
endfor
endfor
return cost[1, N]
166 / 370
Die Multiplikation nach der best-Tabelle
cost[i , j], best[i , j] sind berechnet.
Was nun?
Wir benötigen nur noch die best[i , j]-Werte.
i
Setze M[i , i ] = M(n
und berechne M[1, N] rekursiv:
i −1 ,ni )
M[i , j] = M[i , best[i , j]] · M[best[i , j] + 1, j].
167 / 370
Thema: Optimale Suchbäume
168 / 370
Optimale Suchbäume
Erzeugung von optimalen Suchbäumen:
Die direkte Methode Θ(n3 ).
Der Algorithmus von Donald E. Knuth hat einen Aufwand von Θ(n2 ).
(Teleskop-Summe)
Interessant ist hier, wie man durch eine genaue Analyse des Problems
den kubischen Algorithmus in einen quadratischen verwandeln kann.
Der Algorithmus ist nicht komplizierter, sondern der Gewinn liegt im
Auslassen überflüssiger Schritte.
169 / 370
Optimale Suchbäume
Sei ein linear geordnetes Feld gegeben mit v1 < v2 < · · · < vn .
Zugriffshäufigkeit auf Knoten v sei durch γ(v ) gegeben.
Der Wert γ(v ) kann sowohl die relativen als auch die absoluten
Häufigkeiten bezeichnen.
170 / 370
Optimale Suchbäume
Binärer Suchbaum: knotenbeschrifteter Baum
Für jeden Knoten v mit linkem Unterbaum L und u ∈ L gilt: u < v
(bzw. w ∈ R rechts und dann v < w ).
Jeder Knoten v hat ein Level ℓ(v ):
ℓ(v ) := 1+ Abstand des Knotens v zur Wurzel.
Das Auffinden eines Knotens auf Level ℓ erfordert ℓ Vergleiche.
Ziel:
Finde einen binären Suchbaum, der die gewichtete innere Pfadlänge
X
P(B) :=
ℓ(v ) · γ(v )
v ∈V
minimiert.
171 / 370
Optimale Suchbäume
Optimaler Suchbaum für 1, 2, 22 , 23 , 24 , 25 mittels Greedy-Strategie.
25
24
23
22
2
1
172 / 370
Optimale Suchbäume
Optimaler Suchbaum für 1,2,3,4,5,6,7.
5
3
2
7
4
6
1
Gewichtete innere Pfadlänge: 1 · 5 + 2 · 10 + 3 · 12 + 4 · 1 = 65
173 / 370
Optimale Suchbäume
Suchbaum für 1, 2, 3, 4, 5, 6, 7 nach Greedy-Strategie:
7
6
5
4
3
2
1
Gew. innere Pfadlänge:
7 + 12 + 15 + 16 + 12 + 15 + 12 + 7 = 86
174 / 370
Optimale Suchbäume
Die innere Pfadlänge bestimmt die durchschnittlichen Kosten einer
Sequenz von Find-Operationen.
Dynamische Programmierung möglich,
da die Unterbäume eines optimalen Baums auch optimal sind.
175 / 370
Optimale Suchbäume
Bezeichnungen:
◮
Knotenmenge = {1, . . . , n},
d.h. die Zahl i entspricht dem Knoten vi . Weiterhin wird ℓi
(bzw. γi ) eine andere Schreibweise für ℓ(i ) (bzw. γ(i )) sein.
◮
Pi ,j : gewichtete innere Pfadlänge eines optimalen Suchbaumes
der Knoten {i , . . . , j}.
◮
◮
◮
Ri ,j : Wurzel eines optimalen Suchbaumes für {i , . . . , j}.
Später: ri ,j kleinstmögliche Wurzel, Ri ,j größtmögliche Wurzel.
P
Γi ,j := jk=i γ(k): Gewicht der Knotenmenge {i , . . . , j}.
176 / 370
Optimale Suchbäume
Im dynamischen Ansatz sind nun Werte ri ,j oder Ri ,j gesucht, die
einen optimalen Suchbaum B mit Kosten Pi ,j realisieren. Man geht
nun direkt vor und berechnet P(B) rekursiv (dabei bezeichnet BL
bzw. BR den linken, bzw. rechten Unterbaum der Wurzel von B):
P(B) := P(BL ) + P(BR ) + Γ(B)
Wir realisieren diesen Ansatz zunächst in einem kubischen
Algorithmus.
Hier nur die Idee:
Algorithmus: Berechnung eines optimalen Suchbaums
◮
◮
Pi ,j = Γi ,j + mink∈i ...j {Pi ,k−1 + Pk+1,j }
ri ,j = k, für den minimalen Index Pi ,k−1 + Pk+1,j das Minimum
annimmt.
177 / 370
Optimale Suchbäume
Das folgende Lemma ist trivial:
Lemma (Monotonie der Funktion P(B))
Sei B ′ ein optimaler Suchbaum für {1, . . . , n} und v ∈ {1, . . . , n}. Sei
B ein optimaler Suchbaum für {1, . . . , n} \ {v }. Dann gilt
P(B) ≤ P(B ′ ).
178 / 370
Optimale Suchbäume
Beweis: Sei L′ bzw. R ′ der linke bzw. rechte Unterbaum von v . Ist
R ′ = ∅, so betrachten wir nun den Baum B̂ := B ′ \{v } (d.h., L′
rutscht ein Level höher). B̂ ist wieder ein Suchbaum und es gilt
offensichtlich P(B̂) ≤ P(B).
Ist R ′ 6= ∅, so sei v ′ der kleinste Knoten in R ′ . Sei R ein optimaler
Baum der Knoten aus R ′ \{v ′ }. Wir definieren einen Baum B̂ durch
Ersetzen von v durch v ′ in B ′ und von R ′ durch R. Dabei ist B̂
wieder ein Suchbaum und es gilt:
P(B ′ ) − P(B̂) ≥ γ(v ) · l ′ (v ) − γ(v ′ ) · l ′ (v ) + γ(v ′ ) · l ′ (v ′ ),
wobei der letzte Summand eine untere Schranke ist für die Differenz
P(R ′ ) − P(R) (bezogen auf den gesamten Baum B ′ bzw. B̂). Daraus
ergibt sich P(B̂) ≤ P(B ′ ) und damit P(B) ≤ P(B ′ ) für einen
optimalen Baum, der die Knotenmenge ohne v realisiert.
179 / 370
Optimale Suchbäume
Die folgende Beobachtung (von Knuth) ist entscheidend.
Satz 8.1 (Monotonie der Wurzel)
Sei r [i , j] (bzw. R[i , j]) die kleinste (bzw. größte) Wurzel eines
optimalen Suchbaumes für die Knoten {i , . . . , j}. Dann gilt für n ≥ 2:
r [i , j − 1] ≤ r [i , j],
R[i , j − 1] ≤ R[i , j].
Die Anschauung ist klar.
Der Beweis ist sehr schwierig.
180 / 370
Optimale Suchbäume
Beweis: Es reicht für n > 2 zu zeigen:
r [1, n − 1] ≤ r [1, n],
R[1, n − 1] ≤ R[1, n].
Mit Induktion ist das Lemma für j − i ≤ n − 2 bereits bewiesen.
Lemma: Sei {1, . . . , n} die Knotenmenge.
Sei Bj ein optimaler Suchbaum mit minimalem Level j von Knoten n
(also n möglichst hoch). Sei j1 die Wurzel von Bj .
Sei Bi ein optimaler Suchbaum mit Wurzel i1 ≥ j1 .
Dann existiert ein optimaler Suchbaum B ′
mit Wurzel i1 und Knoten n auf Level j.
181 / 370
Optimale Suchbäume
Diese Verbindung der Eigenschaften minimales Level für n und große
Wurzel ist für den Beweis des Satzes von Nutzen.
Beweis des Lemmas: Wir betrachten die rechten Äste, wobei die
Knoten von Bi mit ik und die Knoten von Bj mit jk bezeichnet sind:
Beachte i1 ≥ j1 .
Bj : j1
Bi :
j2
1
i1
i2
..
2
..
.
n
.
ij
j
n
i
182 / 370
Optimale Suchbäume
Bei festem i1 maximieren wir i2 , dann maximieren wir i3 usw. Der
neue Baum wird weiterhin mit Bi bezeichnet. Angenommen, in Bi und
Bj liegt der Knoten n auf gleichem Level j. Dann sind wir fertig.
Andernfalls können wir (zur Vereinheitlichung der Bezeichnung)
annehmen, dass der Knoten n in Bi auf Level i liegt und i > j gilt,
weil j minimal gewählt wurde.
Sei k maximal mit ik > jk . Dann gilt 1 ≤ k < j. Setze m = k + 1. Es
gilt {ik + 1, . . . , n} ( {jk + 1, . . . , n}, und mit Induktion und
Links-Rechts-Symmetrie des Satzes gilt
jm ≤ R[jk + 1, n] ≤ R[ik + 1, n] = im . Also folgt jm = im , da k
maximal gewählt wurde.
183 / 370
Optimale Suchbäume
Sei nun Ri der rechte Unterbaum in Bi , der im als Wurzel hat, und Rj
sei der rechte Unterbaum in Bj , der jm als Wurzel hat. Wegen im = jm
haben Ri und Rj dieselbe Knotenmenge und sind optimale
Suchbäume. Wir bilden einen Baum B ′ durch Ersetzen von Ri in Bi
durch Rj . Da P(Ri ) = P(Rj ) gilt, ergibt sich auch
P(B ′ ) = P(Bi ) = P(Bj ), d. h. B ′ ist optimal für {1, . . . , n}, hat i1 als
Wurzel und den Knoten n auf Level j.
184 / 370
Optimale Suchbäume
Angenommen i2 = j2 , also m = 2. Wir erhalten das folgende Bild.
Beachte i1 ≥ j1 .
1
B ′ : i1
Bi : i1
i2 = j 2
j2
i2
..
..
.
ij
.
n
n
2
j
i
185 / 370
Optimale Suchbäume
Symmetrie ergibt:
Lemma: Sei Bi ein optimaler Suchbaum für {1, . . . , n} mit
maximalem Level i von Knoten n. Sei i1 die Wurzel von Bi . Sei Bj ein
optimaler Suchbaum für {1, . . . , n} mit Wurzel j1 ≤ i1 . Dann existiert
ein optimaler Suchbaum B ′ für {1, . . . , n} mit Wurzel j1 und Knoten
n auf Level i .
186 / 370
Optimale Suchbäume
Es sei α das Gewicht des größten Knotens n, d.h. α := γn . Der Wert
α variiert zwischen 0 und ∞.
Mit rα (bzw. Rα ) bezeichnen wir die kleinste (bzw. größte) Wurzel
eines optimalen Suchbaums für die Knoten {1, . . . , n}.
Sei zunächst α = 0 und seien B ′ bzw. B ′′ optimale Suchbäume für die
Knoten {1, . . . n − 1} mit Wurzel r [1, n − 1] bzw. R[1, n − 1]. Nimmt
man jeweils den Knoten n als rechtesten hinzu, so erhält man
Suchbäume für {1, . . . n}, ohne die gewichtete innere Pfadlänge zu
erhöhen. Nach der Monotonie von P(B) sind diese Suchbäume
optimal. Es folgt:
r [1, n − 1] = r0 [1, n]
und
R[1, n − 1] ≤ R0 [1, n].
Man beachte, dass nicht r [1, n − 1] > r0 [1, n] gelten kann, sonst
würde man einfach den Knoten n entfernen.
Daher reicht es zu zeigen, dass rα und Rα monoton mit α steigen.
187 / 370
Optimale Suchbäume
Ab jetzt betrachten wir nur noch die Knotenmenge i ∈ {1, . . . , n}.
Bi sei ein optimaler Suchbaum unter der Nebenbedingung, dass der
Knoten n auf dem Level i liegt.
Dann gilt für eine gewisse Konstante c(i ):
Pα (Bi ) = α · i + c(i ).
Der Graph Pα (Bi ) ist eine Gerade mit Steigung i .
Aufgrund der Linearität erhalten wir das folgende (vertikal gestauchte)
Bild, bei der jede Steigung i = 1, . . . , n höchstens einmal vorkommt.
188 / 370
Optimale Suchbäume
Pα
✻
Pα (Bn )
Pα (Bℓ )
Pα (Bi )
Pα (Bk )
Pα (Bj )
✲
α0
α
189 / 370
Optimale Suchbäume
Wenn wir α vergrößern, sind wir am Punkt α0 gezwungen, das Level
von n zu verkleinern.
Bei einem Knick, besteht die Chance Rα0 > Rα0 −ε .
Wähle bei α0 einen optimalen Suchbaum Bi mit Rα0 als Wurzel und
wähle einen bei α0 optimalen Suchbaum Bj mit minimalem Level j.
Erinnerung:Die Verbindung der Eigenschaften minimales Level für n
und große Wurzel ist von Nutzen.
Wegen des ersten Lemmas gibt es einen optimalen Suchbaum bei α0
mit Rα0 als Wurzel und Knoten n auf Level j. Dieser Suchbaum ist
optimal bis einschließlich zum nächsten Knick“. Erst dort könnte Rα
”
echt größer werden. Folglich steigt Rα monoton.
190 / 370
Optimale Suchbäume
Wir fahren jetzt von rechts nach links und starten bei α = ∞.
Die Monotonie heißt jetzt, rα muss von rechts nach links fallen
Wenn wir α verkleinern, sind wir am Punkt α0 gezwungen, das Level
des Knotens n auf einen größeren Wert zu ändern.
Wähle bei α0 einen optimalen Suchbaum Bj mit rα0 als Wurzel und
einen ebenfalls bei α0 optimalen Suchbaum Bi mit maximalem Level
i . Wegen des zweiten Lemmas gibt es einen optimalen Suchbaum bei
α0 mit rα0 als Wurzel und Knoten n auf Level i . Dieser Suchbaum ist
optimal bis einschließlich zum nächsten Knick“ nach links . Erst dort
”
könnte rα echt kleiner werden.
Folglich steigt rα von links nach rechts.
Damit ist das Monotonie Lemma gezeigt!
191 / 370
Optimale Suchbäume
cost[n, n + 1] := 0;
for i := 1 to n do
cost[i , i − 1] := 0;
cost[i , i ] := γ(i );
Γ[i , i ] := γ(i );
r[i , i ] := i ;
endfor
for d := 1 to n − 1 do
for i := 1 to n − d do
j := i + d;
t := ∞;
for k := r [i , j − 1] to r [i + 1, j] do
if cost[i , k − 1] + cost[k + 1, j] < t then
t := cost[i , k − 1] + cost[k + 1, j];
root := k;
endif
endfor
Γ[i , j] := Γ[i , j − 1] + γ(j);
cost[i , j] := t + Γ[i , j];
r [i , j] := root;
endfor
endfor
192 / 370
Optimale Suchbäume
Laufzeit:
n−1 n−d
X
X
d=1 i =1
n−1
X
d=1
(1 + r [i + 1, i + d] − r [i , i + d − 1]) =
(n − d + r [n − d + 1, n] − r [1, d]) ≤
3 2
n ∈ Θ(n2 ).
2
Bemerkung 8.2
◮
Ein linear geordnetes Feld v1 , . . . , vn kann aus einem
ungeordneten Feld in O(n log n) Schritten erzeugt werden. Dies
fällt aber bei Θ(n2 ) nicht ins Gewicht.
◮
Damit kann aus einem beliebigen Feld mit n Elementen ein
optimaler Suchbaum in Θ(n2 ) Schritten erzeugt werden.
193 / 370
13. Vorlesung, 26.11.2013
194 / 370
Mastertheorem II
Für die Medianberechnung in linearer Zeit wird das Mastertheorem II
benötigt.
Satz 9.1 (Mastertheorem II)
Sei r > 0,
Pr
i =0 αi
< 1 und für eine Konstante c sei
!
r
X
t(⌈αi n⌉) + c · n
t(n) ≤
i =0
Dann gilt t(n) ∈ O(n).
195 / 370
Beweis Mastertheorem II
Wähle ein ε und ein n0 > 0 so, dass
α
Pi nr 0 ≤ n0 − 1 und
Pr dass
i =0 ⌈αi n⌉ ≤ ( i =0 αi ) · n + r + 1 ≤ (1 − ε)n für alle n ≥ n0 .
Wähle ein γ so, dass c < γε und t(n) < γn für alle n < n0 .
Für den Induktionsschritt (n ≥ n0 ) gilt:
!
r
X
t(⌈αi n⌉) + cn
t(n) ≤
≤
i =0
r
X
i =0
!
γ⌈αi n⌉
+ cn
(mit Induktion)
≤ (γ(1 − ε) + c)n
≤ γn
196 / 370
Medianberechnung in linearer Zeit
Gegeben sei ein Feld a[1 . . . n] von Zahlen. Gesucht ist das
⌊n/2⌋-kleinste Element in einer sortierten Reihenfolge der ai .
Allgemeiner sei 1 ≤ k ≤ n. Berechne SELECT(k, a[1 . . . n]).
Gesucht ist also das k-kleinste Element m, d.h., berechne
m ∈ { a[i ] | 1 ≤ i ≤ n } mit:
|{i | a[i ] < m}| < k
und
|{i | a[i ] > m}| ≤ n − k
197 / 370
Median der Mediane
Bestimme ein Pivotelement als Median der Mediane aus 5: Wir teilen
das Feld in Fünferblöcken auf. In jedem Block wird der Median
bestimmt (mit 6 Vergleichen möglich). Wir bestimmen rekursiv den
Median p dieses Feldes (mit dem gesamten Algorithmus). Der Wert p
wird als Pivotelement im folgenden verwendet. Kosten: T ( n5 ).
198 / 370
Quicksortschritt
Mit dem Pivot p zerlege so, dass für gewisse m1 < m2 gilt:
a[i ] < p
a[i ] = p
a[i ] > p
für 1 ≤ i ≤ m1
für m1 < i ≤ m2
für m2 < i ≤ n
Kosten: maximal n Schritte. Fallunterscheidung:
1. k ≤ m1 : Suche das k-te Element rekursiv in a[1], . . . , a[m1 ].
2. m1 < k ≤ m2 : Das Ergebnis ist p.
3. k > m2 : Suche das (k − m2 )-te Element in a[m2 + 1], . . . , a[n].
199 / 370
30 – 70 Aufteilung
Die Wahl des Pivots als Median-aus-Fünf ergibt die folgende
Ungleichungen für m1 , m2 :
3
n ≤ m2
10
und
m1 ≤
7
n
10
Damit ergeben sich die Kosten für den Rekursionsschritt als T ( 7n
10 ).
Denn: Die Hälfte der 5-er Mediane ist ≤ p. Dies betrifft also
(mindestens) n/10 der Blöcke. In jedem Block aus 5 Elementen sind
mindestens 3 kleiner oder gleich dem Blockmedian.
200 / 370
Zeitanalyse
Sei T (n) die Gesamtzahl der Vergleiche. Wir erhalten folgende
Rekursionsgleichung für T (n):
n
7n
+T
T (n) ≤ T
+ O(n)
5
10
Aus dem Mastertheorem II folgt damit T (n) ∈ O(n).
201 / 370
Zahl der notwendigen Schlüsselvergleiche
T (n) ≤ T
n
5
+T
7n
10
+
6n 2n
+
5
5
Hierbei ist 6n
5 der Aufwand für die Bestimmung der Blockmediane und
2n
der
Aufwand
für den Zerlegungsschritt ist.
5
Denn wir können bei der richtigen Positionierung des Medians der
Mediane jeweils in Fünferblöcken operieren und müssen daher aus
einem Fünferblock jeweils nur noch zwei Elemente mit dem
Pivotelement vergleichen.
7
9
= 10
erhalten
Es ergibt sich, dass damit T (n) ≤ 16n gilt: mit 15 + 10
9n
8n
8n
wir T (n) ≤ T ( 10) + 5 und damit T (n) ≤ 10 · 5 = 16n.
n
Der Term T 7n
10 wird im Mittel näher bei T 2 liegen, d.h., der
Medianalgorithmus verhält sich im Mittel besser.
In Praxis ist jedoch Quickselect die bessere Methode. Später.
202 / 370
Quickselect
Algorithmus 10.1
function quickselect(A[ℓ . . . r ] : array of integer, k : integer) : integer
begin
if ℓ = r then
return A[ℓ]
else
p := random(ℓ, r );
m := partitioniere(A[ℓ . . . r ], p);
k ′ := (m − ℓ + 1);
if k ≤ k ′ then
return quickselect(A[ℓ . . . m], k)
else
return quickselect(A[m + 1 . . . r ], k − k ′ ) endif endif
endfunction
203 / 370
Durchschnittsanalyse von Quickselect
◮
Q(n) durchschnittliche Anzahl an Vergleichen von quickselect,
um das kte Element in einem Feld der Größe n zu finden.
Das Feld ist fest gewählt und entspricht einer festen
Permutation, mit π bezeichnen wir die zufällige Reihenfolge, in
der Pivot-Elemente gezogen werden. Es sei 1 ≤ k ≤ n fest. Im
Folgenden bezeichnen i , j Werte mit 1 ≤ i < j ≤ n.
Im Laufe von Quickselect (oder auch Quicksort) werden i und j
maximal einmal verglichen. Falls sie verglichen werden ist dann i
oder j aktuelles Pivotelement.
◮
Xij (π) := i wird mit j verglichen“ ∈ {0, 1}.
”
204 / 370
Durchschnittsanalyse von Quickselect
Unterscheide 3 Fälle:
1. Fall: i < j ≤ k.
E [Xij ] =
Pr[ i oder j wird als erstes im Intervall [i , . . . , k] gezogen“]
”
= k−i2+1
X X
X
k −i
E [Xij ] = 2
k −i +1
1≤i <k i <j≤k
1≤i <k
X
1
=2
1−
k −i +1
1≤i <k
= 2(k − H(k))
wobei H(k) ∈ Θ(ln k) die harmonische Funktion ist.
2
und
2. Fall: k ≤ i < j, analog folgt E [Xij ] = j−k+1
X X
E [Xij ] = 2(n − k + 1 − H(n − k + 1))
k<j≤n k≤i <j
205 / 370
Durchschnittsanalyse: 1. und 2. Fall
Die beiden ersten Fälle ergeben zusammen einen linearen Term:
2n + 1 − H(k) − H(n − k + 1) = 2n − Θ(log n).
206 / 370
Durchschnittsanalyse von Quickselect
3. Fall: i < k < j.
E [Xij ] = j−i2+1
X
X
E [Xij ] = 2
1≤i <k k<j≤n
X
X
1≤i <k k<j≤n
=2
X 1≤i <k
<2
X
1≤i <k
1
j −i +1
1
1
+ ··· +
k −i +2
n−i +1
(ln(n − i + 1) − ln(k − i ))
n
= 2 ln
k −1
207 / 370
Durchschnittsanalyse von Quickselect
◮
◮
◮
◮
1. Fall + 2. Fall zusammen ergeben < 2n
Mit kn ≤2n ergibt sich:
n ≤ 2(1 + ln(2))n
Q(n) < 2 n + ln k−1
n
Im Fall k = ⌈n/2⌉ folgt mit n1 2n ≤ ⌈n/2⌉
:
Q(n) > 2 (1 + ln(2)) n − c log(n) für ein geeignetes c
Das heißt, Q(n) = 2(1 + ln(2))n − log -Terme für k ≈ n/2.
Für die Median-Berechnung mit Quickselect werden im Mittel also
3,38n < 2 · 1,693147181n < 3,4n Vergleiche benötigt.
208 / 370
14. Vorlesung, 02.12.2013
1. Quicksort: Durchschnittsanalyse
2. Median aus Drei
209 / 370
Quicksort
Quicksort-Algorithmus 1962 von Hoare:
Wähle Pivotelement.
Zerlege das Feld in zwei Teilfelder mit Pivot als Trennung.
Nach linear vielen Vertauschungen sind die Elemente im linken Teilfeld
kleiner oder gleich Pivot, im rechten größer oder gleich Pivot.
Wende auf beide Teilfelder rekursiv den gleichen Algorithmus an.
Wichtig: die Wahl des Pivots.
Laufzeit ist optimal, falls das Pivotelement gleich dem mittleren
Element des Feldes (Median) ist.
In der Praxis bewährt:
die Median-aus-Drei-Methode.
210 / 370
Partitionieren
Zunächst geben wir die Prozedur zum Partitionieren eines Feldes A
(im Bereich ℓ bis r ) bzgl. eines Pivot-Elements P = A[p] an, wobei
ℓ < r und p ∈ {ℓ, . . . , r } gelte. Ergebnis dieser Prozedur ist ein Index
m ∈ {ℓ, . . . , r − 1}, der folgende Eigenschaften erfüllt:
A[i ] ≤ P für alle ℓ ≤ i ≤ m
und
A[i ] ≥ P für alle m + 1 ≤ i ≤ r .
Das rechte Teilfeld enthält (irgendwo) das Pivotelement.
211 / 370
Partitionieren
function partitioniere(A[ℓ . . . r ] : array of integer, p : integer) : integer
(* Partitioniere A[ℓ . . . r ] bzgl. A[p]; Rückgabewert = Index m *)
begin
P := A[p];
(* Pivot-Element merken *)
swap(A[ℓ], A[p]);
(* Pivot an erste Pos. stellen *)
x := ℓ − 1;
y := r + 1;
while x < y do
repeat x := x + 1 until A[x] ≥ P;
repeat y := y − 1 until A[y ] ≤ P;
if x < y then
swap(A[x], A[y ]);
endif
endwhile
return y
endfunction
212 / 370
Partitionieren
Man vergewissere sich, dass die geforderten Eigenschaften von dieser
Implementierung wirklich erfüllt werden, und dass es außerdem nicht
vorkommen kann, dass der linke bzw. rechte Zeiger“ (x bzw. y ) über
”
die Feldgrenze ℓ bzw. r hinauswandert.
Die vorgestellte Implementierung führt bis zu n + 2
Schlüsselvergleichen auf einem Feld mit n Elementen durch.
Jedes Element außer A[p] muss jedoch nur einmal mit P verglichen
werden.
Dies lässt sich durch eine andere Implementierung erreichen. (Übung)
Bei der Durchschnittsanalyse von Quicksort werden wir daher von
n − 1 Schlüsselvergleichen ausgehen. Außerdem gehen wir davon aus,
dass das Pivotelement die Felder am Ende trennt.
213 / 370
Quicksort
procedure quicksort(A[ℓ . . . r ] : array of integer)
begin
if ℓ < r then
p := Index des Median von A[ℓ], A[(ℓ + r ) div 2], A[r ];
m := partitioniere(A[ℓ . . . r ], p);
(* Feld bzgl. A[p] partitionieren *)
quicksort(A[ℓ . . . m]);
(* linkes Teilfeld sortieren *)
quicksort(A[m + 1 . . . r ]);
(* rechtes Teilfeld sortieren *)
endif
endprocedure
214 / 370
Quicksort, kleineres Teilfeld zuerst
procedure quicksort(A[ℓ . . . r ] : array of integer)
begin
if ℓ < r then
p := Index des Median von A[ℓ], A[(ℓ + r ) div 2], A[r ];
m := partitioniere(A[ℓ . . . r ], p);
(* Feld bzgl. A[p] partitionieren *)
if m − ℓ < r − m then
(* kleineres Teilfeld zuerst *)
quicksort(A[ℓ . . . m]);
(* linkes Teilfeld sortieren *)
quicksort(A[m + 1 . . . r ]);
(* rechtes Teilfeld sortieren *)
else
quicksort(A[m + 1 . . . r ]);
(* rechtes Teilfeld sortieren *)
quicksort(A[ℓ . . . m]);
(* linkes Teilfeld sortieren *)
endif
endif
endprocedure
215 / 370
Quicksort: Komplexität
Worst-case Der Quicksort-Algorithmus ist quadratisch:
In jedem Schritt enthält eines der beiden Teilfelder genau ein Element.
Mögliches Szenario: Liste bereits (fast) sortiert, Pivot ist stets das
erste oder letzte Element.
Hier: Durchschnittsanalyse unter der Annahme einer zufälliger
Auswahl des Pivotelements. (Alternativ: Feld ist zufällig angeordnet.)
Satz 11.1
Q(n) := P
die mittlere Anzahl der Schlüsselvergleiche.
H(n) := nk=1 k1 = n-te harmonische Zahl.
Dann gilt für Quicksort:
Q(n) = 2(n + 1)H(n) − 4n.
216 / 370
Quicksort: Durchschnittsanalyse
Beweis: Wie bei Quickselect werden auch bei Quicksort i und j
maximal einmal verglichen. Falls sie verglichen werden ist dann i oder
j aktuelles Pivotelement. Setze also wieder
Xij (π) := i wird mit j verglichen“ ∈ {0, 1}.
”
Im Unterschied zu Quickselect gilt für alle i < j stets:
◮
◮
E [Xij ] =
2
j−i +1
217 / 370
Quicksort: Durchschnittsanalyse
Daher
Q(n) =
X
i <j
E [Xij ] =
X
i <j
n−1 n−d
XX 2
2
=
.
j −i +1
d +1
d=1 i =1
n−1
Q(n) X n − (d + 1) + 1
=
2
d +1
d=1
= −(n − 1) + (n + 1)
n−1
X
d=1
1
d +1
= (1 − n) + (n + 1)(H(n) − 1)
= (n + 1)H(n) − 2n.
218 / 370
Quicksort: Durchschnittsanalyse
Es gilt also bei zufälliger Pivot-Wahl:
Q(n) = 2(n + 1)H(n) − 4n.
Es ist H(n) − ln n ≈ 0,57 . . . = Eulersche Konstante. Also:
Q(n) ≈ 2(n + 1)(0,57 + ln n) − 4n
≈ 2n ln n − 2,8n ≈ 1,38n log n − 2,8n.
Theoretische Grenze: log(n!) = n log n − 1,44n;
Quicksort ist im Mittel um 38% schlechter.
Die Durchschnittsanalyse der “Median-aus-Drei-Methode liefert nach
Sedgewick 1,18n log n − 2,2n.
Dies ist im Mittel nur noch um 18% schlechter.
219 / 370
14. und 15. Vorlesung, 02./03.12.2013
Nächste Themen:
◮
Fibonacci-Heaps.
◮
Amortisierte Zeitanalyse.
Anwendungen:
◮
Dijkstra, Prim.
◮
Berechnung minimaler Schnitte nach Stoer/Wagner.
220 / 370
Fibonacci-Heaps
Fibonacci-Heap H = Liste von Bäumen (also ein Wald):
Die Bäume sind knotenbeschriftet.
Alle Knoten, bis auf die Wurzel, können zusätzlich eine Marke tragen.
V = Knotenmenge.
key : V → N Beschriftung.
root bezeichnet stets eine der Wurzeln.
Heap-Bedingung:
∀x ∈ V : ist y ein Kind von x, so gilt: key (x) ≤ key (y )
221 / 370
Fibonacci-Heaps
◮
Die Eltern-Kind-Beziehung wird durch Zeiger realisiert, da die
Bäume unbalanciert sein werden.
◮
Im Gegensatz zu einem Standard-Heap müssen Indexrechnungen
also durch aufwendige Zeigeroperationen ersetzt werden.
◮
Operationen:
◮
1. merge,
◮
2. insert,
◮
3. delete min,
◮
4. decrease key.
222 / 370
Fibonacci-Heaps
◮
merge: Konkatenation zweier Listen — konstante Zeit.
◮
insert: Spezialfall von merge — konstante Zeit.
◮
merge und insert können (eventuell sehr lange) Listen
einelementiger Bäume erzeugen.
◮
Jede solche Liste ist ein Fibonacci-Heap.
223 / 370
delete min
◮
Sei H ein Fibonacci-Heap aus T Bäumen und n Elementen.
◮
Für einen Knoten x sei rank (x) = die Anzahl der Kinder von x.
◮
Für einen Baum B sei rank (B) = Rang der Wurzel von B.
◮
Sei rmax (n) der maximale Rang, der in einem Fibonacci-Heap mit
n Elementen auftreten kann.
◮
rmax (n) ≤ n.
◮
Später zeigen wir rmax (n) ∈ O(log n).
224 / 370
procedure delete min
1. Suche minimalen Schlüssel als Wurzel in einem Baum. Sei r der
Rang dieses Baumes. Zeit: O(T ). Alternativ gibt es einen Zeiger
auf das kleinste Element.
2. Trenne die Wurzel ab und ersetze den Baum durch die r
Teilbäume. Evtl. Marken entfernen. Zeit: O(T + r ).
3. Definiere Feld L[0, . . . , rmax (n)] mit L[i ] = die Liste der Bäume
von Rang i . Zeit: O(T + rmax (n)).
4. for i := 0 to rmax (n) − 1 do
while |L[i ]| ≥ 2 do
Entnehme zwei Bäume aus L[i ].
Hänge den Baum mit dem größeren Schlüsselwert an der
Wurzel direkt unter die Wurzel des anderen Baumes und
füge diesen neuen Baum in L[i + 1] an.
endwhile
endfor
delete min erfordert also Zeit O(T + rmax (n)).
225 / 370
Bemerkung
Am Ende der Prozedur delete min gibt es für jeden möglichen Rang
höchstens einen Baum.
Insbesondere ist die Zahl der Bäume durch rmax (n) beschränkt.
226 / 370
decrease key
Kaskadenartige Schnitte: Sei x der Knoten, dessen Schlüssel
verkleinert werden soll.
1. Ist x die Wurzel, so kann der Schlüsselwert verkleinert werden.
Sei also x keine Wurzel und x = y0 , y1 , . . . , yk , . . . , root der Pfad
von x zur Wurzel. Für ein k ≥ 1 sei yk der erste (von x
verschiedene) Knoten, der keine Marke trägt.
2. Für 0 ≤ i < k trenne jetzt yi vom Elternknoten yi +1 ab und
entferne dabei die Marke von yi . (Für y0 = x ist evtl. eine Marke
vorhanden gewesen.) Damit wird yi für 0 ≤ i < k zu einer
unmarkierten Wurzel eines eigenen Baumes.
3. Falls yk keine Wurzel ist, markiere yk . (Kind verloren!)
227 / 370
decrease key
Es wird O(k + 1) Zeit benötigt. Beachte: Die Zahl der Marken hat
sich mindestens um k − 2 verringert, k ≥ 1. Die Anzahl der Bäume ist
nach der Prozedur decrease key durch T + k begrenzt.
228 / 370
decrease key
Definition 13.1
Ein Fibonacci-Heap ist eine Liste von Bäumen wie eingangs
beschrieben, die aus der leeren Liste unter Anwendung der
Operationen merge, insert, delete min und decrease key entstanden
ist.
Fibonacci-Heaps-Lemma
1. Sei x ein Knoten in einem Fibonacci-Heap, und ci das i -t älteste
Kind von x (d.h., c1 ist der erste Knoten, der Kind von x
geworden ist). Dann hat ci mindestens den Rang i − 2.
2. Hat x mindestens den Rang k, k ≥ 0, so enthält die Teilmenge
der Wurzel x zusammen mit den Teilbäumen von k Kindern
mindestens Fk+2 Knoten. Hierbei ist Fk+2 die (k + 2)-te
Fibonacci-Zahl (F0 = 0, F1 = 1, Fk+2 = Fk + Fk+1 für k ≥ 0).
229 / 370
Beweis Lemma
1. Sei c1 , c2 , . . . , ck die dem Alter nach absteigend geordnete Folge
der Kinder von x, und 1 ≤ i ≤ k. Dann ist c1 älter als c2 , c2 älter als
c3 , u.s.w. Zu dem Zeitpunkt, als ci unter den Knoten x (der zu diesem
Zeitpunkt eine Wurzel war) gehängt wurde, existierten also bereits die
Kinder c1 , . . . , ci −1 . Der Rang von x war also mindestens i − 1. Da
nur Bäume vom gleichen Rang zu einem Baum vereinigt werden,
hatte ci zu diesem Zeitpunkt mindestens den Rang i − 1. Der Knoten
ci kann inzwischen maximal ein Kind verloren haben. (In diesem Fall
wäre ci markiert.) Der Verlust eines weiteren Kindes hätte die
Abtrennung ci von x zur Folge gehabt. Es folgt die erste Behauptung
rank (ci ) ≥ i − 2 .
Die zweite Behauptung folgt dann mit Induktion und einem Bild.
230 / 370
Fibonacci-Zahlen
x k+1 = x k + x k−1 ⇐⇒ x k−1 (x 2 − x − 1) = 0
√
√
Die Zahlen 1+2 5 , 1−2 5 sind die beiden Lösungen der quadratischen
Gleichung x 2 − x − 1 = 0. Dies führt zu dem Ansatz:
√ !k
1+ 5
+b
2
Fk = a
√ !k
1− 5
2
Wegen F0 = 0 und F1 = 1 muss für a, b gelten:
a
Es folgt a =
√1 ,
5
b=
√
1+ 5
2
−1
√
.
5
a + b = 0,
√ + b 1−2 5
= 1.
231 / 370
Fibonacci-Zahlen

√ !k
1  1+ 5
Fk = √
−
2
5
Die Fibonacci-Zahlen wachsen exponentiell.
Also rmax (n) ∈ O(log n).

√ !k
1− 5 
2
232 / 370
Zusammenfassung der Zeitabschätzungen
1,2. merge, insert: in konstanter Zeit
3. delete min: O(T + log n), wobei T die Zahl der Bäume ist. Der
Summand log n ergibt sich aus rmax (n) ∈ O(log n).
4. decrease key: O(1) + O(k), wobei k ≥ 0 die Zahl der Marken sei,
um die sich der Fibonacci-Heap verringert hat.
233 / 370
Amortisierte Zeiten
Für die weitere Analyse einer Sequenz von Operationen betrachten wir
die gegen eine Potentialfunktion amortisierte Zeit.
Definition 13.2
Für einen Fibonacci-Heap H sei das Potential pot (H) gegeben durch
pot (H) := T + 2M ,
wobei T die Zahl der Bäume und M die Zahl der Marken seien.
Für eine Operation op sei ∆pot (op ) die Differenz des Potentials vor
und nach der Ausführung:
∆pot (op ) = pot (Heap nach op ) − pot (Heap vor op ) .
Die amortisierte Zeit einer Operation op sei
tamort (op ) = t(op ) + ∆pot (op ) .
234 / 370
Potentialfunktion
Die Potentialfunktion erfüllt:
◮
pot (H) ≥ 0,
pot (∅) = 0.
Sei jetzt op 1 , op 2 , op 3 , . . . , op m eine Sequenz von m Operationen auf
einem zunächst leeren Fibonacci-Heap.
Dann gilt:
m
m
X
X
tamort (op i ) .
t(op i ) ≤
◮
i =1
i =1
Bemerkung: Die Differenz ist gerade das Potential des erzeugten
Heaps.
Wegen pot (H) ∈ O(|H|) gilt
m
X
i =1
tamort (op i ) ∈
m
X
t(op i ) + θ(|H|).
i =1
Es genügt also eine Schranke für tamort (op ) zu bestimmen.
235 / 370
Bequemlichkeit
Für die weitere Rechnung ist es bequemer, sich bei der tatsächlich
verbrauchten Zeit zunächst von der O-Notation zu befreien. Durch die
Multiplikation mit einer geeigneten Konstanten können wir annehmen,
dass sich merge und insert in einem Schritt realisieren lassen. Die
Operation delete min benötigt höchstens T + log n und die Operation
decrease key höchstens k + 1 Zeitschritte. Die Wahl der Basis für den
Logarithmus ist in der Zeitanalyse unerheblich.
236 / 370
delete min
◮
tamort (merge) = t(merge) = 1. Denn das Potential der
konkatenierten Liste ist die Summe der Potentiale der
Einzellisten.
◮
tamort (insert) = t(insert)+∆pot (op ) = 1 + 1 = 2.
◮
Für delete min gilt t(delete min) ≤ T + log n, wobei T die Zahl
der Bäume zuvor und rmax (n) bis auf einen konstanten Faktor die
maximale Zahl der Bäume danach ist.
Die Zahl der Marken kann nur kleiner werden. Aus
∆pot (op ) ≤ −T + rmax (n) folgt daher
tamort (delete min) ≤ T + log n − T + rmax (n) ∈ O(log n) .
237 / 370
delete min
◮
Für decrease key gilt nach der obigen Bemerkung
t(decrease key) ≤ k + 1. Dabei verliert der Heap mindestens
k − 2 Marken, k ≥ 1, und erhält höchstens k neue Bäume.
∆pot (op ) = ∆(T ) + 2∆(M)
≤ k + 2 · (2 − k)
= 4−k
Also gilt tamort (decrease key) ≤ k + 1 + 4 − k = 5 ∈ O(1).
238 / 370
delete min
Satz 13.3
Für einen Fibonacci-Heap gelten die folgenden amortisierten Zeiten:
tamort (merge) ∈ O(1)
tamort (insert) ∈ O(1)
tamort (delete min) ∈ O(log n)
tamort (decrease key) ∈ O(1)
239 / 370
Anwendungen
Anwendung auf den Dijkstra- oder Prim-Algorithmus:
Für den Dijkstra-Algorithmus sei V die Randmenge und key die
ermittelte Distanz der Randknoten zum Quellknoten u (entsprechend
für Prim).
Sei n die Zahl der Knoten und e die Zahl der Kanten. Maximal werden
n insert-, e decrease key- und n delete min-Operationen durchgeführt.
240 / 370
Anwendungen
tDijkstra ≤
n · tamort (insert)
+ e · tamort (decrease key)
+ n · tamort (delete min)
∈ O(n + e + n log n)
= O(e + n log n)
Man beachte, dass sich für die Analyse des schlechtesten Falles keine
Verbesserung ergibt. Asymptotisch ist O(e + n log n) jedoch
mindestens genauso gut wie min(e · log n, n2 ). In vielen Fällen
n2
(n log n ≤ e ≤ log
n ) ist O(e + n log n) um den Faktor log n besser.
241 / 370
16. Vorlesung, 09.12.2013
1.) Verwaltung von Mengen: Union-Find
2.) Kruskal-Algorithmus zur Berechung minimal spannander Bäume
3.) Äquivalenztest für DFA
242 / 370
Verwaltung von Mengen
Union-Find–Algorithmen
Definition: Eine Partition P einer Menge M ist eine Zerlegung von M
in disjunkte, nicht-leere Teilmengen:
m
M =
[
˙
Pi
i =1
P = {Pi | Pi ∩ Pj = ∅, Pi 6= ∅, 1 ≤ i < j ≤ m}
Beispiel: Sei M = {1, 2, . . . , 12}. Dann ist P = {Q, R, S} mit
Q = {i ∈ M | i ungerade}, R = {i ∈ M | i ≡ 0 mod 4} und
S = {i ∈ M | i ≡ 2 mod 4} eine Partition von M.
243 / 370
Union-Find
◮
◮
Find ist eine Funktion von M nach P, die jedem i ∈ M die
Menge Pj zuordnet, für die i ∈ Pj gilt.
Union verändert die Partition wie folgt: Union(A, B, C ) bedeutet,
dass die Partitionselemente A, B ∈ P zu einer neuen Menge mit
dem Namen C vereinigt werden. Nach Union(A, B, C ) ist die
neue Partition (P \ {A, B}) ∪ {A ∪ B}, wobei das Element A ∪ B
nun C heißt.
244 / 370
Feld von Paaren
1
Q
2
S
3
Q
4
R
5
Q
6
S
7
Q
8
R
9
Q
10
S
11
Q
12
R
Hier gilt z.B. Find(5) = Q und Union(Q, R, T ) ergibt:
1
T
2
S
3
T
4
T
5
T
6
S
7
T
8
T
9
T
10
S
11
T
12
T
245 / 370
Feld: Quadratische Kosten
◮
◮
◮
◮
Kosten: Find–Operation O(1).
Kosten: Union–Operation O(n).
In den Anwendungen werden häufig m Union-Find–Operationen
hintereinander durchgeführt, mit m ∈ Θ(n).
Damit insgesamt: O(n2 ).
246 / 370
Knotenbeschriftete Wälder
Jede Klasse ist ein Baum. Die Partition wird also durch einen Wald
definiert.
Der Name der Klasse ist der Name der Wurzel.
Wir werden sehen, dass bei einer n-elementigen Grundmenge die Höhe
eines jeden Baums durch log(n) beschränkt ist. Somit kosten in dieser
Realisierung Find-Operationen O(log(n)) Zeit, während Union in
konstanter Zeit durchgeführt werden kann.
Eine weitere Idee zur Verkürzung der Suchpfade besteht darin, bei
einem Aufruf von Find alle Knoten auf dem Pfad, den man zur Wurzel
hin durchläuft, direkt unter die Wurzel anzuhängen.
247 / 370
Union
Die Initialisierung ist dann:
name(vi ) := i
root(i ) := vi
pred(vi ) := nil
count(vi ) := 1
Die Union-Operation Union(i , j) wird dann so realisiert, dass der
kleinere der beiden Bäume i , j an die Wurzel des größeren angehängt
wird:
248 / 370
Find–Implementierung mit Pfadverkürzung
Algorithmus 14.1
function Find(i : Element): Element;
var u, v , root: Knoten;
begin
u := element[i ];
while pred(u) 6= nil do u := pred(u);
endwhile
root := u; u := element[i ];
while pred(u) 6= nil do v := pred(u); pred(u) := root; u := v
endwhile
return name(root);
endfunction
249 / 370
Find mit Pfadverkürzung
p
p
s
q
q
r
r
s
Baum nach Find(s)
Baum vor Find(s)
250 / 370
Der Rang eines Knotens
Definition 14.1
Der Rang eines Knotens v , Rang(v ), ist die Höhe des Knotens in dem
Wald, der ohne Pfadverkürzung erzeugt wurde.
Lemma. Sei v ein Knoten mit Rang(v ) = r . Dann hat der Teilbaum
mit der Wurzel v mindestens 2r Elemente.
Beweis:
Für r = 0 ist die Behauptung klar.
Betrachte den Zeitpunkt, in dem v den Rang r (v ) = r erhält. Dann
hat v ein Kind v ′ und im Teilbaum von v ′ sind 2r −1 Elemente, vorher
waren im Teilbaum von v bereits 2r −1 Elemente, also hat der
Teilbaum von v jetzt 2 · 2r −1 = 2r Elemente.
Zwei Knoten mit gleichem Rang sind nicht Vorgänger voneinander.
Damit folgt:
Korollar 14.2
Es gibt höchstens n/2r Knoten mit Rang r .
251 / 370
Zeitanalyse für Union-Find
Dieser Abschnitt beschreibt die Analyse nach Robert E. Tarjan (1983)
für m Union-Find-Operationen.
Wir verwenden die folgende Ackermannfunktion:
A0 (r ) = r + 1,
Ak+1 (r ) = Ark (r ).
(Hierbei bezeichnet Ark (r ) die r -fache Anwendung von Ak auf r )
Es ist Ak (1) = 2; daher ist sinnvall:
α(n) = min{k | Ak (2) > n}.
A1 (x) = 2x, A2 (x) = x2x , A3 (2) = 2048, also
A4 (2) = A23 (2) = A3 (2048) = A2048
(2048): ein Turm von mehr als
2
2000 Potenzen der 2. Daher ist α(n) ≤ 4 = α(2048) für alle
denkbaren Werte.
252 / 370
Analyse von m Union-Find-Operationen
Wir betrachten n Knoten und die folgende zeitabhängige Funktion
part (x):
Definition 14.3
Sei x ein Knoten mit Rang r . Dann bezeichnet part (x) seinen
Vorgänger (englisch: parent) zum Zeitpunkt t.
Definition 14.4
Ein Knoten x mit Rang r ≥ 2 gehört im Zeitabschnitt t zur Klasse k,
falls k maximal ist mit
r (part (x)) ≥ Ak (r (x)).
253 / 370
Analyse von m Union-Find-Operationen
◮
Wurzeln oder Knoten vom Rang 0 oder 1 gehören in keine Klasse.
Ein innerer Knoten mit Rang 2 gehört mindestens in die Klasse 0.
◮
Es gibt höchstens α(n) verschiedene Klassen.
◮
Realistisch: nur die Klassen 0, 1, 2 und 3.
◮
Eine Klasse kann als Maß für den Abstand eines Knotens zu
seinem Vaterknoten angesehen werden. Damit ist auch klar: Die
Klassennummern, die man auf dem Pfad zur Wurzel antrifft,
müssen nicht wie die Ränge monoton steigen.
254 / 370
Die Lebensgeschichte eines Knotens
◮
Ein Knoten x beginnt als Wurzel.
◮
Wenn er den Wurzelstatus verliert, erhält er seinen Rang r (x).
◮
Bei Rang 0 oder 1, bleibt x für immer klassenlos.
◮
Bei Rang 2 oder mehr betritt x eine Klasse k ≥ 0.
◮
◮
Ab jetzt geht es in der Klassengesellschaft nur aufwärts.
Realistischer Weise sollte man nur auf Klasse 3 hoffen.
255 / 370
Analyse von m Union-Find-Operationen
Erinnerung: Teuer sind nur die Find-Operationen.
Bei einem Find(i ) verteilen wir auf dem Pfad Gold- und Eisenstücke
auf die Knoten. Wir unterscheiden α(n) Klassen von Eisenstücken, so
dass es insgesamt 1 + α(n) verschiedene Währungen gibt.
Goldverteilung: Wenn x auf dem Pfad zur Wurzel besucht wird, gibt
es ein Goldstück, falls
x keiner Klasse angehört (d.h. x ist Wurzel oder vom Rang 0 oder 1)
oder x letzter seiner Klasse ist.
Korollar 14.5
Insgesamt werden nicht mehr als (3 + α(n))m Goldstücke verteilt.
256 / 370
Analyse von m Union-Find-Operationen
Eisenverteilung: Wenn x zur Zeit t auf dem Pfad zur Wurzel besucht
wird, erhält x ein Eisenstück der Klasse k, falls x zu dieser Zeit zur
Klasse k gehört und nicht letzter seiner Klasse ist.
Beobachtung: Erhält x zur Zeit t ein Eisenstück der Klasse k, so
gibt es auf dem Pfad zur Wurzel Knoten x, part (x), y , part (y ) mit:
Ak (r (x)) ≤ r (part (x)) ≤ r (y )
und
Ak (r (y )) ≤ r (part (y )).
Satz 14.6
Sei i ≥ 1 mit r (part (x)) ≥ Aik (r (x)). Dann gilt zur Zeit t + 1 die
Beziehung:
r (part+1 (x)) ≥ Aik+1 (r (x)).
257 / 370
Beweis
Wähle auf dem Pfad x, part (x), y , part (y ) mit:
Aik (r (x)) ≤ r (part (x)) ≤ r (y ), Ak (r (y )) ≤ r (part (y )).
Dann folgt:
r (part+1 (x)) ≥
≥
≥
≥
=
r (part (y ))
Ak (r (y ))
Ak (r (part (x)))
Ak (Aik (r (x)))
Aik+1 (r (x)).
258 / 370
Korollare
Ein Knoten vom Rang r erhält maximal r Eisenstücke der Klasse k.
Beweis: Nach r Find-Operationen in der Klasse k gilt:
r (pars (x)) ≥ Ark (r ) = Ak+1 (r )
und der Knoten steigt in die Klasse k + 1 auf.
Korollar 14.7
Es werden insgesamt maximal 3n
2 ≤ 2n Eisenstücke der Klasse k
verteilt.
Beweis: Es gibt höchstens n/2r Knoten mit Rang r und jeder erhält
höchstens r Eisenstücke der Klasse k. Damit:
X rn
3n
=
r
2
2
r ≥2
Korollar 14.8
Es werden insgesamt maximal 2α(n)n Eisenstücke verteilt.
Beweis: α(n) Klassen und pro Klasse 2n Eisenstücke.
259 / 370
Abschätzung für die Gesamtkosten
Alle Finds zusammen kosten O 3m + α(n)(2n + m) Zeit.
Beweis:
(3 + α(n))m Gold + 2α(n)n Eisen.
Übung: Für α(n) < 4 dominiert die Konstante 6m im O-Term, da
m > n. Wie erreicht man 5m?
260 / 370
Minimale Aufspannende Bäume
Definition 14.9
Ein Graph G = (V , E ) heißt zusammenhängend, wenn je zwei Knoten
durch einen Pfad verbunden sind.
Definition 14.10
Ein Baum ist ein zusammenhängender, kreisfreier, ungerichteter
Graph.
Bemerkung 14.11
Jeder Baum mit n Knoten besitzt genau n − 1 Kanten.
Definition 14.12
Ein minimaler aufspannender Baum (minimal spanning tree, MSB) zu
einem gewichteten Graphen G = (V , E , γ) ist ein Baum
B = (V , P
F , γ|F ) mit F ⊆ E mit minimalem Gewicht
γ(B) := e∈F γ(e).
261 / 370
Algorithmus 14.2 Kruskal–Algorithmus zur Bestimmung des MSB
function kruskal(G = (V , E , γ): kantengew. Graph): Kantenmenge;
(∗ G sei zusammenhängend ∗)
(∗ E = {e1 , e2 , . . . , em } sei nach Gewichten aufsteigend sortiert. ∗)
var m, i : integer;
x, y : Knoten;
T : Kantenmenge;
(∗ des MSB ∗)
begin
m := |E |; T := ∅;
forall v ∈ V do [v ] := {v } endfor;
for i := 1 to m do
xy := ei ;
if Find(x) 6= Find(y ) then
Union([x] , [y ]); T := T ∪ {xy }
endif
endfor return T endfunction
262 / 370
Äquivalenz endlicher Automaten
Definition 14.13
Ein endlicher, deterministischer Automat über dem Alphabet Σ ist ein
5-Tupel A = (Q, Σ, δ, q0 , F ) mit:
◮
Q = Zustände,
◮
q0 ∈ Q = ist Startzustand,
◮
◮
δ : Q × Σ −→ Q = Übergangsfunktion,
F ⊆ Q = Endzustände.
263 / 370
Äquivalenz endlicher Automaten
Schreibe statt δ(q, w ) für q ∈ Q und w ∈ Σ∗ , vereinfacht qw .
L(A) := {w ∈ Σ∗ | q0 w ∈ F }
L(q) := {w ∈ Σ∗ | qw ∈ F }.
Gegeben: A = (Q, Σ, δ, q0 , F ) und A′ = (Q ′ , Σ, δ′ , q0′ , F ′ ).
Frage: L(A) = L(A′ )?
264 / 370
Äquivalenztest DEA
Q̃ := disjunkte Vereinigung von Q und Q ′
R ⊆ Q̃ × Q̃ die kleinste Äquivalenzrelation mit den Eigenschaften:
1. (q0 , q0′ ) ∈ R,
2. (q, q ′ ) ∈ R, a ∈ Σ, q ∈ Q, q ′ ∈ Q ′ =⇒ (qa, q ′ a) ∈ R
Lemma: Es gilt: L(A) = L(A′ ) gdw.
R ∩ (F × (Q ′ \ F ′ )) ∪ ((Q \ F ) × F ′ ) = ∅.
265 / 370
Äquivalenztest DEA
Algorithmus 14.3
function Äquivalenztest-DFA(A, A′ : DFA) : boolean
begin
L := {(q0 , q0′ )};
while L 6= ∅ do
wähle ein (q, q ′ ) ∈ L;
L := L \ {(q, q ′ )}
if Find(q) 6= Find(q ′ ) then
if (q, q ′ ) ∈ [(F × (Q ′ \ F ′ )) ∪ ((Q \ F ) × F ′ )] then
return false
(∗ L(q0 ) 6= L(q0′ ) ∗)
else
Union(q, q ′ );
forall a ∈ Σ do
L := L ∪ {(qa, q ′ a)} endfor endif endif endwhile
return true endfunction
266 / 370
Zeitanalyse
Terminierung
Es sind maximal |Q| + |Q ′ | =: n = |Q̃| Union-Operationen möglich.
Damit werden maximal |Σ| · n Elemente zu L hinzugefügt. In jedem
Schleifendurchlauf wird ein Element aus L entfernt. Daher ergibt sich
die Termination nach maximal |Σ| · n Schleifendurchläufen.
|Q| + |Q ′ | =: n = |Q̃| Union–Operationen
|Σ| · n Find–Operationen
267 / 370
Teil 2: Berechenbarkeit
268 / 370
Aufgabe aus der Scheinklausur 2014
Seien α > 1 und k ∈ N so gewählt, dass 0 ≤ p(n) ≤ nk , 0 < t(0) und
t(n) = αt(n − 1) + p(n) für alle n ≥ 1. Dann gilt
t(n) ∈ Θ(αn ).
Lösung:
Schreibe t(n) = f (n)αn für eine Funktion f (n) > 0. Für n ≥ 1 gilt:
t(n) = f (n)αn = αf (n − 1)αn−1 + p(n).
f (n) = f (n − 1) + p(n)/αn ≥ t(0).
Also gilt t(n) ∈ Ω(αn ).
Wegen α > 1 folgt ferner
f (n) ≤
X
i ≥0
i k /αi ∈ O(1).
Dies zeigt t(n) ∈ O(αn ). Zusammen erhalten wir t(n) ∈ Θ(αn ).
269 / 370
Grundlagen
Im Folgenden behandeln wir einige Grundlagen:
◮
Turingmaschinen (nicht-deterministisch, deterministisch)
◮
Konfigurationen
◮
Berechnungen,...
◮
Turingmaschinen können auf viele verschiedene äquivalente
Weisen definiert werden.
◮
Wir könnten Turingmaschinen auch durch andere äquivalente
Rechenmodelle ersetzen (z.B. Registermaschinen).
270 / 370
Turingmaschinen: Definition
Definition 15.1
Eine nichtdeterministische Turingmaschine mit k-Arbeitsbändern ist
ein Tupel M = (Q, Σ, Γ, δ, q0 , F , b)
◮
Q : endliche Menge der Zustände
◮
q0 ∈ Q : Startzustand
◮
◮
F ⊆ Q : Menge der Endzustände
Γ : endliches Bandalphabet
◮
Σ ( Γ : endliches Eingabealphabet
◮
b ∈ Γ \ Σ : Blanksymbol
◮
δ ⊆ Q × (Σ ∪ {b}) × Γk × Q × Γk × {L, R, N}k+1 :
Übergangsrelation.
L (R, N): bewege Kopf nach links (rechts, Neutral, also gar
nicht)
271 / 370
Turingmaschinen: Definition
Bei einer deterministischen k-Band Turingmaschine M ist δ eine
partiell definierte Funktion
δ : Q × (Σ ∪ {b}) × Γk → Q × Γk × {L, R, N}k+1 .
Soll M eine Funktion berechnen, so hat M zusätzlich ein
Ausgabealphabet Σ′ und für δ gilt:
δ : Q × (Σ ∪ {b}) × Γk → Q × Γk × {L, R, N}k+1 × (Σ′ ∪ {λ})
(λ ist das leere Wort).
272 / 370
Turingmaschinen: Konfigurationen
Definition 15.2
Eine Konfiguration α der Turingmaschine M bei Eingabe w ∈ Σ∗ ist
ein Tupel α = (q, u0 , v0 , u1 , v1 , . . . , uk , vk ), mit:
◮
q ∈ Q : aktueller Zustand der Turingmaschine
◮
u0 v0 = w b, v0 6= λ: Der Lesekopf für das Eingabeband liest
gerade das erste Symbol von v0 .
◮
∀i ∈ {1, . . . , k} : ui ∈ Γ∗ , vi ∈ Γ+ :
Das i -te Arbeitsband hat den Inhalt ui vi bb · · · und der i -te
Schreib/Lesekopf liest gerade das erste Symbol von vi .
Die Länge |α| von α ist |α| = max { |ui vi | | 1 ≤ i ≤ k }.
Für eine Einband-TM (ohne explizite Arbeitsbänder) schreiben wir
Konfigurationen häufig als Wörter:
uqv ∈ Γ∗ QΓ+
es gilt dann: |uqv | = Wortlänge von uv
Die TM ist dann im Zustand q und liest das erste Zeichen von v .
273 / 370
Turingmaschinen: Startkonfiguration, akzeptierende
Konfigurationen, . . .
1. Für die Eingabe w ∈ Σ∗ ist Start(w ) = (q0 , λ, w b, λ, b, . . . , λ, b)
die zu w gehördende Startkonfiguration.
Beachte: |Start(w )| = 1.
2. Für ein d ∈ δ und Konfigurationen α, β schreiben wir α ⊢d β,
falls die Anweisung“ d auf die Konfiguration α anwendbar ist,
”
und die Konfiguration β ergibt.
[
3. Es sei ⊢M =
⊢d .
d∈δ
4. Mit Accept bezeichnen wir die Menge der akzeptierenden
Konfigurationen (aktueller Zustand ist aus F ⊆ Q).
5. Beachte: α ⊢M β ⇒ |α| − |β| ∈ {−1, 0, 1}
274 / 370
Turingmaschinen: Berechnungen, Protokolle
1. Eine Rechnung von M bei Eingabe w ist eine Folge von
Konfigurationen α0 , α1 , . . . , αm mit
◮
◮
Start(w ) = α0
∀1 ≤ i ≤ m : αi −1 ⊢M αi
Die Berechnung ist erfolgreich, falls αm ∈ Accept.
2. Das Protokoll dieser Rechnung ist die Folge d0 d1 . . . dm−1 ∈ δ∗
mit αi ⊢di αi +1
275 / 370
Turingmaschinen: akzeptierte Menge, Zeit- und Platzbedarf
1. Der Zeitbedarf (bzw. Speicherbedarf) der Berechnung
α0 , α1 , . . . , αm ist m (bzw. max{|αi | | 0 ≤ i ≤ m}).
2. M hat bei Eingabe w den Zeitbedarf (bzw. Speicherbedarf)
N ∈ N, falls jede Berechnung von M bei Eingabe w Zeitbedarf
(bzw. Speicherbedarf) ≤ N hat.
3.
L(M) = {w ∈ Σ∗ | ∃ erfolgreiche Berechnung von M bei Eingabe w }
ist die von M akzeptierte Menge.
276 / 370
Komplexitätsklassen
Seien t : N → N und s : N → N monoton wachsende Funktionen.
DTIME(t) = {L ⊆ Σ∗ | es existiert deterministische Turingmaschine M mit L = L(M), die auf allen Eingaben
der Länge n Zeitbedarf max{t(n), n + 1} hat.}
NTIME(t) = {L ⊆ Σ∗ | es existiert nichtdeterministische Turingmaschine M mit L = L(M), die auf allen Eingaben der Länge n Zeitbedarf max{t(n), n + 1}
hat.}
DSPACE(s) = {L ⊆ Σ∗ | es existiert deterministische Turingmaschine M mit L = L(M), die auf allen Eingaben
der Länge n Speicherbedarf s(n) hat.}
NSPACE(s) = {L ⊆ Σ∗ | es existiert nichtdeterministische Turingmaschine M mit L = L(M), die auf allen Eingaben der Länge n Speicherbedarf s(n) hat.}
Für eine Komplexitätsklasse C ist CoC = {L | Σ∗ \ L ∈ C} die Menge
der Komplemente der in C enthaltenen Sprachen.
277 / 370
Komplexitätsklassen
Wir werden die Klassen DTIME(t) und NTIME(t) nur für
Funktionen t(n) mit ∀n ∈ N : t(n) ≥ n betrachten.
Dies erlaubt, die gesamte Eingabe zu lesen, da wir tatsächlich immer
n + 1 Schritte erlauben.
Wir werden die Klassen DSPACE(s) und NSPACE(s) nur für
Funktionen s(n) ∈ Ω(log(n)) betrachten.
Dies erlaubt, eine Position i ∈ {1, . . . , n} im Eingabestring auf einem
Arbeitsband abzuspeichern.
278 / 370
Wichtige Komplexitätsklassen
Gebräuchlichen Abkürzungen:
L = DSPACE(log(n))
(1)
NL = NSPACE(log(n))
[
P =
DTIME(nk )
(2)
(3)
NP =
(4)
k≥1
[
NTIME(nk )
k≥1
PSPACE =
[
k≥1
DSPACE(nk ) =
[
NSPACE(nk )
(5)
k≥1
Die Gleichung = in (5) ist als Satz von Savitch bekannt (kommt
noch).
279 / 370
Beziehungen zwischen Komplexitätsklassen
PSPACE = IP
?
NP
?
NP ∩ CoNP
?
P
?
6=
NSPACE(n) = CoNSPACE(n)
? (1. LBA Problem)
DSPACE(n)
6=
S
S
k
k
DSPACE(log
(n))
=
k≥1
k≥1 NSPACE(log (n))
NL
?
L
6=
Es gibt noch viele weitere Komplexitätsklassen: Besuchen Sie doch
den complexity zoo
(http://qwiki.caltech.edu/wiki/Complexity Zoo)
280 / 370
Beispiele
◮
◮
◮
◮
{an b n c n | n ≥ 1} ∈ L
{w $w R | w ∈ Σ∗ }, {ww R | w ∈ Σ∗ } ∈ L
{w $w | w ∈ Σ∗ }, {ww | w ∈ Σ∗ } ∈ L
Die Menge PRIM = {p ∈ 1{0, 1}∗ | p ist Binärcodierung einer
Primzahl } ist in P.
Agrawal, Kayal und Saxena haben 2002 gezeigt, dass PRIM ∈ P
gilt, vorher war nur PRIM ∈ NP ∩ CoNP bekannt.
281 / 370
Aufzählbarkeit und Entscheidbarkeit
◮
Eine Sprache L ⊆ Σ∗ heißt aufzählbar, wenn es eine
Turingmaschine M mit L = L(M) gibt.
◮
Eine Sprache L ⊆ Σ∗ heißt entscheidbar, wenn es eine
Turingmaschine M gibt, die auf alle Eingaben entweder in einem
Zustand Ja“ oder in einem Zustand Nein“ hält; und es gilt
”
”
w ∈ L genau dann, wenn sie in Ja“ hält.
”
Satz 16.1
1. Ist L ⊆ Σ∗ entscheidbar, so auch das Komplement L = Σ∗ \ L.
2. L ⊆ Σ∗ ist genau dann entscheidbar, wenn L und das
Komplement L aufzählbar sind.
282 / 370
Einbandmaschinen und Reduktionen
◮
Jede Turingmaschine lässt sich durch eine Einbandmaschine
simulieren. (Beweis: Spurtechnik.) Die Simulation benötigt
linearen Platz und quadratischen Mehraufwand in der Zeit.
◮
Sind L ⊆ Σ∗ und L′ ⊆ Σ′∗ , so bezeichnet L ≤ L′ (bis auf
Weiteres), dass sich L auf L′ reduzieren lässt.
◮
Eine Reduktion ist dabei eine total definierte berechenbare
Funktion f : Σ∗ → Σ′∗ mit
w ∈ L ⇐⇒ f (w ) ∈ L′ .
◮
◮
Sei L ≤ L′ und L′ entscheidbar, dann ist L entscheidbar.
Sei L ≤ L′ und L′ aufzählbar, dann ist L aufzählbar.
283 / 370
Kodierungen als Bitfolgen
Für mathematische Objekte X bezeichnen wir mit hX i ∈ { 0, 1 }∗ eine
Standardkodierung als Bitfolge.
Hierbei kann X alles Mögliche sein: eine Zahl, ein Wort über einem
Alphabet Σ, ein Graph, eine Turingmaschine oder ein Tupel.
Ist z.B. M = (Q, Σ, Γ, δ, q0 , F , b) eine Turingmaschine, so bezeichnet
hMi ∈ { 0, 1 }∗ ihre Kodierung.
Ist M = (Q, Σ, Γ, δ, q0 , F , b) eine Turingmaschine und w ∈ Σ∗ ein
Wort, so bezeichnet hM, w i ∈ { 0, 1 }∗ eine Kodierung von dem Paar
(M, w ).
284 / 370
Universelle Turingmaschine
Satz 16.2 (Turing)
Es gibt eine universelle Turingmaschine U mit
L(U) = { hM, w i ∈ { 0, 1 }∗ | w ∈ L(M) }
Folgerung 16.3 (Turing)
Die folgenden Sprachen sind aufzählbar aber nicht entscheidbar:
◮
◮
◮
Selbstanwendung: Hs = { hMi ∈ { 0, 1 }∗ | hMi ∈ L(M) }
Spezielles Halteproblem: H0 = { hMi ∈ { 0, 1 }∗ | ε ∈ L(M) }
Nichtleerheit: H = { hMi ∈ { 0, 1 }∗ | L(M) 6= ∅ }
285 / 370
Universalität vs. Leerheit
Folgerung 16.4 (Turing)
Für Σ 6= ∅ ist folgenden Sprache nicht aufzählbar noch ist ihr
Komplement aufzählbar:
{ hMi ∈ { 0, 1 }∗ | L(M) = Σ∗ }
Sei hMi die Kodierung einer Turingmaschine M. Dann konstruiere
eine Turingmaschine M ′ , die wie folgt arbeitet: M ′ akzeptiert alle
Eingaben w 6= ε. Ist w = ε, so simuliert M ′ die Maschine M. Es folgt
H0 = { hMi ∈ { 0, 1 }∗ | ε ∈
/ L(M) } ≤ { hMi ∈ { 0, 1 }∗ | L(M) 6= Σ∗ }
Konstruiere jetzt M ′′ mit:
L(M ′′ ) = { w ∈ Σ∗ | M akzeptiert nicht ε in der Zeit |w | }
Es folgt
H0 ≤ { hMi ∈ { 0, 1 }∗ | L(M) = Σ∗ }
286 / 370
Satz von Rice
Satz 16.5 (Rice)
Sei P eine nicht triviale Eigenschaft aufzählbar Sprachen. Dann ist P
unentscheidbar, d.h., die folgende Sprache ist unentscheidbar.
{ hMi ∈ { 0, 1 }∗ | P(L(M)) ist wahr }
Beweis: Seien Mi für i = 0, 1 zwei Turingmaschinen mit L(M0 ) = ∅
und
¬P(L(M0 )) = P(L(M1 )) = b ∈ { true, false } .
Für eine gegebene Turingmaschine M konstruiere eine Turingmaschine
M ′ , die wie folgt arbeitet:
Eingabe ist ein Wort w ∈ Σ∗ . Zunächst simuliert M ′ in ersten Phase
M auf ε und ignoriert w . Sie macht dann und nur dann weiter, wenn
ε ∈ L(M) gilt. In der zweiten Phase akzeptiert M ′ die Eingabe w
genau dann, wenn w ∈ L(M1 ).
287 / 370
Beweisfortsetzung
Es gilt
ε ∈ L(M) ⇐⇒ L(M ′ ) 6= ∅ ⇐⇒ L(M ′ ) = L(M1 ) ⇐⇒ P(L(M ′ )) = b
Also
H0 = { hMi ∈ { 0, 1 }∗ | ε ∈ L(M) } ≤
M ′ ∈ { 0, 1 }∗ P(L(M ′ )) = b
288 / 370
Fleißige Biber
Ein Biber ist eine deterministische Turingmaschine B mit Σ = { 1 }
und Γ = { 1, 0 } = { 1, b } sowie Q = { 1, . . . , n }. Wir setzen
|B| = |Q|.
Wir sagen B(0) = n, falls B auf Eingabe ε hält und dann genau n mal
eine 1 auf dem Band steht.
Für jedes n ∈ N ist die Anzahl der Biber B mit |B| ≤ n endlich. Daher
ist die folgende Funktion von N nach N total definiert:
bb(n) = max { B(0) | |B| ≤ n }
Satz 16.6 (Castoridae)
Die Funktion n 7→ bb(n) wächst echt schneller als jede
(Turing-)berechenbare Funktion. Insbesondere ist bb : N → N
unberechenbar.
289 / 370
Biberbeweise
Sei f : N → N durch eine Turingmaschine berechenbar. Es gibt eine
weitere Turingmaschine Mg mit Σ = { 1 } und Γ = { 1, 0 } = { 1, b },
die auf Eingabe |1 ·{z
· · 1} den Wert g (n) = 1 + f (2n) + f (2n + 1)
n-mal
berechnet.
Für jedes genügend große n gibt es nun einen Biber Bn mit höchstens
n Zuständen, der auf Eingabe ε die Ausgabe |1 ·{z
· · 1} erzeugt, danach
n-mal
können wir Mg simulieren und erhalten einen Biber, der auf ε die
Ausgabe
1
· · 1}
| ·{z
g (n)-mal
erzeugt. Dieser Biber benötigt höchstens n + O(1) Zustände. Für k
genügend groß gilt f (k) < bb(k) wegen
f (2n) + f (2n + 1) < bb(2n) ≤ bb(2n + 1)
290 / 370
Das Hilbertprogramm und der Gödel’sche
Unvollständigkeitssatz
291 / 370
Hintergrund
David Hilbert (23. Januar 1862 in Königsberg — 14. Februar 1943 in
Göttingen)
◮
1900: Hilbert stellt auf dem Zweiten Internationalen
Mathematikerkongress in Paris 23 zentrale Probleme der
Mathematik vor.
◮
1920: Aus den ersten beiden entwickelt er das
“Hilbertprogramm”:
Man beweise die Widerspruchsfreiheit der Mathematik.
292 / 370
Der Weg des Hilbertprogramms
Kurt Gödel (28. April 1906 in Brünn, Österreich-Ungarn, heute
Tschechien; – 14. Januar 1978 in Princeton, New Jersey)
◮ 1931: In “Über formal unentscheidbare Sätze der Principia
mathematica und verwandter Systeme” zeigt Gödel, dass das
“Hilbertprogramm” nicht durchführbar ist. Grundlage ist
◮ der Gödel’sche Unvollständigkeitssatz: Zu jedem formalen
Beweissystem B für die elementare Theorie der Arithmetik über
den natürlichen Zahlen gibt es effektiv eine wahre Aussage, die
sich in B nicht herleiten lässt.
Die elementare Theorie der Arithmetik über den natürlichen
Zahlen ist nicht aufzählbar.
◮ 1948: Alfred Tarski zeigt, dass die elementare Theorie der
Arithmetik über den reellen Zahlen entscheidbar ist. (Dies liegt
am Mittelwertsatz und dem daraus folgenden Satz von Rolle.)
◮ 1970: Yuri Matiyasevich (geb. 2.3.47) löste mit 22 Jahren das
10. Hilbert Problem “negativ”: Die Menge der Polynome in
mehreren Variablen und Koeffizienten in Z, die eine ganzzahlige
Lösung haben, ist unentscheidbar.
293 / 370
Formale Semantik
Die imperative Programmiersprache IMP:
Rechnungen von Turingmaschinen können in IMP beschrieben werden
und umgekehrt.
Die Sprache IMP verfügt über drei Arten syntaktischer Konstrukte.
◮
Arithmetische Ausdrücke
(Aexp)
◮
Boolesche Ausdrücke
(Bexp)
◮
Anweisungen bzw. Programme
(Cmd)
294 / 370
Aexp
Syntaktische Definition:
a ::= n | X | (a1 + a2 ) | (a1 − a2 ) | (a1 · a2 )
Dabei ist n ∈ N, X eine Programmvariable, a1 , a2 ∈ Aexp. Die
Klammern können manchmal weggelassen werden, wenn dadurch
keine Mehrdeutigkeit entsteht.
Das heißt also:
1. Natürliche Zahlen und Variablen bilden arithmetische Ausdrücke.
2. Wenn a1 und a2 zu Aexp gehören, dann auch (a1 + a2 ),
(a1 − a2 ), (a1 · a2 ).
3. Sonst gehört nichts zu Aexp.
295 / 370
Bexp
Syntaktische Definition:
b ::= true | a1 < a2 | ¬b | b1 ∧ b2
Dabei seien a1 , a2 ∈ Aexp, b, b1 , b2 ∈ Bexp.
296 / 370
Cmd
Syntaktische Definition:
c ::= skip | X := a | c1 ; c2 |
if b then c1 else c2 fi | while b do c od
(X Variable, a ∈ Aexp, b ∈ Bexp, c, c1 , c2 ∈ Cmd.)
Ein Speicherzustand ist eine Belegung der Programmvariablen mit
natürliche Zahlen.
Semantik: Einem gegebenen Programm c ∈ Cmd und einem
Speicherzustand σ ∈ Σ wird ein neuer Speicherzustand σ ′ ∈ Σ
zugeordnet:
Cmd × Σ →p Σ
(Das p am Pfeil steht für partiell“).
”
297 / 370
Beispiel
Es sei c ∈ Cmd wie folgt definiert.
X2 := 1;
while X1 > 1 do
X2 := X2 · X1 ;
X1 := X1 − 1
od
Speicherzustände werden durch Zahlenpaare definiert, da nur X1 und
X2 vorkommen, Σ = N{ X1 ,X2 } = N2 = N × N.
Die Semantikfunktion von c ist total definiert, da das Programm
immer terminiert. Es gilt (0, k) 7→ (0, 1) = (0, 0!) und (n, k) 7→ (n, n!)
für n ≥ 1. Das Programm berechnet daher die Fakultätsfunktion.
298 / 370
Prädikatenlogik der 1. Stufe über N
Syntaktische Definition von Assn, der Menge der arithmetischen
Formeln :
A ::= b | ∃X : A | ¬A | A1 ∧ A2
Dabei ist b ∈ Bexp, X eine Variable, A1 , A2 ∈ Assn.
Es gibt also freie und gebundene Variable. Sind alle Variablen in A
gebunden, so ist A ein Satz und ein Wahrheitswert definiert. Sind alle
Variablen frei, so erhalten wir A ∈ Bexp.
Es gilt also
Aexp ⊆ Bexp ⊆ Assn
Die elementare Theorie über N ist die folgende Teilmenge von Assn:
Th(N) = { F ∈ Assn | F ist ein gültiger Satz } .
299 / 370
Der Gödel’sche Unvollständigkeitssatz nach Turing
Satz 16.7 (Gödel’scher Satz aus Sicht von Turing)
Die elementare Theorie über N ist nicht aufzählbar. Die folgende
Sprache ist also weder aufzählbar noch ist ihr Komplement aufzählbar.
Th(N) = { hF i ∈ { 0, 1 }∗ | F ∈ Assn ∧ F ist ein gültiger Satz }
Proof.
Idee: Für jeden Satz in F ∈ Assn gilt entweder hF i ∈ Th(N) oder
h¬F i ∈ Th(N) (aber nicht beides). Wäre Th(N) aufzählbar, dann
auch entscheidbar. Dies kann jedoch nicht sein:
Zu einer Turingmaschine M konstruieren wir eine Formel FM in zwei
freien Variablen X , Y mit der Eigenschaft:
ε ∈ L(M) ⇐⇒ ∃Y : FM (0, Y ) ⇐⇒ FM (0, 1)
Dies zeigt dann { hMi ∈ { 0, 1 }∗ | ε ∈ L(M) } ≤ Th(N).
300 / 370
Das Gödelsche β–Prädikat
Lemma 5.2.3 Das Prädikat β : N4 → B sei definiert durch
β(a, b, i , n) ⇔ n = a mod (1 + b(i + 1)).
Seien t, n0 , . . . , nt ∈ N. Dann gibt es Zahlen a, b ∈ N so, dass für alle
i ∈ {0, . . . , t} und alle n ∈ N gilt:
β(a, b, i , n) ⇔ n = ni .
Beweis: Wähle b ∈ N mit t! | b und b ≥ max{n0 , . . . , nt }. Etwa:
b = max{t, n0 , . . . , nt }!
Zeige: ggT(1 + b(i + 1), 1 + b(j + 1)) = 1 (für 0 ≤ i < j ≤ t). Mit
dem Chinesischen Restsatz folgt die Existenz einer Zahl n, für die
n = ni mod (1 + b(i + 1)) für i ∈ {0, . . . , t} gilt.
301 / 370
Der Gödel’sche Unvollständigkeitssatz
Satz 16.8 (Gödel, 1931)
Zu jedem formalen Beweissystem B für elementare Theorie über N
existiert effektiv eine wahre Formel, die in B nicht beweisbar ist.
Ein (formales) Beweissystem B für einen Teilmenge A ⊆ { 0, 1 }∗ ist
eine entscheidbare Sprache B ⊆ { 0, 1 }∗ zusammen mit einer totalen
und berechenbaren Funktion b : B → A. Sei jetzt B = (B, b)
Beweissystem für Th(N). Wir zeigen, dass wir effektiv einen wahren
Satz F ∈ Th(N) konstruieren können, der nicht im Bild von b ist.
Damit kann B nicht alle wahren Sätze herleiten.
Wir schreiben, ⊢ F , falls F im Bild b(B) liegt. Beachte, ⊢ F impliziert
F ∈ Th(N) nach Definition eines Beweissystems.
302 / 370
Zunächst beachten wir, dass Assn und auch die Teilmenge der
arithmetischen Formeln mit einer freien Variablen Assn1 aufzählbar
ist. Zu F (X ) ∈ Assn1 finden wir also effektiv ein G ∈ N (ihre
Gödelnummer) mit F (X ) = FG (X ).
Assn1 = { F0 (X ), F1 (X ), F2 (X ), . . . } .
Beispielsweise könnte F42 (X ) die Formel ∃Y : 6 · Y = X sein. Dann
gilt etwa F42 (42) ∈ Th(N) und F42 (43) ∈
/ Th(N).
Die Menge
{ G ∈ N | ⊢ FG (G ) }
aufzählbar und kann durch ein IMP-Programm berechnet werden.
Es gibt daher effektiv ein c ∈ Cmd und eine arithmetische Formel
Fc (X , Y mit
Fc (G , 1) ⇐⇒ ⊢ FG (G ).
Wir finden ein U ∈ N und FU (X ) ∈ Assn1 mit
FU (X ) = Fc (X , 1).
303 / 370
Der nächste Schritt ist Diagonalisierung. Wir betrachten D ∈ N mit
FD (X ) = ¬FU (X ) ∈ Assn1 und überlegen, ob FD (D) gilt.
Angenommen, FD (D) ist falsch. Dann gilt FU (D) = Fc (D, 1) und
⊢ FD (D). Das Beweissystem liefert eine falsche Aussage her und ist
daher nicht korrekt. Dies ist widerspricht der Definition von
Beweissystemen.
Also ist FD (D) wahr! Damit ist FU (D) falsch und damit auch nicht
⊢ FD (D). Das Beweissystem ist also nicht vollständig, da es die wahre
Aussage FD (D) nicht herleiten kann.
Umgangssprachlich ist FD (D) die Aussage
Ich bin nicht beweisbar.
304 / 370
Teil 3: Reduktionen und vollständige Probleme
Seien L ⊆ Σ∗ und L′ ⊆ Σ′ ∗ zwei Entscheidungs-Probleme.
Eine Reduktion von L auf L′ ist eine totale berechenbare Abbildung
f : Σ∗ → Σ′ ∗ mit: x ∈ L ⇐⇒ f (x) ∈ L′ .
Angenommen, wir kennen bereits einen Algorithmus zur Lösung von
L′ . Dann können wir die Frage x ∈ L wie folgt entscheiden:
1. Berechne den Wert f (x) ∈ Σ′ ∗
2. Entscheide mittels des Algorithmus für L′ ob f (x) ∈ L′ gilt.
x
✲
Mf
f (x)
✲
ML′
✲ ja
✲ nein
ML
305 / 370
Polynomialzeitreduktionen
Eine Reduktion f : Σ∗ → Σ′ ∗ von L auf L′ ist eine
Polynomialzeitreduktion, falls sich f durch eine deterministische
polynomialzeitbeschränkte Turingmaschine berechnen lässt.
Proposition
L′ ∈ P und ∃ Polynomialzeitreduktion von L auf L′
=⇒
L ∈ P.
Beweis: Angenommen L′ gehört zu DTIME(nk ) und f kann in Zeit
nℓ berechnet werden.
Für ein Eingabe x ∈ Σ∗ der Länge n kann f (x) in Zeit nℓ berechnet
werden.
Damit muss |f (x)| ≤ nℓ gelten, und es kann in Zeit (nℓ )k = nk·ℓ
entschieden werden, ob f (x) ∈ L′ (d.h. x ∈ L) gilt.
Gesamter Zeitbedarf: nℓ + nk·ℓ
306 / 370
Eine Bemerkung zu Polynomialzeit- und
logspace-Reduktionen
Wir schreiben auch
L ≤p L′
falls es eine Polynomialzeitreduktion von L auf L′ gibt.
Analog zu Polynomialzeitreduktion kann man auch
logspace-Reduktionen definieren, die sich in logarithmischem Platz
berechnen lassen müssen. Hier schreiben wir
′
L ≤log
m L
falls es eine logspace-Reduktion von L auf L′ gibt. (Das tiefgestellte m
steht für many-one“.)
”
Alle hier behandelten Reduktionen sind sogar in logarithmischem
Platz berechenbar. Die folgenden Folien sind daher zumeist mit der
feineren logspace-Reduzierbarkeit formuliert.
307 / 370
Beispiel für Polynomialzeitreduktion
Sei G = (A, B, E ) ein bipartiter Graph, d.h. A ∩ B = ∅ und
E ⊆ A × B.
Ein Matching M ist eine Teilmenge M ⊆ E so, dass keine zwei
Kanten aus M einen gemeinsamen Endknoten haben.
Wir zeigen, wie das Problem, ein Matching maximaler Größe zu
berechnen, sehr effizient auf die Berechnung eines Maximalflusses in
einem Netzwerk reduziert werden kann.
Ein Netzwerk ist ein Tupel N = (V , E , s, t, c), wobei:
◮ (V , E ) ein gerichteter Graph ist (d.h. E ⊆ V × V )
◮ s ∈ V ist die Quelle, t ∈ V ist die Senke, s 6= t,
◮ c : E → N ordnet jeder Kante e eine Kapazität c(e) > 0 zu.
Ein Fluß F ist eine Abbildung F : E → N mit:
P
P
◮ ∀v ∈ V \ {s, t} :
(x,v )∈E F (x, v ) =
(v ,y )∈E F (v , y )
(Flußerhaltung)
◮ ∀e ∈ E : F (e) ≤ c(e).
308 / 370
Beispiel für Polynomialzeitreduktion
Ein Fluß maximaler Größe kann in polynomialer Zeit mittels des
Max-Flow = Min-Cut-Theorems von Ford-Fulkerson (siehe Flüsse
”
und Schnitte“ im ersten Teil der Vorlesung) werden.
Die Reduktion von Maximum Matching auf Max-Flow startet mit
einem bipartiten Graphen G = (A, B, E ).
Konstruiere ein Netzwerk N = (V , E ′ , s, t, c) wie folgt:
◮
◮
◮
V = A ∪ B ∪ {s, t} (wobei s und t neue Knoten sind)
E ′ = E ∪ {(s, a) | a ∈ A} ∪ {(b, t) | b ∈ B}
c(x, y ) = 1 für alle (x, y ) ∈ E ′
Sei F : E ′ → N ein Fluß maximaler Größe in N.
Dann ist M = {e ∈ E | F (e) = 1} ein Matching maximaler Größe
in G .
309 / 370
Beispiel für Polynomialzeitreduktion
Sei G = (A, B, E ) ein bipartiter Graph:
A
B
310 / 370
Beispiel für Polynomialzeitreduktion
Füge eine Quelle s und eine Senke t an:
A
s
B
t
311 / 370
Beispiel für Polynomialzeitreduktion
Berechne einen maximalen Fluß:
A
s
B
t
312 / 370
Beispiel für Polynomialzeitreduktion
Hieraus ergibt sich die Lösung des Matchingproblems:
A
B
313 / 370
Vollständige Probleme
Definition
1. Sei C eine Komplexitätsklasse.
Ein Problem L ⊆ Σ∗ heißt schwierig für C oder kurz C-schwierig
(bzgl. logspace-Reduktionen), falls gilt: ∀K ∈ C : K ≤log
m L.
2. Sei C eine Komplexitätsklasse. Ein Problem L ⊆ Σ∗ heißt
C-vollständig (bzgl. logspace-Reduktionen), falls L schwierig für C
ist und zusätzlich L ∈ C gilt.
314 / 370
GAP ist NL-vollständig
Wir geben ein erstes Beispiel:
Satz 17.1
Das Grapherreichbarkeitsproblem GAP ist NL-vollständig.
Beweis:
GAP ∈ NL wurde bereits gezeigt.
Sei L ∈ NL, sei M eine nichtdeterministische
logspace-platzbeschränkte Turingmaschine mit L = L(M).
Wir definieren eine Reduktion f wie folgt: Für w ∈ Σ∗ sei
f (w ) = (G , s, t) mit:
◮ G = (V , E ) ist der gerichtete Graph mit:
V
E
◮
◮
= {α | α ist Konfig. von M bei Eingabe w , |α| ≤ log(|w |)}
= {(α, β) | α, β ∈ V , α ⊢M β}
s = Start(w )
t = die (o.B.d.A) eindeutige akzeptierende Konfiguration von M.
315 / 370
GAP ist NL-vollständig
Offensichtlich gilt:
w ∈ L(M) ⇐⇒ in G gibt es einen gerichteten Pfad von s nach t.
f kann offensichtlich in logarithmischen Platz berechnet werden.
316 / 370
2-SAT ist NL-vollständig
Satz 17.2
Das Problem 2-SAT = 2-KNF ∩ SAT ist NL-vollständig.
Aufgrund des Satzes von Szelepcsényi-Immermann genügt es, die
NL-Vollständigkeit von 2−NSAT = {Φ ∈ 2-KNF : Φ 6∈ SAT } zu
zeigen.
317 / 370
NL-Schwierigkeit
◮
2−NSAT ist NL-schwierig:
Sei GAP das Grapherreichbarkeitsproblem. Wir zeigen
GAP ≤log
m 2−NSAT. Sei G = (V , E ) ein gerichteter Graph und
s, t ∈ V . Aus jedem Knoten u machen wir eine Variable gleichen
Namens und aus jeder Kante (u, v ) ∈ E eine Implikation u ⇒ v ,
also die Klausel ¬u ∨ v . Desweiteren fügen wir die Klauseln s und
¬t hinzu.
Offensichtlich ist die so konstruierte Formel unerfüllbar, wenn in
G ein Weg von s nach t existiert.
Ist ein solcher Weg nicht vorhanden, so können alle Variablen,
deren zugehörige Knoten von s aus erreichbar sind, zu wahr und
alle übrigen zu falsch gesetzt werden. Dies definiert eine die
Formel erfüllende Belegung.
318 / 370
2−NSAT liegt in NL
Gegeben sei eine 2-KNF-Formel Φ in den Variablen x1 , . . . , xn .
Wir konstruieren einen Graphen mit Knotenmenge
V = {x1 , . . . , xn , x1 , . . . , xn }.
Jede Klausel α ∨ β lesen wir als Implikation und führen daher zwei
Kanten α → β und β → α ein.
α ∨ β ⇔ (α ⇒ β) ∧ (β ⇒ α)
∗
Behauptung: Es gibt genau dann einen Knoten x und Pfade x −→ x
∗
sowie x −→ x, wenn Φ unerfüllbar ist.
Somit kann die Nichterfüllbarkeit von Φ mit Hilfe des NL-Algorithmus
für Grapherreichbarkeit überprüft werden.
319 / 370
Beweis der Behauptung
,,⇒” ist einfach: Die Klauseln, welche zu den Kanten gehören, die die
Pfade bilden, ergeben die Implikationen x ⇒ ¬x und ¬x ⇒ x. Wir
können also weder x noch ¬x auf wahr setzen.
,,⇐”: Nun nehmen wir an, dass für jede Variable x höchstens einer
∗
∗
der Pfade x −→ x oder x −→ x existiert.
Wir können annehmen, dass genau einer dieser Pfade existiert:
∗
∗
Denn existiert weder x −→ x noch x −→ x, so füge die Kante x → x
hinzu. (D.h. C = x ∨ x = x)
320 / 370
Beweis der Behauptung
∗
Angenommen, wir hätten durch Hinzunahme von x −→ x einen Kreis
mit α und α erzeugt.
Dann benutzt dieser Kreis die Kante x → x, also erhalten wir eines
∗
der folgender Bilder, wobei −→ alte Kanten bezeichnet.
∗
∗
∗
∗
α −→ x → x −→ α −→ α −→ x
∗
∗
∗
∗
α −→ x → x −→ α −→ x → x −→ α
∗
Damit hatte der ursprüngliche Graph einen Pfad x −→ x, im
Widerspruch zur Annahme. Durch Wiederholung der Hinzunahme von
Kanten erreichen wir, dass schließlich immer genau einer dieser Pfade
∗
∗
existiert: x −→ x oder x −→ x.
321 / 370
2-SAT ist NL-vollständig
∗
Wir setzen jetzt x zu wahr, falls x −→ x und zu falsch, wenn
∗
x −→ x. Diese Belegung ist erfüllend: Wir betrachten eine beliebige
Klausel C = α ∨ β und nehmen an, dass β = falsch gilt (sonst ist C
ohnehin schon erfüllt). Dann gibt es nach der Konstruktion der
∗
Belegung einen Weg β −→ β. Außerdem gibt es wegen der Klausel C
die Kanten α → β und β → α. Wir erhalten somit den Weg
∗
α → β −→ β → α.
Damit gilt α = wahr. Also ist die Klausel erfüllt.
322 / 370
Teil 4: NP-Vollständigkeit
323 / 370
Generische NP-Vollständigkeit
Sei hw , Mi eine Codierung eines Wortes w ∈ Σ∗ und einer
nichtdeterministischen Turingmaschine M.
LGen = {hw , Mi $m |w ∈ Σ∗ , M nichtdeterministische Turingmaschine,
m ∈ N, M hat bei Eingabe w eine akzeptierende
Berechnung der Länge ≤ m}
Satz 17.3
LGen ist NP-vollständig.
Beweis:
LGen ∈ NP:
Für eine Eingabe hw , Mi $m simuliere M bei Eingabe w
nichtdeterministisch für maximal m Schritte.
Dies ist ein nichtdeterministischer Polynomialzeitalgorithmus für LGen .
324 / 370
Generische NP-Vollständigkeit
LGen ist NP-schwierig:
Sei L ∈ NP beliebig und M eine nk -zeitbeschränkte
nichtdeterministische Turingmaschine mit L = L(M) (k ist eine
Konstante).
Die Reduktion von L auf LGen berechnet nun in logarithmischem Platz
auf eine Eingabe w ∈ Σ∗ die Ausgabe
k
f (w ) = w , M $n .
Es gilt: w ∈ L(M) ⇐⇒ f (w ) ∈ LGen .
325 / 370
Der Satz von Cook und Levin
Sei Σ0 = {¬, ∧, ∨, ⇒, ⇔, 0, 1, (, ), x}.
Sei A ⊆ Σ∗0 die Menge aller aussagenlogischen Formeln über der
Variablenmenge V = x1{0, 1}∗ .
A ⊆ Σ∗0 ist deterministisch kontextfrei und gehört damit zu
DTIME(n).
Sei SAT = {F ∈ A | F ist erfüllbar}.
(Eine aussagenlogische Formel F ist erfüllbar, wenn es eine Belegung
B : Var(F ) → {true, false} der in F vorkommenden Variablen mit
Wahrheitswerten gibt, unter der sich F zu true auswertet.)
Satz von Cook (und Levin)
SAT ist NP-vollständig.
326 / 370
Beweis des Satzes von Cook/Levin
(A) SAT ∈ NP: Für ein F ∈ Σ∗0 überprüfen wir F ∈ SAT“ wie folgt:
”
1. Teste in Zeit O(|F |) ob F ∈ A gilt.
2. Falls JA“, rate eine Belegung B : Var(F ) → {true, false}.
”
3. Akzeptiere, falls F sich unter der Belegung B zu true auswertet.
(B) SAT ist NP-schwierig.
Sei L ∈ NP.
Zu w ∈ Σ∗ konstruieren wir eine Formel f (w ) mit
w ∈L
⇐⇒ f (w ) erfüllbar .
Die Abbildung f wird logspace berechenbar sein.
Sei M = (Q, Σ, Γ, δ, q0 , F , b) eine p(n)-zeitbeschränkte
nichtdeterministische Turingmaschine mit L = L(M)
(p(n) ist ein Polynom).
Sei w = w1 w2 · · · wn ∈ Σ eine Eingabe der Länge n.
327 / 370
Beweis des Satzes von Cook/Levin
Wir stellen o.B.d.A. folgende Forderungen an M:
1. M hat nur ein Band, auf dem die Eingabe zu Beginn steht, und
auf das geschrieben werden darf.
2. F = {qf }, d.h. es gibt nur einen Endzustand.
3. Bei Eingabe w ∈ Σ∗ hält M nie, aber nach p(n) Schritten sind
wir genau dann im Endzustand, wenn w von M akzeptiert wird.
4. Nach p(n) Schritten ist der Schreib-Lesekopf wieder auf der
Ausgangsposition.
5. (q, a, q ′ , a′ , D), (q, b, p ′ , b ′ , D ′ ) ∈ δ =⇒ a = b, a′ = b ′ , D = D ′
Nur hinsichtlich des Folgezustand q ′ haben wir also eine
nichtdeterministische Wahl. Idee: Siehe nächste Folie.
328 / 370
Übergänge als Regelsystem
Die Übergänge einer TM können als Ersetzungssystem wie bei
Grammatiken gedeutet werden.
Für ρ = (q, a, q ′ , a′ , R) ∈ δ erhalten wir qa −→ q ′ a′ .
Für ρ = (q, a, q ′ , a′ , L) ∈ δ erhalten wir bqa −→ q ′ ba′ .
Wir splitten die Regeln in mehrere Teilregeln auf. Hierfür gibt es für
jeden Übergang ρ einen neuen Zustand qρ und auch ggf. qρ′ . 1.
Ersetze qa −→ q ′ a′ durch:
qa −→ qρ a und qρ a −→ q ′ a′ .
2. Ersetze bqa −→ q ′ ba′ durch:
q −→ qρ , qρ a −→ qρ′ a′ und bqρ′ −→ q ′ b für jedes b.
329 / 370
Beweis des Satzes von Cook/Levin
Aus Punkt (1) folgt, dass jede von der Startkonfiguration erreichbare
Konfiguration durch ein Wort aus
Conf = {buqv b | q ∈ Q; u, v ∈ Γ∗ ; |uv | = p(n)}
beschrieben werden.
Die Startkonfiguration ist bq0 w bp(n)+1−n .
Wegen Punkt (2) und (4) sind die akzeptierenden Konfigurationen
diejenigen aus bqf Γp(n) b.
Notation: Für ein α ∈ Conf schreiben wir
α = α[−1]α[0] · · · α[p(n)]α[p(n) + 1]
wobei α[−1] = b, α[0], . . . , α[p(n)] ∈ Q ∪ Γ, α[p(n) + 1] = b.
330 / 370
Beweis des Satzes von Cook/Levin
Definiere die Menge der 4-Tupel
∆ = {(a, b, c, b) | a, b, c ∈ Γ}
∪ {(c, b, q, p), (b, q, a, b), (q, a, d, a′ ) | (q, a, p, a′ , ←) ∈ δ, c, b, d ∈ Γ}
∪ {(c, b, q, b), (b, q, a, p), (q, a, d, a′ ) | (q, a, p, a′ , N) ∈ δ, c, b, d ∈ Γ}
∪ {(c, b, q, b), (b, q, a, a′ ), (q, a, d, p) | (q, a, p, a′ , →) ∈ δ, c, b, d ∈ Γ}
Wegen Punkt (5) gilt dann für alle α, α′ ∈ b(Q ∪ Γ)∗ b mit |α| = |α′ |:
α, α′ ∈ Conf und α ⊢M α′
⇐⇒
α ∈ Conf und ∀i ∈ {0, . . . , p(n)} : (α[i − 1], α[i ], α[i + 1], α′ [i ]) ∈ ∆.
331 / 370
Beweis des Satzes von Cook/Levin
Beispiel:
Falls (q, a, p, a′ , ←) ∈ δ ist folgende lokale Bandänderung für alle
b ∈ Γ möglich:
Position
i−1
i
i+1
α
=
···
···
b
q
a
···
···
α′
=
···
···
p
b
a′
···
···
Falls (q, a, p, a′ , →) ∈ δ ist folgende lokale Bandänderung für alle
b ∈ Γ möglich:
Position
α = ···
α′
=
···
···
···
i−1
b
i
q
i+1
a
b
a′
p
···
···
···
···
332 / 370
Beweis des Satzes von Cook/Levin
Eine Rechnung von M können wir nun als Matrix beschreiben:
α0
α1
= b
= b
α0,0
α1,0
α0,1
α1,1
..
.
...
...
αp(n) = b αp(n),0 αp(n),1 . . .
α0,p(n)
α1,p(n)
b
b
αp(n),p(n) b
Für jedes Tripel (a, i , t) (a ∈ Q ∪ Γ, −1 ≤ i ≤ p(n) + 1,
0 ≤ t ≤ p(n)) sei x(a, i , t) aussagenlogische Variable.
Interpretation: x(a, i , t) = true genau dann, wenn zum Zeitpunkt t
das i -te Zeichen der aktuellen Konfiguration ein a ist.
333 / 370
Beweis des Satzes von Cook/Levin
Als Teilformeln definieren wir folgende Hornformeln:
^^
Konsistenzformel C (n) =
(¬X (a, i , t) ∨ ¬X (b, i , t)).
i ,t a6=b
Randformel
R(n) =
^
t
X (b, −1, t) ∧
Startformel
S(w ) =
X (qo , 0, 0) ∧
Accept-Formel
^
1≤i ≤n
^
X (b, p(n) + 1, t).
t
X (ai , i , 0) ∧
^
X (b, i , 0).
n<i
Accept(n) =X ($, 0, p(n)).
334 / 370
Beweis des Satzes von Cook/Levin
Übergangsformel
D(n) =
^
i ≥0, t>0
(a,b,c)∈(Γ∪Q)3
X (a, i − 1, t − 1) ∧ X (b, i , t − 1) ∧ X (c, i + 1, t − 1)
→
_
d∈Γ∪Q mit
(a,b,c,d)∈∆
X (d, i , t) .
Endformel
ϕ(w ) = C (n) ∧ R(n) ∧ S(w ) ∧ Accept(n) ∧ D(n).
Diese Formel ist in konjunktiver Normalform.
Falls M deterministisch ist, dann ist es sogar eine Hornformel.
Die Klauseln, welche nur negative Literale enthalten, sind alle
Klauseln in C (n) und die in D(n), bei denen die Disjunktion leer ist.
335 / 370
Beweis des Satzes von Cook/Levin
Die Formel
ϕ′ (w ) = C (n) ∧ R(n) ∧ S(w ) ∧ D(n)
ist immer erfüllbar.
Die erfüllenden Belegungen entsprechen Rechnungen von M.
Am Wert Accept(n) können wir einer solchen Belegung ansehen, ob
sie erfolgreich ist.
336 / 370
P Vollständigkeit von HORNSAT
Aus dem Beweis ergibt sich unmittelbar:
HORNSAT ist P-vollständig.
337 / 370
Weitere NP-vollständige Probleme: (1) SAT ∩ KNF
Definition: Literale, KNF
Ein Literal x̃ ist eine aussagenlogische Variable oder die Negation
einer aussagenlogischen Variablen.
Statt ¬x schreiben wir auch x. Außerdem sei x = x.
Sei KNF (bzw. DNF) die Menge der aussagenlogischen Ausdrücke in
konjunktiver Normalform (bzw. disjunktiver Normalform):
DNF = {F | F ist Disjunktion von Konjunktionen von Literalen}
KNF = {F | F ist Konjunktion von Disjunktionen von Literalen}
Fakt: Jede aussagenlogische Formel F gibt es äquivalente Formeln
DNF(F ) ∈ DNF und KNF(F ) ∈ KNF.
338 / 370
Weitere NP-vollständige Probleme: (1) SAT ∩ KNF
Beispiel:
F =
^
i =1,...,k
_
j=1,...,m
x̃i ,j
!
≡
_
f ∈{1,...,m}{1,...,k}
^
x̃i ,f (i )
i =1,...,k
!
= F′
Beachte:
◮
|F | = m · k während |F ′ | = mk · k, d.h. eine KNF-Formel mit k
Disjunktionen der Länge m kann in eine äquivalente DNF-Formel
bestehend aus mk Konjunktionen der Länge k umgewandelt
werden.
◮
Für Formeln in DNF kann Erfüllbarkeit deterministisch in
quadratischer Zeit überprüft werden.
◮
Wir haben gezeigt, dass Erfüllbarkeit für Formeln in KNF
NP-vollständig ist.
Deswegen ist der exponentielle Blow-Up bei der Umwandlung von
KNF in DNF nicht überraschend.
339 / 370
SAT ∩ KNF ist NP-vollständig
Satz 17.4
SAT ∩ KNF ist NP-vollständig.
Beweis: Siehe Beweis von Cook/Levin.
340 / 370
3-SAT ist NP-vollständig
Definition: 3-SAT
Sei 3-KNF die Menge der Formeln in konjunktiver Form mit genau
drei Literalen je Klausel:
3-KNF := {F ∈ KNF | Jede Klausel in F enthält genau drei Literale}
3-SAT sei die Teilmenge der davon erfüllbaren Formeln:
3-SAT := 3-KNF ∩ SAT
Satz 17.5
3-SAT ist NP-vollständig.
Beweis: Das Problem ist NP. Daher ist in nur die NP-Schwierigkeit
zu zeigen.
Wir zeigen: SAT ∩ KNF ≤log
m 3-SAT.
Sei F eine KNF-Formel. Wir unterscheiden drei Fälle:
341 / 370
3-SAT ist NP-vollständig
1. F enthält eine Klausel (x̃) mit nur einem Literal.
Führe neue Variable y ein und ersetze (x̃) durch (x̃ ∨ y ) ∧ (x̃ ∨ y ).
Dies hat auf die Erfüllbarkeit von F keine Auswirkung.
2. F enthält eine Klausel (x̃ ∨ ỹ ) mit zwei Literalen.
Führe neue Variable z ein und ersetzte (x̃ ∨ ỹ ) durch
(x̃ ∨ ỹ ∨ z) ∧ (x̃ ∨ ỹ ∨ z).
3. F enthält Klauseln mit mehr als drei Literalen.
Sei also c = (x̃1 ∨ x̃2 ∨ · · · ∨ x̃k ) eine solche Klausel mit k ≥ 4
Literalen.
Führe k − 3 neue Variablen v (x̃3 ), v (x̃4 ), . . . , v (x̃k−2 ), v (x̃k−1 ) ein
und ersetzen c durch
c
′
=
^
k−2
v (x̃i ) ∨ x̃i ∨ v (x̃i +1 )
x̃1 ∨ x̃2 ∨ v (x̃3 ) ∧
i =3
∧ v (x̃k−1 ) ∨ x̃k−1 ∨ x̃k .
342 / 370
3-SAT ist NP-vollständig
Beachte: c ′ kann auch geschrieben werden als
c′ =
^
k−2
v (x̃i ) ⇒ x̃i ∨ v (x̃i +1 )
x̃1 ∨ x̃2 ∨ v (x̃3 ) ∧
i =3
∧ v (x̃k−1 ) ⇒ x̃k−1 ∨ x̃k .
Dass (3) nichts an der Erfüllbarkeit ändert folgt aus folgenden
Punkten:
(A) Sei σ eine erfüllende Belegung für c.
Dann muss σ(x̃i ) = 1 für ein 1 ≤ i ≤ k gelten.
Erweitere σ zu einer erfüllenden Belegung von c ′ durch:
(
1 falls j ≤ i
′
σ (v (x̃j )) =
0 falls j > i
343 / 370
3-SAT ist NP-vollständig
(B) Sei σ ′ eine erfüllende Belegung für c ′ .
Angenommen σ ′ (x̃i ) = 0 für alle 1 ≤ i ≤ k.
=⇒ σ ′ (v (x̃3 )) = 1 (da σ ′ (x̃1 ∨ x̃2 ∨ v (x̃3 )) = 1)
Mit Induktion folgt: σ ′ (v (x̃i )) = 1 für alle 3 ≤ i ≤ k − 1.
=⇒ σ ′ (v (x̃k−1 ) ∨ x̃k−1 ∨ x̃k )) = 0 Widerspruch!
344 / 370
Übersicht
1.) 2-SAT is NL vollständig. (Wurde hier nicht gezeigt.)
2.) HORNSAT is P vollständig.
3.) 3-SAT is NP vollständig.
4.) QBF is PSPACE vollständig. (Wurde hier noch nicht gezeigt.)
345 / 370
Integer Programming
Es sei
LinProg(Z) := {hA, bi | A ∈ Zm×n , b ∈ Zm×1 , ∃x ∈ Zn×1 : Ax ≥ b}
Zahlen aus Z werden hier binär kodiert.
Satz 17.6
LinProg(Z) ist NP-vollständig.
Beweis:
(1) LinProg(Z) ∈ NP:
Dies ist der schwierige Teil des Beweises, siehe z. B. Hopcroft,
Ullman; Introduction to Automata Theory, Languages and
Computation, Addison Wesley 1979
346 / 370
Integer Programming
(2) LinProg(Z) ist NP-schwierig.
Wir zeigen 3-SAT ≤log
m LinProg(Z).
Sei F = c1 ∧ c2 ∧ · · · ∧ cq eine Formel in 3-KNF.
Seien x1 , . . . , xn die Variablen in F .
Wir bilden das folgende System S von Z-Ungleichungen über den
Variablen xi , xi , 1 ≤ i ≤ n:
1. xi ≥ 0, 1 ≤ i ≤ n
2. xi ≥ 0, 1 ≤ i ≤ n
3. xi + xi ≥ 1, 1 ≤ i ≤ n
4. −xi − xi ≥ −1, 1 ≤ i ≤ n
5. x̃j1 + x̃j2 + x̃j3 ≥ 1, für jede Klausel cj = (x̃j1 ∨ x̃j2 ∨ x̃j3 ).
347 / 370
Integer Programming
(3) und (4)
=⇒
xi + xi = 1
(1) und (2)
=⇒
xi = 1, xi = 0 oder xi = 0, xi = 1
(5)
=⇒
in jeder Klausel cj hat mindestens ein Literal
x̃ij den Wert 1
Also: S lösbar genau dann, wenn F erfüllbar.
Größe von S: 4n + q Ungleichungen, 2n Variablen.
Schreiben wir S in Matrixform Ax ≥ b, so hat A (bzw. b)
(4n + q) × 2n (bzw. 4n + q) Einträge von Absolutbetrag ≤ 1.
Bemerkungen:
◮
◮
Obiger Beweis zeigt, dass LinProg(Z) bereits bei unärer
Kodierung NP-schwierig ist.
LinProg(Q) ∈ P. Dieser Nachweis ist sehr schwierig und beruht
auf der Ellipsoidmethode von Khachiyan.
348 / 370
Vertex Cover ist NP-vollständig
Eine Knotenüberdeckung (vertex cover) für einen ungerichteten
Graphen G = (V , E ) ist eine Teilmenge C ⊆ V so, dass für jede
Kante {u, v } ∈ E gilt: {u, v } ∩ C 6= ∅
Vertex Cover (VC) ist das folgende Problem:
Eingabe: Ein ungerichteter Graph G = (V , E ) und ein k ≥ 0.
Frage: Hat G Knotenüberdeckung C mit |C | ≤ k?
Satz 17.7
VC ist NP-vollständig.
Beweis:
(1) VC ∈ NP: Rate eine Teilmenge C der Knoten mit |C | ≤ k und
überprüfe danach in Polynomialzeit, ob C eine Knotenüberdeckung ist.
(1) VC ist NP-schwierig:
Wir zeigen 3-SAT ≤log
m VC.
349 / 370
Vertex Cover ist NP-schwierig
Sei
F = c1 ∧ · · · ∧ cq
eine Formel in 3-KNF, wobei
f
cj = (f
xj1 ∨ xf
j2 ∨ x
j3 ).
Wir konstruieren einen Graphen G (F ) wie folgt:
f
Zunächst bilden wir zu jeder Klausel cj = (f
xj1 ∨ xf
j2 ∨ x
j3 ) den
folgenden Graphen G (cj ):
xf
j3
xf
j1
xf
j2
350 / 370
Vertex Cover ist NP-schwierig
S
Der Graph G (F ) entsteht aus der disjunkten Vereinigung qj=1 G (cj )
aller dieser Teilgraphen G (cj ) durch Einfügen aller Kanten (x, x ) (x
ist eine Variable aus F ).
Beispiel:
Für die Formel F = (x ∨ y ∨ z) ∧ (x ∨ s ∨ r ) ∧ (y ∨ s ∨ z) ∧ (x ∨ s ∨ r )
führt diese Konstruktion zu folgendem Graphen G (F ):
z
x
r
y
x
r
z
s
y
s
x
s
351 / 370
Vertex Cover ist NP-schwierig
Beachte: In G (F ) kann es kein Vertex Cover U mit weniger als 2q
Knoten geben, da in jedem der q Dreiecke mindestens 2 Knoten zu U
gehören müssen.
Behauptung:F ∈ 3-SAT genau dann, wenn G (F ) ein Vertex Cover U
mit |U| = 2q hat.
(A) Sei σ eine erfüllende Belegung für F .
Dann wird in jeder Klausel cj mindestens ein Literal xeji wahr.
Sei U eine Knotenmenge, die für jeden Teilgraphen G (cj ) genau ein
erfülltes Literal auslässt.
Dann gilt |U| = 2q und U ist ein Vertex-Cover.
352 / 370
Vertex Cover ist NP-schwierig
(B) Sei U ein Vertex-Cover mit |U| = 2q.
Dann enthält U aus jedem Teilgraphen G (cj ) genau zwei Knoten.
Definiere Belegung


1
σ(x) = 0


0
σ durch
falls eine Kopie von x nicht zu U gehört.
falls eine Kopie von x nicht zu U gehört.
falls alle Kopien von x und x zu U gehören.
Beachte: Da U ein Vertex Cover ist, und alle Kanten (x, x) in G (F )
vorhanden sind, wird keine Variable gleichzeitig auf 0 und 1 gesetzt.
Offensichtlich gilt σ(F ) = 1.
353 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Ein Hamilton-Pfad in einem gerichteten Graphen G = (V , E ) ist eine
Folge von Knoten v1 , v2 , . . . , vn mit
◮
◮
(vi , vi +1 ) ∈ E für alle 1 ≤ i ≤ n − 1 und
für jeden Knoten v ∈ V existiert genau ein 1 ≤ i ≤ n mit v = vi .
Ein Hamilton-Kreis ist ein Hamilton-Pfad v1 , v2 , . . . , vn mit
(vn , v1 ) ∈ E .
Es sei
HP = {G | G ist ein Graph mit einem Hamilton-Pfad}
HC = {G | G ist ein Graph mit einem Hamilton-Kreis}
Satz 17.8
HP und HC sind NP-vollständig (sogar für ungerichtete Graphen).
354 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Beweis: Wir zeigen nur die NP-Vollständigkeit von HC.
(A) HC ∈ NP: trivial.
(B) 3-SAT ≤log
m HC:
Sei F = c1 ∧ c2 ∧ · · · ∧ cm eine Formel in 3-KNF mit den Klauseln
c1 , . . . , cm in den Variablen x1 , . . . , xn .
Wir konstruieren einen Graphen G (F ), der genau dann einen
Hamilton-Kreis hat, falls F ∈ SAT gilt.
Zunächst definieren wir zu jeder Klausel c folgenden Graphen G (c):
b4
b3
a34
a33
a32
a31
b2
a24
a23
a22
a21
b1
a14
a13
a12
a11
355 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Beachte:
◮
In G (c) gibt es keinen Hamilton-Pfad von b1 nach b4 .
◮
Lässt man jedoch in G (c) mindestens einen der Wege
bj − aj1 − aj2 − aj3 − aj4 − bj+1 , j ∈ {1, 2, 3} weg, so gibt es
einen Hamilton-Pfad von b1 nach b4 .
Für eine Variable x sei {ci1 , . . . , cik } die Menge der Klauseln mit
x ∈ ci und {cj1 , . . . , cjl } die Menge der Klauseln mit x ∈ cj .
O.B.d.A i1 < · · · < ik , j1 < · · · < jℓ sowie ∀p, q : ip 6= jq .
Zu jeder Variablen x definieren wir nun einen Graphen G (x):
ei1 1
ei1 2
ei1 3
ei1 4
eik 1 eik 2 eik 3
eik 4
ej1 1
ej1 2
ej1 3
ej1 4
ejl 1
ejl 4
ejl 2
ejl 3
356 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
G (xn )
G (ck )
G (ci )
G (c1 )
G (xj )
G (x1 )
Den Graphen G (F ) bilden wir durch Zusammenfügen der bisher
konstruierten Graphen nach dem folgenden Muster:
Zusätzlich benötigen wir für jede Klausel ck = (x̃k1 ∨ x̃k2 ∨ x̃k3 ) noch
Verbindungen zwischen dem Graphen G (ck ) und den Graphen G (xki ):
357 / 370
′′
ek4
′′
ek3
′′
ek2
a34
a33
a32
G (ck )
b4
b3
a24
a31
′
ek4
′′
ek1
G (xk2 )
′
ek3
a23
′
ek2
a22
a21
a14
b2
a13
a12
ek3
ek4
′
ek1
G (xk1 )
b1
a11
ek2
ek1
G (xk3 )
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Wir verbinden also für i ∈ {1, . . . , 3} und q ∈ {1, . . . , 4} den Knoten
aiq in G (ck ) mit dem Knoten ekq aus G (xki ) über einen neuen
Zwischenknoten.
358 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Beispiel: Sei F = (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ).
{z
} |
{z
}
|
c1
c2
G (c2)
G (c1)
G (x1)
G (x2)
G (x3)
Dann ist G (F ) der folgende Graph:
359 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Behauptung: F ∈ SAT genau dann, wenn G (F ) einen
Hamilton-Kreis hat.
Angenommen σ ist eine erfüllende Belegung von F .
Wir erhalten einen Hamilton-Kreis für G (F ) wie folgt:
Der Weg führt über die erfüllten Literalen entsprechenden Knoten in
den G (xi ), wobei jedoch über die zuletzt eingefügten Verbindungen in
jedem G (ck ) genau eine Knotengruppe ai 1 − ai 2 − ai 3 − ai 4 besucht
wird.
Dies ist möglich, da in jeder Klausel mindestens ein Literal erfüllt ist.
Nachdem so alle G (xi ) durchwandert wurden, werden die in den
G (ck ) verbleibenden Knoten und die zugehörigen Knoten in den G (xi )
besucht.
Anschließend endet der Weg im Startknoten.
360 / 370
Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig
Sei C ein Hamilton-Kreis für G (F ).
Dieser durchläuft in jedem der Graphen G (xi ) einen der beiden
Zweige.
Dies definiert eine erfüllende Belegung σ von F .
361 / 370
Rucksackproblem
Erinnerung: Beim Rucksack-Problem sind Zahlen a1 , . . . , an , s ∈ N
binär kodiert gegeben und die Frage
P ist, ob es eine Menge
I ⊆ { 1, . . . , n } gibt so, dass s = i ∈I ai .
Satz 17.9
Das Rucksack-Problem ist NP-vollständig.
P
Wir können I ⊆ { 1, . . . , n } raten und dann s = i ∈I ai verifizieren.
Daher liegt das Problem in NP.
Die NP-Schwierigkeit erhält man durch eine einfache Reduktion von
3-SAT auf dieses Problem.
362 / 370
Varianten algorithmischer Probleme
Beispiel 1: Traveling Salesman Problem (TSP)
Ein Reisender will eine gegebene Anzahl von Städten besuchen, ohne
dabei an einem Ort zweimal vorbeizukommen, und er will dabei den
kürzesten Weg nehmen. Das Wegenetz kann als gerichteter Graph
und die Wegstrecken als Gewichte auf den Kanten des Graphen
aufgefasst werden. Die Knoten stellen die Städte dar.
Sei G = (V , E , γ : E → N) ein gerichteter Graph mit Knotenmenge
V = {1, ..., n}, Kantenmenge E ⊆ V × V und den Kantengewichten
γ(e) > 0 für alle e ∈ E .
Ein Rundweg W ist gegeben durch eine Folge W = (x0 , . . . , xn ),
x0 = xn , xi 6= xj für 1 ≤ i < j ≤ n und (xi −1 , xi ) ∈ E für 1 ≤ i ≤ n.
Die Kosten γ(W ) des Rundweges W
Psind durch die Summe der
Kantengewichte gegeben: γ(W ) = ni=1 γ(xi −1 , xi ).
363 / 370
Varianten algorithmischer Probleme
(A) Entscheidungsvariante:
Eingabe: G = (V , E , γ : E → N) und ein k ≥ 0.
Frage: Existiert ein Rundweg mit Kosten ≤ k? D.h., existiert ein Weg
der alle Knoten genau einmal besucht und dessen Kosten höchstens k
sind?
(B) Berechnungsvariante:
Eingabe: G = (V , E , γ : E → N) und ein k ≥ 0.
Ziel: Falls ein Rundweg W mit γ(W ) ≤ k existiert, berechne ein
solches W .
(C) Optimierungsproblem:
Eingabe: G = (V , E , γ : E → N).
Ziel: Berechne einen kostenoptimalen Rundweg, falls ein Rundweg
existiert.
In allen drei Varianten
ist die Eingabegröße (bis auf einen konstanten
P
Faktor) |V | + e∈E log(γ(e))(+ log(k)).
364 / 370
Varianten algorithmischer Probleme
Aus praktischer Sicht ist Variante (C) (Optimierungsproblem) am
wichtigsten.
Aber: (A) in Polynomialzeit lösbar
lösbar.
=⇒
(C) in Polynomialzeit
Beweis:
1. Schritt:
Überprüfe, ob überhaupt ein Rundweg existiert:
P
Rufe hierzu (A) mit kmax = e∈E γ(e) auf.
Beachte: Es existiert ein Rundweg genau dann, wenn ein Rundweg mit
Kosten ≤ kmax existiert.
Im Folgenden nehmen wir an, dass ein Rundweg existiert.
365 / 370
Varianten algorithmischer Probleme
2. Schritt:
Berechne kopt = min{γ(W ) | W ist ein Rundweg} mittels binärer
Suche:
FUNCTION kopt
kmin := 1 (oder alternativ kmin := |V |)
while kmin < kmax do
min
⌉
kmitte := kmin + ⌈ kmax −k
2
if ∃ Rundweg W mit γ(W ) ≤ kmitte then kmax := kmitte
else kmin := kmitte + 1
endif
endwhile
return kmin
ENDFUNC
Beachte: Die Anzahl der Durchläufe P
durch die while-Schleife
ist
P
beschränkt durch log2 (kmax ) = log2 ( e∈E γ(e)) ≤ e∈E log(γ(e)).
366 / 370
Varianten algorithmischer Probleme
3. Schritt:
Berechne optimalen Rundweg wie folgt:
FUNCTION optimaler Rundweg
Sei e1 , e2 , . . . , em beliebige Auflistung von E
G0 := G
for i := 1 to m do
if ∃ Rundweg W in Gi −1 \ {ei } mit γ(W ) ≤ kopt then
Gi := Gi −1 \ {ei }
else
Gi := Gi −1
endif
endfor
return Gm
ENDFUNC
367 / 370
Varianten algorithmischer Probleme
Behauptung: Für alle i ∈ {0, . . . , m} gilt:
1. In Gi existiert ein Rundweg W mit γ(W ) = kopt .
2. Jeder Rundweg W in Gi mit γ(W ) = kopt benutzt alle Kanten
aus {e1 , . . . , ei } ∩ E [Gi ] (E [Gi ] = Menge der Kanten von Gi ).
Beweis:
1. Folgt sofort durch Induktion über i .
2. Angenommen es gibt einen Rundweg W in Gi mit γ(W ) = kopt
sowie eine Kante ej (1 ≤ j ≤ i ) mit:
◮ e gehört zum Graphen G
j
i
◮ e gehört nicht zum Weg W
j
W ist auch ein Rundweg in Gj−1 . ⇒
W ist ein Rundweg in Gj−1 \ {ej }. ⇒
ej gehört nicht zu Gj und damit nicht zu Gi . Widerspruch
Konsequenz: Gm hat einen Rundweg W mit γ(W ) = kopt und jede
Kante von Gm gehört zu W .
⇒ Gm = W
368 / 370
Varianten algorithmischer Probleme
Beispiel 2: Vertex Cover (VC)
Sei G = (V , E ) ein ungerichteter Graph (d.h. E ⊆ V2 ).
Eine Teilmenge C ⊆ V ist eine Knotenüberdeckung von G falls für
jede Kante {u, v } ∈ E gilt: {u, v } ∩ C 6= ∅
(A) Entscheidungsvariante:
Eingabe: G = (V , E ) und ein k ≥ 0.
Frage: Hat G Knotenüberdeckung C mit |C | ≤ k?
(B) Berechnungsvariante:
Eingabe: G = (V , E ) und ein k ≥ 0.
Ziel: Falls eine Knotenüberdeckung C mit |C | ≤ k existiert, berechne
ein solches C .
(C) Optimierungsproblem:
Eingabe: G = (V , E ).
Ziel: Berechne eine möglichst kleine Knotenüberdeckung von G .
369 / 370
Varianten algorithmischer Probleme
Wieder gilt: (A) in Polynomialzeit lösbar =⇒ (C) in Polynomialzeit
lösbar.
Zeigen Sie dies als Übung.
370 / 370
Herunterladen