Modul: Algorithmen und Berechenbarkeit WS 2012/13 Volker Diekert1 8. Februar 2013 1 Übungen: Alexander Lauser und Armin Weiß 1 / 369 Teil 1: Algorithmen 2 / 369 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 / 369 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 / 369 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 1 Stunde Rechenzeit 60.000 4.893 244 39 15 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 / 369 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 / 369 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 / 369 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 / 369 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 / 369 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 / 369 Beispiel binäre Suchbäume Beispiel 1.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 / 369 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 / 369 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 / 369 Untere Schranken / Beispiel Sortieren Einer der schwierigen Aspekte der Algorithmentheorie ist die Suche nach unteren Schranken. Satz 1.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 / 369 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 1.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 / 369 Lösung einfacher Rekursionsgleichungen Satz 1.4 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 . 16 / 369 Beweis des Satzes k = 0 : Es gilt n =b 0 = und t(1) = g(1). P1k−1 n n mit Induktion, k > 0 : Daher t b = i=0 ai · g bi+1 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 b i+1 ai · g ai · g n bi n bi ! + a0 g + g (n) n b0 . 17 / 369 Mastertheorem I Korollar 1.5 (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. 18 / 369 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 ( b c ) nach dem Satz. ∞ X a i 1 ∈ O(nc ). = 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). 19 / 369 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 · ∈ = = = 20 / 369 Beispiel Mergesort Algorithmus 1.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 21 / 369 Mastertheorem II Satz 1.6 (Mastertheorem II) Sei r > 0, Pr i=0 αi < 1 und für eine Konstante c sei ! r X t(n) ≤ t(⌈αi n⌉) + c · n i=0 Dann gilt t(n) ∈ O(n). 22 / 369 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(n) ≤ t(⌈αi n⌉) + cn ≤ i=0 r X i=0 γ⌈αi n⌉ ! + cn (mit Induktion) ≤ (γ(1 − ε) + c)n ≤ γn 23 / 369 1. Vorlesung am 23.10.2012 Newsticker am 15.10.12: Der diesjährige Nobelpreis für ” Wirtschaftswissenschaften geht an die US-Amerikaner Alvin E. Roth und Lloyd S. Shapley. Damit werde 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. 24 / 369 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. 25 / 369 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). 26 / 369 Vermeidung von Scheidungen: Gale, Shapley 1962 Satz 2.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. 27 / 369 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 ′ ). 28 / 369 Beweis 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. 29 / 369 Beweis Wir sagen, dass ein Paar (a, b) ∈ A × B realisierbar ist, wenn (a, b) in einer stabilen Heirat vorkommt. Wir sagen, dass ein Paar (a, b) ∈ A × B instabil ist, wenn (a, b) in keiner stabilen Heirat vorkommt. Behauptung: Angenommen, a hat 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 war stabil, denn das erste realisierbare Paar wird nach Annahme ist (a, b). Also gilt (a, b), (a′ , b ′ ) ∈ M und aus Sicht von b ′ gilt a > a′ . Treffen also (a, b), (a′ , b ′ ) aufeinander, so verlassen a und b ′ ihre Partner und bilden ein neues Paar (a, b ′ ). 30 / 369 Folgerungen aus der Behauptung Gale-Shapley berechnet eine stabile Heirat: Am Ende sind 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 ihn 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 keinen Scheidungen kommen und das Verfahren ist stabil. Das Verfahren ist für die Männer optimal, denn sie 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. 31 / 369 2. Vorlesung am 25.10.2012 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 32 / 369 Entwurfstrategien Gierige Algorithmen – Greedy Algorithms 33 / 369 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). 34 / 369 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. 35 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 ∞ 1 6 3 8 2 13 4 ∞ 3 ∞ 6 ∞ 36 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 1 7 6 3 8 2 13 4 ∞ 3 ∞ 6 14 37 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 1 7 6 3 8 2 4 11 7 13 3 6 14 38 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 1 7 6 3 8 2 4 11 7 13 3 6 13 39 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 1 7 6 3 8 2 4 9 7 13 3 6 13 40 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 1 7 6 3 8 2 4 9 7 13 3 6 12 41 / 369 Beispiel Dijkstra-Algorithmus Startknoten 0 1 3 1 7 6 3 8 2 4 9 7 13 3 6 12 42 / 369 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). 43 / 369 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 44 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 ∞ 3 8 2 -13 4 ∞ ∞ 3 6 ∞ 45 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 7 3 8 2 -13 4 ∞ ∞ 3 6 ∞ 46 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 7 3 8 2 -13 4 11 7 3 6 ∞ 47 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 7 3 8 2 -13 4 11 7 3 6 13 48 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 7 3 8 2 -13 4 9 7 3 6 13 49 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 7 3 8 2 -13 4 9 7 3 6 12 50 / 369 Problem negativer Kantengewichte Startknoten 0 1 1 6 3 7 3 8 2 -13 4 9 7 3 6 12 51 / 369 Problem negativer Kantengewichte Startknoten 0 1 −∞ 3 −∞ 6 3 8 2 4 Negativer Zyklus -13 7 −∞ 3 6 −∞ 52 / 369 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. 53 / 369 Minimale Aufspannende Bäume Definition 3.1 Ein Graph G = (V , E ) heißt zusammenhängend, wenn je zwei Knoten durch einen Pfad verbunden sind. Definition 3.2 Ein Baum ist ein zusammenhängender, kreisfreier, ungerichteter Graph. Bemerkung 3.3 Jeder Baum mit n Knoten besitzt genau n − 1 Kanten. Definition 3.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). 54 / 369 Beispiel Prim-Algorithmus, 1 Startknoten 1 3 6 8 2 4 13 3 6 55 / 369 Beispiel Prim-Algorithmus, 2 Startknoten 1 3 6 8 2 4 13 3 6 56 / 369 Beispiel Prim-Algorithmus, 3 Startknoten 1 3 6 8 2 4 13 3 6 57 / 369 Beispiel Prim-Algorithmus, 4: Decrease Key Startknoten 1 3 6 8 2 4 13 3 6 58 / 369 Beispiel Prim-Algorithmus, 5 Startknoten 1 3 6 8 2 4 13 3 6 59 / 369 Beispiel Prim-Algorithmus, 6 Startknoten 1 3 6 8 2 4 13 3 6 60 / 369 Beispiel Prim-Algorithmus, 7 Startknoten 1 3 6 8 2 4 13 3 6 61 / 369 Beispiel Prim-Algorithmus, 8 Startknoten 1 3 6 8 2 4 13 3 6 62 / 369 Beispiel Prim-Algorithmus, 9 Startknoten 1 3 6 8 2 4 13 3 6 63 / 369 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 64 / 369 Korrektheit des Prim-Algorithmus Idee: Austauschsatz Bi−1 y′ Ri−1 ∈T y v (x) 6∈ T x 65 / 369 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. 66 / 369 3. Vorlesung, 30.10.12 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. 67 / 369 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 C1 6= ∅ = 6 C2 und C1 ∩ C2 = ∅ . 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 , C 2 ) mit s ∈ C1 und t ∈ C2 . P Für A ⊆ V , v ∈ V setze g (A, v ) = a∈A γ(av ). Oder einheitlich: X γ(ab) g (A, B) = a∈A,b∈B 68 / 369 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 } 69 / 369 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. 70 / 369 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 ′ ). 71 / 369 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.) 72 / 369 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 ) 73 / 369 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). 74 / 369 Korrektheitslemma Lemma 4.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 ) 75 / 369 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. 76 / 369 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)). 77 / 369 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) 78 / 369 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. 79 / 369 Phase Algorithmus 4.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 ∗) 80 / 369 Berechnung eines minimalen Schnittes Algorithmus 4.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 ∗) 81 / 369 Berechnung eines minimalen Schnittes Algorithmus 4.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 . ∗) 82 / 369 Berechnung eines minimalen Schnittes Algorithmus 4.4 Fortsetzung und Ende von Min Cut if gphase ≤ g then C1 := V \ {t}; C2 := {t}; g := gphase ; endif return (C1 , C2 , g ) endfunction 83 / 369 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. 84 / 369 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. 85 / 369 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. 86 / 369 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. 87 / 369 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. 88 / 369 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. 89 / 369 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. 90 / 369 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. 91 / 369 Übung: Wie verhält sich der Algorithmus bei negativen Kantengewichten, bleibt er korrekt? 92 / 369 Antwort: siehe Übungen :-) 93 / 369 4. und 5. Vorlesung am 6. und 8.11.2012 Thema: Randomisierte Verfahren 1. Las Vegas (Quicksort) vs Monte Carlo (Primzahlerkennung, Fermat-Test). 2. Monte Carlo für minimale Schnitte nach David Clifford Karger und Stein: A New Approach to the Minimum Cut Problem Journal of the ACM (1996) 601-640. 94 / 369 Monte-Carlo- und Las-Vegas-Algorithmen Monte-Carlo-Algorithmen sind randomisierte Algorithmen, die bei beschränkter Laufzeit mit einer kleinen Wahrscheinlichkeit ein falsches Ergebnis liefern dürfen. 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. 95 / 369 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 . 96 / 369 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) 97 / 369 Die maximale Anzahl minimaler Schnitte Folgerung: Die Anzahl der minimalen Schnitte ist durch n2 begrenzt, denn jeder minimale Schnitt wird ja mit mindestens der 2 W’keit n(n−1) gefunden. 98 / 369 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 . 99 / 369 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. 100 / 369 Karger-Stein-Algorithmus √ Sei G der Eingabegraph mit n Knoten, n = ( 2)k . (Wir vernachlässigen bewusst Rundungsfehler und kleine n.) Sei C ein fester minimaler Schnitt. Berechnung von C : 1.) Wiederhole das √ Folgende zweimal: 2.) Wähle n − n/ 2-mal eine Zufallskante und kontrahiere jeweils die entsprechende Kante. ◮ ◮ ◮ ◮ 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 ′ . 3.) 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. 101 / 369 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 − 102 / 369 Lösung der Rekursion pk+1 ≥ pk − pk2 /4 Ansatz, definiere eine reelle Zahl zk ≥ 3 durch: 4 pk = zk + 1 Also: 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 103 / 369 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 104 / 369 Finde minimale Schnitte mit hoher W’keit Satz 4.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 2 n 2n 105 / 369 6. Vorlesung, 13.11.2012 Entwurfstrategie: Teile und Beherrsche – Divide and Conquer Beispiele für Divide and Conquer: ◮ Quicksort ◮ Mergesort ◮ Multiplikation ganzer Zahlen (Karatsuba 1960) ◮ Matrixmultiplikation (Strassen 1969) 106 / 369 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! 107 / 369 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. 108 / 369 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. ” 109 / 369 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: A12 B12 C12 A11 B11 C11 = A22 B22 C22 A21 B21 C21 110 / 369 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! 111 / 369 Matrixmultiplikation nach Strassen Berechne das Produkt von 2 × 2 Matrizen mit 7 Multiplikationen: M1 := M2 := M3 := M4 := M5 := M6 := M7 := (A12 − A22 )(B21 + B22 ) C11 = (A11 + A22 )(B11 + B22 ) C12 = (A11 − A21 )(B11 + B12 ) C21 = M6 + M7 C22 = M2 − M3 + M5 − M 7 (A11 + A12 )B22 A11 (B12 − B22 ) M1 + M2 − M4 + M 6 M4 + M5 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... ) 112 / 369 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. Theoretisch liefert der Coppersmith–Winograd-Algorithmus eine bessere Schranke. Beste bekannte Schranke 2012: O(n2,3727 ). 113 / 369 7. Vorlesung, 15.11.2012 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 114 / 369 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. 115 / 369 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] 116 / 369 Bestimmung reguläre Ausdrücke: Gesamtschrittalgorithmus Algorithmus 6.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 117 / 369 Bestimmung reguläre Ausdrücke: Einzelschrittalgorithmus Algorithmus 6.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 118 / 369 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 119 / 369 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 ). 120 / 369 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] 121 / 369 Transitive Hülle Algorithmus 6.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 122 / 369 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. 123 / 369 Transitive Hülle? Algorithmus 6.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 124 / 369 Antwort Antwort in den Übungen 125 / 369 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. 126 / 369 Floyd-Algorithmus Algorithmus 6.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 127 / 369 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 ): 128 / 369 Floyd-Algorithmus Algorithmus 6.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 129 / 369 Floyd-Algorithmus Algorithmus 6.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 130 / 369 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 n−1 k A∗ = k=0 A . 131 / 369 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 ). 132 / 369 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. 133 / 369 Berechnung der Transitive Hülle 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 = F∗ F ∗ BD ∗ ∗ ∗ ∗ D CF D + D ∗ CF ∗ BD ∗ . 134 / 369 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 i · M(n/2i ) 2 k≥0 i P 2 ≤ c · k≥0 2+ε · M(n) T (n) ≤ c · P (nach Mastertheorem) (da M(n/2) ≤ 1 2+ε M(n)) ∈ O(M(n)). 135 / 369 Beispiel: Multiplikation einer Matrizenfolge Multiplikation von links (10 × 1) (1 × 10) (10 × 1) (1 × 10) (10 × 1) 136 / 369 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) 137 / 369 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) 138 / 369 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) 139 / 369 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) 140 / 369 Beispiel: Multiplikation einer Matrizenfolge Multiplikation von links Insgesamt: 400 Multiplikationen 141 / 369 Beispiel: Multiplikation einer Matrizenfolge Multiplikation von rechts (10 × 1) (1 × 10) (10 × 1) (1 × 10) (10 × 1) 142 / 369 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) 143 / 369 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) 144 / 369 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) 145 / 369 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) 146 / 369 Beispiel: Multiplikation einer Matrizenfolge Multiplikation von rechts Insgesamt: 40 Multiplikationen 147 / 369 Beispiel: Multiplikation einer Matrizenfolge Multiplikation in optimaler Reihenfolge (10 × 1) (1 × 10) (10 × 1) (1 × 10) (10 × 1) 148 / 369 Beispiel: Multiplikation einer Matrizenfolge (10 × 1) (1 × 10) (10 × 1) (10 × 1) (1 × 10) (10 × 1) (1 × 10) 10 Multiplikationen (10 × 1) (1 × 1) 149 / 369 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) 150 / 369 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) 151 / 369 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) 152 / 369 Beispiel: Multiplikation einer Matrizenfolge Insgesamt: 31 Multiplikationen 153 / 369 8. Vorlesung, 20.11.2012 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 154 / 369 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. N 3 2 1 . , . . . , M(n , M(n , M(n Eingabe: Matrizenfolge M(n 2 ,n3 ) 1 ,n2 ) 0 ,n1 ) 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 } 155 / 369 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] 156 / 369 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 und berechne M[1, N] rekursiv: Setze M[i, i] = M(n i−1 ,ni ) M[i, j] = M[i, best[i, j]] · M[best[i, j] + 1, j]. 157 / 369 Thema: Optimale Suchbäume 158 / 369 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. 159 / 369 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. 160 / 369 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 ℓ(v ) · γ(v ) P(B) := v ∈V minimiert. 161 / 369 Optimale Suchbäume Optimaler Suchbaum für 1, 2, 22 , 23 , 24 , 25 mittels Greedy-Strategie. 25 24 23 22 2 1 162 / 369 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 163 / 369 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 164 / 369 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. 165 / 369 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}. 166 / 369 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. 167 / 369 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 ′ ). 168 / 369 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. 169 / 369 Optimale Suchbäume Die folgende Beobachtung (von Knuth) ist entscheidend. Satz 6.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. 170 / 369 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. 171 / 369 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 : j 1 Bi : j2 1 i1 i2 .. 2 .. . n . ij j n i 172 / 369 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. 173 / 369 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. 174 / 369 Optimale Suchbäume Angenommen i2 = j2 , also m = 2. Wir erhalten das folgende Bild. Beachte i1 ≥ j1 . Bi : 1 B ′ : i1 i1 i2 = j2 j2 i2 .. .. . ij . n n 2 j i 175 / 369 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. 176 / 369 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. 177 / 369 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. 178 / 369 Optimale Suchbäume Pα ✻ Pα (Bn ) Pα (Bℓ ) Pα (Bi ) Pα (Bk ) Pα (Bj ) ✲ α0 α 179 / 369 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. 180 / 369 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! 181 / 369 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 182 / 369 Optimale Suchbäume Laufzeit: n−1 n−d X X d=1 i=1 n−1 X (1 + r [i + 1, i + d] − r [i, i + d − 1]) = 3 (n − d + r [n − d + 1, n] − r [1, d]) ≤ n2 ∈ Θ(n2 ). 2 d=1 Bemerkung 6.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 gilt: aus einem beliebigen Feld mit n Elementen kann ein optimaler Suchbaum in Θ(n2 ) Schritten erzeugt werden. ◮ Der Algorithmus von Knuth wird in vielen Lehrbüchern nur ohne Beweis erwähnt. 183 / 369 9. Vorlesung, 22.11.2012 Mittlere Höhe binärer Suchbäume Zunächst eine Wiederholung 184 / 369 Bezeichnungen ◮ ◮ ◮ π: Permutation von {1, . . . , n} Schreibe π als Folge (π(1), π(2), π(3), . . . , π(n)) BI (π), I ⊆ {1, . . . , n}: Suchbaum mit den Elementen i ∈ I , eingefügt in der Reihenfolge (links nach rechts) von π. (i ∈ I wird vor j ∈ I eingefügt, wenn π −1 (i) < π −1 (j) gilt.) ◮ Zufallsvariablen: Wurzel von B(π) ist i.“ ∈ {0, 1} ” XI (π) = Höhe von BI (π).“ ” YI (π) = 2XI (π) (Dies ist der Trick!) Ri (π) = 185 / 369 Erwartungswerte XI (π) = Höhe von BI (π).“ ”X (π) YI (π) = 2 I Ziel: E [Xn ] ∈ O(log n). (unter der Annahme einer Gleichverteilung der Permutationen.) Wir zeigen zunächst (denn dies ist einfacher!): E [Yn ] ∈ O(n3 ). 186 / 369 Berechnung von E [Yn ] n = 1: E [Y1 ] = 1. n ≥ 2: E [Yn ] = 2 n X i=1 E [Ri · max{Y{1,...,i−1} , Y{i+1,...,n} }] P Denn Yn (π) = 2 ni=1 (Ri (π) · max{Y{1,...,i−1} (π), Y{i+1,...,n} (π)}). Man beachte, dass Ri (π) = 1, falls π(1) = i ist, und Ri (π) = 0 andernfalls. 187 / 369 Berechnung von E [Yn ] Für i 6∈ I sind die Zufallsvariablen YI und Ri unabhängig. Also gilt: E [Yn ] = 2 n X i=1 Es gilt E [Ri ] = 1 n E [Ri ] · E [max{Y{1,...,i−1} , Y{i+1,...,n} }] und max{YI , YJ }(π) ≤ YI (π) + YJ (π). Also: n 2X (E [Y{1,...,i−1} ] + E [Y{i+1,...,n} ]). E [Yn ] ≤ n i=1 Aufgrund der Linearität der Erwartungswerte und der Eigenschaft E [YI ] = E [Y{1,...,|I |} ] = E [Y|I | ] gilt: n E [Yn ] ≤ 2X (E [Yi−1 ] + E [Yn−i ]) n i=1 188 / 369 Berechnung von E [Yn ] Aus n E [Yn ] ≤ erhalten wir E [Yn ] ≤ 2X (E [Yi−1 ] + E [Yn−i ]) n i=1 n n−1 n−1 i=1 i=0 i=1 4X 4X 4X E [Yi−1 ] = E [Yi ] = E [Yi ]. n n n Da jeder Term in der Summe oben rechts zweimal gezählt wird und ein leerer Baum nicht betrachtet werden muss. 189 / 369 Berechnung von E [Yn ] Wir werden jetzt zeigen, dass E [Yn ] ≤ n = 1: E [Y1 ] = 1 = 1 4 n ≥ 2: n−1 E [Yn ] ≤ = 4 3 . 4X E [Yi ] n Induktion i=1 1 · n n+3 4 1 4 ≤ = n+3 3 4X1 n 4 n+3 3 . n−1 i=1 1 · 4 gilt. i +3 3 n−1 1X < n i=0 i +3 3 190 / 369 Berechnung von E [Xn ] Ableitung von E [Xn ] aus E [Yn ]: Sei X : Ω → R eine diskrete Zufallsvariable. Dann berechnet sich der Erwartungswert durch X X E [X ] = Prob(i) · X (i) = λi xi mit xi = X (i), λi = Prob(i). i i Für eine konvexe Funktion f folgt dann aus der Jensen’schen Ungleichung: X f (E [X ]) ≤ λi f (xi ) = E [f (X )]. i 191 / 369 Berechnung von E [Xn ] Jensen’sche Ungleichung: f (E [X ]) ≤ E [f (X )]. In unserem Fall ist die konvexe Funktion f (x) = 2x : (n + 3)(n + 2)(n + 1) 24n3 1 n+3 = ≤ . 2E [Xn ] ≤ E [2Xn ] = E [Yn ] ≤ 3 4 24 24 Also E [Xn ] ≤ 3 log2 n ∈ O(log n). 192 / 369 Jensen’sche Ungleichung Sei Pk f : R → R eine konvexe Funktion und λi ≥ 0 für 1 ≤ i ≤ k mit i=1 λi = 1. Dann gilt f k X i=1 λ i xi ! ≤ k X λi f (xi ). i=1 Beweis: Durch Induktion nach k. k = 1: Dann ist λ1 = 1 und die Aussage trivial. 193 / 369 Jensen’sche Ungleichung Schaubild der konvexen Funktion f : λf (x) + (1 − λ)f (y ) x λx + (1 − λ)y y Es gilt also für alle x < y und alle 0 ≤ λ ≤ 1: f (λx + (1 − λ)y ) ≤ λf (x) + (1 − λ)f (y ). 194 / 369 10.-14. Vorlesung, {27, 29}.11.2012 sowie {06, 11, 13}.12.2012 Behandelte Themen: ◮ Backtracking: Geographie und Mautproblem. ◮ Berechnen maximaler Flüsse (bzw. minimaler Flüsse) nach Dinitz. ◮ Median (bzw. select) in Linearzeit. ◮ Durchschnittsanalyse von Quicksort und Quickselect. 195 / 369 Geographie: Ein Spiel mit Städten Das Szenario ist das Zwei-oder Mehrpersonenspiel Geographie. Es spielt z.B. eine Schulklasse gegen“ ihren Lehrer. ” Vorgegeben eine Menge von Städten, z.B. die europäischen Hauptstädte. 1. Eine Partei beginnt mit Nennung einer Hauptstadt. 2. Dann wird in Runden gespielt. 3. Endet ein genannter Hauptstadtname auf den Buchstaben A“, ” so muss die andere Partei eine noch nicht genannte Hauptstadt nennen, die mit A“ beginnt. ” 4. Gelingt es nicht, so hat die Partei verloren. 196 / 369 Hauptstädte Europas Reykjavik Oslo Stockholm Helsinki Tallinn Moskau Riga Kopenhagen Dublin Wilna Minsk London Amsterdam Berlin Warschau Kiew Brüssel Prag Luxemburg Paris Bern Bratislava Wien Vaduz Budapest Ljubljana Zagreb Andorra Madrid Monaco San Marino Rom Sarajevo Chisinau Belgrad Bukarest Sofia Podgorica Skopje Lissabon Ankara Tirana Athen Nikosia Valetta 197 / 369 Polynomialzeitlösung bei festem Alphabet Eingabe: n ≥ 1 Städte über einem Alphabet mit k Buchstaben wobei k konstant sei, etwa k = 26. Codiere die Eingabe als k × k-Matrix, wobei k konstant sei, etwa k = 26. Dann hat diejenige Person, die beginnt, eine Gewinnstrategie; und diese ist in Polynomialzeit mittels dynamisches Programmieren berechenbar. Denn: Es gibt genau codieren. n+k 2 k2 verschiedene Matrizen, die m ≤ n Städte 198 / 369 Das Millionenspiel A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A 6 5 4 3 0 2 3 3 0 1 4 5 3 1 2 4 0 0 7 1 1 2 0 0 1 0 B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 3 2 0 0 0 2 1 2 0 0 0 0 3 1 0 1 0 1 0 0 0 0 1 0 0 0 E 1 3 0 0 0 0 0 1 1 0 1 1 1 0 0 3 0 1 1 1 0 0 0 0 1 0 F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 G 0 1 2 0 0 0 2 2 0 2 2 1 0 2 0 4 0 1 4 2 0 0 0 1 0 0 H 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 2 0 0 0 1 0 0 0 0 0 0 I 1 1 2 2 0 0 0 2 0 0 4 1 2 1 0 0 0 1 2 0 1 1 1 0 0 0 J 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 K 0 1 0 2 0 0 0 0 0 0 0 0 1 3 1 0 0 0 0 1 0 0 0 0 0 0 L 0 1 0 0 0 0 1 0 1 0 1 0 2 2 0 0 0 0 1 0 0 0 0 0 0 0 M 0 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 N 3 2 2 3 1 1 0 4 3 2 1 2 4 0 1 0 0 2 2 4 0 0 2 1 0 0 O 2 1 1 0 0 0 0 0 0 0 3 0 3 0 0 0 1 0 6 3 0 0 0 0 0 0 P 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Q 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 R 2 0 0 1 0 0 0 0 1 2 2 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 S 0 1 2 2 1 0 1 0 0 0 0 2 1 0 0 1 0 0 0 3 0 0 0 0 0 0 T 0 4 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 2 1 1 0 0 0 0 0 0 U 0 3 1 1 0 1 2 1 0 0 0 2 2 0 1 0 0 0 2 0 0 0 1 1 0 1 V 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 W 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 Y 1 0 1 1 0 0 0 0 0 0 0 0 2 0 0 0 1 0 1 0 0 0 0 0 0 0 Z 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 Abbildung: Spielmatrix für das Millionenspiel mit 305 Städten 199 / 369 Versuch und Irrtum Bei 305 Städten würde der Ansatz über das dynamische Programmieren hoffnungslos versagen. Potentiell sind größenordnungsmäßig bis zu 305676 = 30526×26 Matrizen zu berechnen. Lösung: Tricks und Backtracking! 200 / 369 Backtracking Sucht man in einem Baum, so ist zum Beispiel Tiefensuche ein effizientes Verfahren, wenn sich frühzeitig entscheidet, ob in einem Teilbaum eine Lösung zu finden ist oder nicht. Backtracking (dt. Zurückgehen“) beschreibt ein solches Verfahren, ” bei dem man im Berechnungsgraphen eines Problems solange vorwärts geht, bis ein Knoten erreicht wird, der eine Lösung darstellt oder bei dem sicher davon ausgegangen werden kann, dass von diesem Knoten aus keine Lösung mehr zu finden ist. Ist dies der Fall, dann geht man den Pfad einen Schritt zurück und entscheidet sich für einen anderen Folgepfad u.s.w.. Backtracking findet Anwendung bei Problemen bei denen man auf schlanke Suchbäume hofft. Wir betrachten nach dem Spiel der Geographie jetzt das sogenannte Mautstraßenproblem (engl. Turnpike-Problem). 201 / 369 Mautproblem Beispiel 8.1 Fährt man in Frankreich über die Autobahn nach Paris, so muss Maut gezahlt werden. Man bekommt hierzu eine Karte, die eine Tabelle mit den Entfernungen und Gebühren zwischen den Ein- und Ausfahrten enthält. Die Frage ist nun: lässt sich die Lage der Ausfahrten aus den Entfernungen rekonstruieren, wenn nur eine geordnete Liste der Entfernungen mit ihren Vielfachheiten vorliegt? Wir suchen also eine Lösung für folgendes Problem: Es seien 0 = x0 < x1 < · · · < xn positive Zahlenwerte und A eine n × n-Matrix mit Ai,j = |xi − xj |. Weiterhin sei D ein Feld, das die Werte Ai,j , 1 ≤ i < j ≤ n, in sortierter Reihenfolge enthält. Gesucht sind die Werte xk für 1 ≤ k ≤ n, wenn D gegeben ist. 202 / 369 Mautproblem Bemerkung 8.2 1. Sind die Werte xk bekannt, dann kann A (bzw. D) in O(n2 ) (bzw. in O(n2 log n)) Schritten berechnet werden. 2. Sei D bekannt. Ist die Folge x0 , . . . , xn eindeutig bestimmt, falls sie existiert? Wie komplex ist dann die Rekonstruktion? Die erste Frage kann mit Nein beantwortet werden. Selbst dann existiert keine eindeutige Lösung, wenn in D alle Einträge verschieden sind (bis jetzt wurde aber kein Beispiel für n > 6 gefunden). 203 / 369 Mautproblem (Prozedur maut) procedure maut(var X : XFeld; var D: DFeld; n: integer; var found: boolean); begin found := false; X0 := 0; (* Initialisierung linker und rechter Rand *) Xn := max(D); D := D − max(D); (* D aktualisieren *) X1 := Xn − max(D); (* X1 kann wegen Symm. so gewählt werden *) if (X1 − X0 ) ∈ D then D := D − {|X1 − X0 |, |Xn − X1 |}; place(X , D, n, 1, n, found) endif endprocedure 204 / 369 Mautproblem (Prozedur place) if D = ∅ then found := true else d := max(D); (* probiere Xl+1 := Xn − d *) D ′ := {|Xj − (Xn − d)| | j ∈ {0, . . . , l} ∪ {r , . . . , n}}; if D ′ ⊆ D then Xl+1 := Xn − d; D := D − D ′ ; (* D aktualisieren *) place(X , D, n, l + 1, r , found); (* rekursiv Lösung suchen *) if found = false then (* falls Misserfolg: Backtracking *) D := D + D ′ (* D wiederherstellen *) endif endif (* probiere Xr −1 := d *) D ′ := {|Xj − d| | j ∈ {0, . . . , l} ∪ {r , . . . , n}}; if (found = false) and D ′ ⊆ D then Xr −1 := d; D := D − D ′ ; (* D aktualisieren *) place(X , D, n, l, r − 1, found); (* rekursiv Lösung suchen *) if found = false then (* falls Misserfolg: Backtracking *) D := D + D ′ (* D wiederherstellen *) endif endif endif 205 / 369 Mautproblem: Komplexität Zeitanalyse zum maut-Algorithmus: Die Datenstruktur für D sollte die Operationen max(D), member, delete, insert effizient erlauben d.h. in O(log(n)) (= O(log(n2 ))) Schritten. Dies wird etwa durch eine geordnete Liste ermöglicht, bei der die delete-Funktion nur die Plätze markiert, die insert-Funktion (wir fügen nur Werte ein, die wir vorher gelöscht haben) hebt die Markierung von delete wieder auf. Member ist einfach eine binäre Suche, und max(D) ist der Wert des Feldes mit dem höchsten nicht-markierten Index. Alternativ ginge z.B. auch ein AVL-Baum. Der worst-case ist exponentiell und tritt dann ein, wenn sehr viel zurückgesetzt werden muss. Beispiele hierfür sind bekannt, es zeigt sich aber (empirisch), dass dieser Fall selten auftritt. 206 / 369 Flüsse Definition 9.1 Ein Flussnetzwerk (V , c, s, t) besteht aus einer endlichen Knotenmenge V , einem Startknoten s ∈ V (source) und einem Zielknoten t ∈ V (target) sowie einer Kapazitätsfunktion c : V × V → R≥0 . Ein Flussnetzwerk ist also ein gewichteter gerichteter Graph, wobei wir nur die Kanten mit positiver Kapazität zeichnen. Definition 9.2 Ein Fluss ist eine Abbildung f : V × V → R, die den drei folgenden Bedingungen genügt: ◮ ◮ ◮ (Schiefsymmetrie) Für alle x, y ∈ V gilt f (x, y ) = −f (y , x). (Flusserhaltung) Für alle u ∈ V mit s 6= u 6= t gilt P f (u, v ) = 0. v ∈V (Kapazitätsbedingung) Für alle x, y ∈ V gilt f (x, y ) ≤ c(y , x). 207 / 369 Flüsse Wir können uns jede Kante (x, y ) als ein Rohr- oder Leitungsstück mit der Kapazität c(x, y ) vorstellen. Die Schiefsymmetrie können wir uns so vorstellen, dass ein positiver Fluss von x nach y das Gleiche ist wie ein negativer Fluss von y nach x. Die Flusserhaltung besagt, dass bei inneren Knoten genau so viel hineinfließt, wie auch wieder heraus kommt. Bei der Quelle und dem Ziel ist es etwas anderes. Definition 9.3 Der Wert kf k eines Flusses f : V × V → R an der Quelle ist definiert durch X f (s, y ) kf k = y ∈V 208 / 369 Flüsse und Schnitte Definition 9.4 Ein Schnitt C = (A, B) ist eine Partition: V = A ∪˙ B mit A 6= ∅ = 6 B und A ∩ B = ∅ . Ein s-t-Schnitt ist ein Schnitt (A, B) mit s ∈ A und t ∈ B. Als Kapazität c(A, B) eines st-Schnitts (A, B) bezeichnen wir X c(x, y ). c(A, B) = x∈A,y ∈B Lemma 9.5 Sei f : V × V → R ein Fluss und (A, B) ein st-Schnitt. Dann gilt X f (x, y ) kf k = Insbesondere gilt kf k = P x∈A,y ∈B y ∈V f (s, y ) = P x∈V f (x, t). 209 / 369 Beweis Beweis: Wir zeigen die Aussage mit Induktion nach |A|. Für A = { s } ist die Aussage trivial. Sei jetzt A = A′ ∪ { u } mit s ∈ A′ und u ∈ / A′ . P ′ Dann ist kf k = x∈A′ ,y ∈B ′ f (x, y ) für B = B ∪ { u } mit Induktion, da |A|′ = |A| − 1. Es gilt X X X X f (x, u) f (u, y ) − f (x, y ) + f (x, y ) = x∈A′ ,y ∈B ′ x∈A,y ∈B y ∈B x∈A Nun ist s 6= u 6= t und daher liefert uns die Schiefsymmetrie zusammen mit der Flusserhaltung die Behauptung wegen X X X X X f (u, v ) = 0 f (u, x) = f (u, y ) + f (x, u) = f (u, y ) − y ∈B x∈A Die Aussage kf k = P y ∈B x∈V \{ t } f (x, t) x∈A v ∈V ist der Spezialfall mit B = { t }. 210 / 369 Theorem von Ford und Fulkerson Für alle st-Schnitte (A, B) und alle Flüsse f gilt kf k ≤ c(A, B) (1) Der Satz von Ford und Fulkerson stellt fest, dass diese Grenze scharf ist: Satz 9.6 (Max-Flow-Min-Cut-Theorem) Sei N = (V , c, s, t) ein Flussnetzwerk. Der maximale Wert kf k eines st-Flusses f ist gleich der minimalen Kapazität c(A, B) eines st-Schnitts (A, B). Sind ferner alle Kapazitäten natürliche Zahlen, so kann der maximale Fluss f ganzahlig gewählt werden. 211 / 369 Residualgraph Definition 9.7 Sei f ein beliebiger Fluss. Der Residualgraph zu f ist der induzierte gerichtete Graph (V , Rf ) mit Kantenmenge Rf = { (x, y ) ∈ V × V | c(x, y ) > f (x, y ) } . Sei A ⊆ V die Menge der im Residualgraphen von s aus erreichbaren Knoten. Setzen wir B = V \ A, so gilt X c(x, y ) − f (x, y ) = 0 x∈A,y ∈B Ist t ∈ / A, so definiert (A, B) mit B = V \ A einen st-Schnitt mit kf k = c(A, B). Für t ∈ A können wir den Wert des Flusses entlang eines Pfades von s nach t im Residualgraphen erhöhen, d.h. der Fluss war nicht maximal. 212 / 369 Der Algorithmus von Dinitz Der Algorithmus von Dinitz (engl. Dinic’s algorithm) startet mit dem Nullfluss und arbeitet in Phasen. Vor jeder Phase ist bereits ein Fluss f berechnet. Ist f noch kein maximaler Fluss, so werden innerhalb einer Phase verschiedene Verbesserungspfade gefunden, bis der Abstand von s zu t im Residualgraphen größer geworden ist. Innerhalb jeder Phase wird spätestens in jedem n-ten Schritt eine von maximal m Kanten gelöscht; damit terminiert eine Phase nach O(mn) Schritten. Am Ende der Phase hat der Fluss einen echt größeren Wert. Der entscheidende Punkt ist allerdings, dass höchstens n Phasen ausgeführt werden, denn nach jeder Phase wird sich der Abstand von s zu t im Residualgraphen um mindestens eins erhöht haben. Dieses Argument liefert schließlich die Laufzeitschranke O(mn2 ). 213 / 369 Der Algorithmus von Dinitz Wir haben bereits einen Fluss f vorliegen und beschreiben nun den Ablauf einer Phase. Sei (V , Rf ) der Residualgraph von f . Aus (x, y ) ∈ Rf folgt über die Schiefsymmetrie, dass c(x, y ) + c(y , x) > 0 gilt. Also hat Rf für jeden möglichen Fluss höchstens m Kanten. Die Länge eines kürzesten Pfades von x nach y im aktuellen Residualgraphen bezeichnen wir mit df (x, y ). Wir setzen df (x, y ) = ∞, falls es keinen Pfad gibt. Der Wert df (x, y ) ist die aktuelle Distanz von x nach y und hängt von f ab. 214 / 369 Der Algorithmus von Dinitz Am Anfang einer Phase konstruieren wir den Levelgraphen. In den Levelgraphen werden gewisse Knoten und Kanten von (V , Rf ) aufgenommen. Für d ≥ 0 setzen wir Ld = { x ∈ V | df (s, x) = d } und für d ≥ 1 setzen wir: Ed = { (x, y ) ∈ Ld−1 × Ld | (x, y ) ∈ Rf } S Der Levelgraph (L, E ) ist gegeben durch L = d≥0 Ld und S E = d≥1 Ed . Mit einer Breitensuche können wir (L, E ) in O(m) Schritten berechnen. Innerhalb einer Phase ändern sich die Knotenmengen Ld nicht. Insbesondere entfernen wir keine Knoten aus L, lediglich Kanten aus E werden gestrichen. Der Residualgraph wird im weiteren Verlauf der Phase zu keinem Zeitpunkt mehr explizit berechnet. 215 / 369 Der Algorithmus von Dinitz Befindet sich t nicht in L, so ist (L, V \ L) ein st-Schnitt mit Wert kf k = c(L, V \ L). Nach 1 ist kf k maximal, und wir sind fertig. Im Folgenden sei daher t ∈ L und k = df (s, t) zu Beginn der Phase. Damit liegt t in Lk . Wir entfernen nun Kanten aus dem Levelgraphen, solange es noch von s ausgehende Kanten gibt. Dies bedeutet, wir werden (L, E ) dynamisch verändern und Flüsse augmentieren. Hierfür definieren wir drei Invarianten, die für alle in dieser Phase aktuellen Graphen (L, E ) und Residualgraphen (V , Rf ) erhalten bleiben: 1. Es gilt E ⊆ Rf . 2. Aus p ∈ La und q ∈ Lb folgt df (p, q) ≥ b − a. 3. Jeden Pfad in (V , Rf ) von s nach t der Länge k gibt es auch in (L, E ). Zu Beginn der Phase sind die drei Invarianten erfüllt. 216 / 369 Der Algorithmus von Dinitz Wir beginnen damit, die Kanten Ek+1 zu entfernen, denn diese kommen auf keinem Pfad von s nach t der Länge k vor. Insbesondere hat t danach den Ausgangsgrad Null. Die Invarianten wurden nicht verletzt. Wir starten jetzt eine Tiefensuche von s aus und stoppen, wenn wir einen Knoten mit Ausgangsgrad Null finden. Die Tiefensuche liefert damit einen Pfad π = (p0 , . . . , pℓ ) mit p0 = s, (pd−1 , pd ) ∈ Ed für 1 ≤ d ≤ ℓ und pℓ hat keine ausgehende Kante in (L, E ). Die Tiefensuche kostet O(n) Zeit. Wir unterscheiden jetzt die Fälle pℓ 6= t und pℓ = t. Im ersten Fall sei pℓ 6= t. Dann gibt es in (L, E ) keinen Pfad von s nach t, der pℓ benutzt, denn pℓ hat Ausgangsgrad Null. Also gibt es nach der dritten Invariante auch in (V , Rf ) keinen Pfad von s nach t der Länge k, welcher pℓ benutzt. Wir entfernen die Kante (pℓ−1 , pℓ ) aus E . Dies verändert Rf nicht und die Invarianten bleiben erhalten. Danach starten wir eine neue Tiefensuche bei s (oder setzen die alte bei pℓ−1 fort). 217 / 369 Der Algorithmus von Dinitz Der zweite Fall ist etwas subtiler. Es sei jetzt pℓ = t. Nach der ersten Invariante ist π = (p0 , . . . , pℓ ) ein Verbesserungspfad. Wir bezeichnen mit Eπ die Menge der Kanten von π: Eπ = { (pd−1 , pd ) | 1 ≤ d ≤ ℓ } Für ρ = min { c(e) − f (e) | e ∈ Eπ } gilt ρ > 0. Wir definieren einen neuen Fluss fπ vermöge f (x, y ) + ρ für (x, y ) ∈ Eπ fπ (x, y ) = f (x, y ) − ρ für (y , x) ∈ Eπ f (x, y ) sonst Dadurch erhöhen wir den Fluss entlang des Pfades π um den Wert ρ und haben mindestens eine der Kanten e ∈ Eπ gesättigt; dies bedeutet, für den veränderten Fluss fπ gilt fπ (e) = c(e) für eine Kante e ∈ Eπ . Wir durchlaufen den Pfad π nochmals und entfernen alle gesättigten Kanten aus E . Danach starten wir eine neue Tiefensuche bei s. 218 / 369 Der Algorithmus von Dinitz Da sich der Fluss verändert hat, müssen wir die Invarianten bezüglich Rfπ überprüfen. Hierfür müssen wir untersuchen, wie sich der Residualgraph verändert hat. Die gesättigten Kanten e vom Pfad π sind in Rfπ nicht mehr vorhanden. Das Löschen war also problemlos. Alle ungesättigten Kanten (pd−1 , pd ) auf π sind weiterhin in Rfπ und auch in (L, E ) vorhanden. Wir müssen dennoch vorsichtig sein, denn wenn f (x, y ) zu f (x, y ) + ρ vergrößert wird, so verringert sich gleichzeitig f (y , x) zu f (y , x) − ρ. Solche Kanten (y , x) können in Rfπ neu hinzukommen. Sie sind aber nicht in (L, E ) aufgenommen worden. Die erste Invariante bleibt trivialerweise erhalten. Die zweite und dritte müssen jedoch nachgewiesen werden. 219 / 369 Der Algorithmus von Dinitz Die neuen Kanten (y , x) haben alle die Eigenschaft, dass y ∈ Ld+1 und x ∈ Ld für ein d ≥ 0 gilt. Wir definieren jetzt eine Menge R, die wir schrittweise in Rπf transformieren und die ebenfalls die drei Invarianten erfüllt, wenn wir bei den Bedingungen R anstelle von Rf einsetzen. Die Distanz in R bezeichnen wir mit dR . Zu Anfang besteht R aus den Kanten Rf ohne die gesättigten Kanten von Eπ . Die Invarianten sind erfüllt. Sei jetzt R ′ = R ∪ { (y , x) } für ein beliebiges Paar (y , x) ∈ Ld+1 × Ld . Wir wollen zeigen, dass die Invarianten für R ′ mit entsprechender Distanz dR ′ gelten. Die erste Invariante bleibt erhalten, weil wir eine Kante in R ′ hinzunehmen. Betrachte jetzt p ∈ La und q ∈ Lb . Benutzt ein kürzester Pfad von p nach q in R ′ nicht die Kante (y , x), so gilt b − a ≤ dR (p, q) = dR ′ (p, q). Benutzt dieser Pfad die Kante, so können wir dR ′ (p, q) wie folgt errechnen: dR ′ (p, q) = dR (p, y )+1+dR (x, q) ≥ (d +1−a)+1+(b−d) = b−a+2 Dies zeigt die zweite Invariante. 220 / 369 Der Algorithmus von Dinitz Um schließlich die dritte Invariante zu zeigen, betrachten wir einen Pfad der Länge k von s nach t in R ′ . Benutzt er nicht die Kante (y , x), so ist es ein Pfad in R und damit auch in (L, E ), da die Invarianten für R gelten. Benutzt er die Kante, so erhalten wir den folgenden Widerspruch: k = dR ′ (s, t) = dR (s, y ) + 1 + dR (x, t) ≥ (d + 1) + 1 + (k − d) = k + 2 Dies zeigt die dritte Invariante. Über mehrere dieser Schritte kann man von R aus die Menge Rfπ erhalten. Daher gelten die Invarianten für Rfπ . 221 / 369 Der Algorithmus von Dinitz Nach jeweils O(n) Schritten verliert E eine Kante, also gibt es nach O(mn) Schritten keine Ausgangskante bei s. Dies beendet die Phase. Die Distanz von s nach t im aktuellen Residualgraphen ist nach der zweiten Invariante mindestens k. Andererseits gibt es in (L, E ) keinen Pfad von s nach t. Nach der dritten Invariante gibt es dann auch in Rf keinen Pfad der Länge k. Daher muss im aktuellen Residualgraphen df (s, t) ≥ k + 1 gelten. Nach höchstens n Phasen gilt df (s, t) = ∞. Dann haben wir einen maximalen Fluss berechnet, und die Laufzeit ist insgesamt durch O(mn2 ) beschränkt. 222 / 369 Beispiel zum Algorithmus von Dinitz Wir betrachten den Algorithmus von Dinitz auf dem folgenden Flussnetzwerk: x 9 3 s 9 3 9 9 y 9 5 9 t 3 223 / 369 Beispiel zum Algorithmus von Dinitz Die erste Phase des Algorithmus von Dinitz beginnen wir mit dem Nullfluss. Der Fluss, sein zugehöriger Residualgraph und der resultierende Levelgraph am Anfang dieser Phase sind wie folgt: x 0 0 s 0 0 0 x 0 0 0 s t 0 0 y t y x s t y 224 / 369 Beispiel zum Algorithmus von Dinitz Nach Hinzufügen des Verbesserungspfades (s, x, y , t) mit Wert 3 ergibt sich zu Beginn der zweiten Phase das folgende Bild: x x 3 s 3 s t 3 y t y x s t y 225 / 369 Beispiel zum Algorithmus von Dinitz Der Fluss der Kante (y , x) ist −3; daher hat sie noch freie Kapazität 8. Also hat der – in diesem Fall eindeutige – Verbesserungspfad den Wert 8. Nach Hinzufügen dieses Pfades zum Fluss erhalten wir: 3 x 8 s 8 x 8 5 8 8 s t 3 8 y t y s y Zu Beginn der dritten Phase ist nun t nicht im Levelgraphen enthalten. Der berechnete Fluss mit Wert 11 ist somit maximal. Der zugehörige minimale Schnitt wird durch die drei Kanten (s, x), (y , x) und (y , t) definiert. 226 / 369 Der Algorithmus von Dinitz Die Laufzeit zur Berechnung maximaler Flüsse wurde in den letzten Jahren weiter verbessert und ist Gegenstand aktueller Forschung. Der Algorithmus von Dinitz ist robust und einfach zu implementieren; er spielt daher auch in der Praxis weiterhin eine wichtige Rolle. Von Dinitz stammt auch eine lesenswerte Betrachtung über die historische Entwicklung der Fluss-Algorithmen ( Dinitz’ Algorithm: The Original ” Version and Even’s Version“ in Essays in Memory of Shimon Even, LNCS, 2006). 227 / 369 Erinnerung: Mastertheorem II Wir erinnern uns im Folgenden an das Mastertheorem II aus den Grundlagen. Satz 10.1 (Mastertheorem II) Sei r > 0, Pr i=0 αi < 1 und für eine Konstante c sei ! r X t(n) ≤ t(⌈αi n⌉) + c · n i=0 Dann gilt t(n) ∈ O(n). 228 / 369 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 229 / 369 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 ). 230 / 369 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]. 231 / 369 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. 232 / 369 Zeitanalyse Sei T (n) die Gesamtzahl der Vergleiche. Wir erhalten folgende Rekursionsgleichung für T (n): n 7n T (n) ≤ T +T + O(n) 5 10 Aus dem Mastertheorem II folgt damit T (n) ∈ O(n). 233 / 369 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 Es ergibt sich, dass damit T (n) ≤ 16n gilt: mit 15 + 10 = 10 erhalten 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. 234 / 369 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. 235 / 369 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. 236 / 369 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 237 / 369 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. 238 / 369 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 239 / 369 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 240 / 369 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. 241 / 369 Quicksort: Durschnittsanalyse Beweis: Für n = 1 gilt offensichtlich Q(1) = 0 = 2 · 2 · 1 − 4 · 1. Für n ≥ 2 gilt: n Q(n) = (n − 1) + = (n − 1) + 1X [Q(i − 1) + Q(n − i)] n i=1 n 2X n i=1 Q(i − 1) Dabei ist (n − 1) die Zahl der Vergleiche beim Pivotieren und [Q(i − 1) + Q(n − i)] die mittlere Zahl der Vergleiche für das rekursive Sortieren der beiden Teilhälften; dabei sind alle Positionen für das Pivotelement gleich wahrscheinlich (deswegen der Faktor 1/n). 242 / 369 Quicksort: Durschnittsanalyse Damit gilt: nQ(n) = n(n − 1) + 2 n X i=1 Q(i − 1) 243 / 369 Quicksort: Durschnittsanalyse Also: nQ(n) − (n − 1)Q(n − 1) = n(n − 1) + 2 n X i=1 Q(i − 1) −(n − 1)(n − 2) − 2 n−1 X i=1 Q(i − 1) = n(n − 1) − (n − 2)(n − 1) + 2Q(n − 1) = 2(n − 1) + 2Q(n − 1) Wir erhalten: nQ(n) = 2(n − 1) + 2Q(n − 1) + (n − 1)Q(n − 1) = 2(n − 1) + (n + 1)Q(n − 1) 244 / 369 Quicksort: Durschnittsanalyse Q(n) n+1 = 2(n − 1) Q(n − 1) 2(n − 1) 2(n − 2) Q(n − 2) + = + + n(n + 1) n n(n + 1) (n − 1)n n−1 = n X 2(k − 1) k(k + 1) k=1 = 2 n X (k − 1) k(k + 1) k=1 n X = 2 k=1 X k 1 − k(k + 1) k(k + 1) n k=1 245 / 369 Quicksort: Durschnittsanalyse Q(n) n+1 = 2 " = 2 n X k=1 " n X 1 1 − k +1 k(k + 1) n X k=1 k=1 n X1 2 − k +1 k k=1 # # 1 + H(n) − 1 − H(n) = 2 2 n+1 = 2H(n) + 4 − 4. n+1 246 / 369 Quicksort: Durschnittsanalyse Schließlich erhält man für Q(n): Q(n) = 2(n + 1)H(n) + 4 − 4(n + 1) = 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 1,18n log n − 2,2n. Dies ist im Mittel nur noch um 18% schlechter. 247 / 369 Quickselect Algorithmus 12.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 248 / 369 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}. ” 249 / 369 Durchschnittsanalyse von Quickselect Unterscheide 3 Fälle: 1. Fall: i < j ≤ k. Xij (π) = i oder j wird als erstes ” 2 im Intervall [i, . . . , k] gezogen“ = k−i+1 X X 1≤i<k i<j≤k X k −i k −i +1 1≤i<k X 1 =2 1− k −i +1 Xij (π) = 2 1≤i<k = 2(k − H(k)) wobei H(k) ∈ Θ(ln k) die harmonische Funktion ist. 2. Fall: k ≤ i < j, analog folgt Xij (π) = X X k<j≤n k≤i<j 2 j−k+1 und Xij (π) = 2(n − k + 1 − H(n − k + 1)) 250 / 369 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). 251 / 369 Durchschnittsanalyse von Quickselect 3. Fall: i < k < j Xij (π) = X X 2 j−i+1 Xij (π) = 2 X X 1≤i<k k<j≤n 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 252 / 369 Durchschnittsanalyse von Quickselect ◮ ◮ ◮ ◮ 1. Fall + 2. Fall zusammen ergeben < 2n Mit kn ≤2n ergibt sich: n Q(n) < 2 n + ln k−1 ≤ 2(1 + ln(2))n 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. 253 / 369 15. Vorlesung, 18.12.2012 Behandelte Themen: ◮ Fibonacci-Heaps. ◮ Amortisierte Zeitanalyse. Anwendungen: ◮ Dijkstra, Prim. 254 / 369 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 ) 255 / 369 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. 256 / 369 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. 257 / 369 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). 258 / 369 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)). 259 / 369 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. 260 / 369 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!) 261 / 369 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. 262 / 369 decrease key Definition 14.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). 263 / 369 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. 264 / 369 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. 265 / 369 Fibonacci-Zahlen √ !k 1 1+ 5 Fk = √ − 2 5 Die Fibonacci-Zahlen wachsen exponentiell. Also rmax (n) ∈ O(log n). √ !k 1− 5 2 266 / 369 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. 267 / 369 Amortisierte Zeiten Für die weitere Analyse einer Sequenz von Operationen betrachten wir die gegen eine Potentialfunktion amortisierte Zeit. Definition 14.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 ) . 268 / 369 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. 269 / 369 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. 270 / 369 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) . 271 / 369 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). 272 / 369 delete min Satz 14.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) 273 / 369 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. 274 / 369 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. 275 / 369 Teil 2: Berechenbarkeit 276 / 369 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). 277 / 369 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) 278 / 369 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). 279 / 369 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 . 280 / 369 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. [ ⊢d . 3. Es sei ⊢M = d∈δ 4. Mit Accept bezeichnen wir die Menge der akzeptierenden Konfigurationen (aktueller Zustand ist aus F ⊆ Q). 5. Beachte: α ⊢M β ⇒ |α| − |β| ∈ {−1, 0, 1} 281 / 369 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 282 / 369 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. 283 / 369 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. 284 / 369 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)). Dies erlaubt, eine Position i ∈ {1, . . . , n} im Eingabestring auf einem Arbeitsband abzuspeichern. 285 / 369 Wichtige Komplexitätsklassen Gebräuchlichen Abkürzungen: L = DSPACE(log(n)) (2) NL = NSPACE(log(n)) [ P = DTIME(nk ) (3) NP = (5) (4) k≥1 [ NTIME(nk ) k≥1 PSPACE = [ k≥1 DSPACE(nk ) = [ NSPACE(nk ) (6) k≥1 Die Gleichung = in (5) ist als Satz von Savitch bekannt (kommt noch). 286 / 369 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 NSPACE(log (n)) k≥1 NL ? L 6= Es gibt noch viele weitere Komplexitätsklassen: Besuchen Sie doch den complexity zoo (http://qwiki.caltech.edu/wiki/Complexity Zoo) 287 / 369 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. 288 / 369 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. 289 / 369 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. 290 / 369 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 ). 291 / 369 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: ◮ ◮ ◮ Nichtleerheit: H = { hMi ∈ { 0, 1 }∗ | L(M) 6= ∅ } Spezielles Halteproblem: H0 = { hMi ∈ { 0, 1 }∗ | ε ∈ L(M) } Selbstanwendung: Hs = { hMi ∈ { 0, 1 }∗ | hMi ∈ L(M) } 292 / 369 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) = Σ∗ } 293 / 369 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 P(L(Mi )) = i mit 0 = falsch“ und 1 = wahr“. ” ” Ohne Einschränkung gilt L(M0 ) = ∅ und insbesondere L(M1 ) 6= ∅. 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 ). 294 / 369 Beweisforsetzung Es gilt ε ∈ L(M) ⇐⇒ L(M ′ ) 6= ∅ ⇐⇒ L(M ′ ) = L(M1 ) ⇐⇒ P(L(M ′ )) Also H0 = { hMi ∈ { 0, 1 }∗ | ε ∈ L(M) } ≤ { hMi ∈ { 0, 1 }∗ | P(L(M)) = 1 } 295 / 369 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. 296 / 369 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) 297 / 369 Die imperative Programmiersprache IMP Die Sprache IMPverfügt über drei Arten syntaktischer Konstrukte. ◮ Arithmetische Ausdrücke (Aexp) ◮ Boolesche Ausdrücke (Bexp) ◮ Anweisungen bzw. Programme (Cmd) 298 / 369 Aexp Syntaktische Definition: a ::= n | X | (a + a) | (a − a) | (a · a) Dabei ist n ∈ N, X eine Programmvariable. 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. 299 / 369 Bexp Syntaktische Definition: b ::= true | false | a1 < a2 | ¬b | b1 ∧ b2 Dabei seien a1 , a2 ∈ Aexp, b, b1 , b2 ∈ Bexp. 300 / 369 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. Einem gegebenen Programm c ∈ Cmd und einem Speicherzustand σ ∈ Σ wird ein neuer Speicherzustand σ ′ ∈ Σ zugeordnet: Cmd × Σ →p Σ (Das p am Pfeil steht für partiell“). ” 301 / 369 Beispiel X2 := 1; while X1 > 1 do X2 := X2 · X1 ; X1 := X1 − 1 od Σ besteht aus Zahlenpaaren, da nur X1 und X2 vorkommen: Σ = {(n1 , n2 ) | n1 , n2 ∈ N} Dabei sei für σ = (n1 , n2 ) ∈ Σ erfüllt: σ(X1 ) = n1 σ(X2 ) = n2 302 / 369 Prädikatenlogik der 1. Stufe über N Syntaktische Definition von Assn, der Menge der arithmetischen Formeln : A ::= b | ∃X : A | ∀X : A Dabei ist b ∈ Bexp und X eine Variable. 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 Prädikatenlogik der 1. Stufe über N ist die folgende Teilmenge von Assn: { F ∈ Assn | F ist ein gültiger Satz } 303 / 369 Der Gödel’sche Unvollständigkeitssatz Satz 16.7 (Gödel) Die folgende Sprache ist nicht aufzählbar: Th(N) = { hF i ∈ { 0, 1 }∗ | F ∈ Assn ∧ F ist ein gültiger Satz } Proof. Idee: Zu einer Turingmaschine M konstruieren wir eine Formel FM in zwei freien Variablen X , Y mit der Eigenschaft: ε∈ / L(M) ⇐⇒ ∀Y : FM (0, Y ) = false Dies zeigt dann { hMi ∈ { 0, 1 }∗ | ε ∈ / L(M) } ≤ Th(N) 304 / 369 Das Gödelsche β–Prädikat Lemma 5.2.3 Das Prädikat β : N4 → B sei definiert durch β(a, b, i, x) ⇔ x = a mod (1 + b(i + 1)). Seien k, n0 , . . . , nk ∈ N. Dann gibt es Zahlen n, m ∈ N so, dass für alle j ∈ {0, 1, . . . , k} und alle x ∈ N gilt: β(n, m, j, x) ⇔ x = nj . Beweis: Setze m = (max{k, n0 , n1 , . . . , nk })!. Zeige: ggT(1 + m(i + 1), 1 + m(j + 1)) = 1 (für 0 ≤ i < j ≤ k). Mit dem Chinesischen Restsatz folgt die Existenz einer Zahl n, für die n = ni mod (1 + m(i + 1)) für i ∈ {0, . . . , k} gilt. 305 / 369 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) ✲ M L′ ✲ ja ✲ nein ML 306 / 369 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·ℓ 307 / 369 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. 308 / 369 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} : (v ,y )∈E F (v , y ) (x,v )∈E F (x, v ) = (Flußerhaltung) ◮ ∀e ∈ E : F (e) ≤ c(e). 309 / 369 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 . 310 / 369 Beispiel für Polynomialzeitreduktion Sei G = (A, B, E ) ein bipartiter Graph: A B 311 / 369 Beispiel für Polynomialzeitreduktion Füge eine Quelle s und eine Senke t an: A s B t 312 / 369 Beispiel für Polynomialzeitreduktion Berechne einen maximalen Fluß: A s B t 313 / 369 Beispiel für Polynomialzeitreduktion Hieraus ergibt sich die Lösung des Matchingproblems: A B 314 / 369 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. 315 / 369 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. 316 / 369 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. 317 / 369 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. 318 / 369 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. 319 / 369 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. 320 / 369 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) 321 / 369 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. 322 / 369 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. 323 / 369 Teil 4: NP-Vollständigkeit Satz 17.3 Falls es eine NP-vollständige Sprache gibt, so auch eine in NTIME(n): ∃L : L ist NP-vollständig ⇒ ∃L̃ ∈ NTIME(n) : L̃ ist NP-vollständig. Beweis: Sei L ein NP-vollständiges Problem. Es existiert eine Konstante k > 0 mit L ∈ NTIME(nk ). Aus dem Translationssatz für Zeitklassen folgt Padnk (L) ∈ NTIME(n). Sei nun L′ ∈ NP beliebig. log ⇒ L′ ≤log m L ≤m Padnk (L) log ′ Da ≤log m transitiv ist, folgt L ≤m Padnk (L). ⇒ Padp(n) (L) ist NP-vollständig. 324 / 369 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. 325 / 369 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. 326 / 369 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. 327 / 369 Ü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. 328 / 369 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. 329 / 369 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]) ∈ ∆. 330 / 369 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 i i+1 α = ··· ··· b q a ··· ··· α′ = ··· ··· b a′ p ··· ··· 331 / 369 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. 332 / 369 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)). 333 / 369 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. 334 / 369 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. 335 / 369 P Vollständigkeit von HORNSAT Aus dem Beweis ergibt sich unmittelbar: HORNSAT ist P-vollständig. 336 / 369 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. 337 / 369 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. 338 / 369 SAT ∩ KNF ist NP-vollständig Satz 17.4 SAT ∩ KNF ist NP-vollständig. Beweis: Siehe Beweis von Cook/Levin. 339 / 369 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: 340 / 369 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 ′ = x̃1 ∨ x̃2 ∨ v (x̃3 ) ∧ k−2 ^ i=3 ∧ v (x̃k−1 ) ∨ x̃k−1 ∨ x̃k . v (x̃i ) ∨ x̃i ∨ v (x̃i+1 ) 341 / 369 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 342 / 369 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! 343 / 369 Ü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.) 344 / 369 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 345 / 369 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 ). 346 / 369 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. 347 / 369 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. 348 / 369 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 349 / 369 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 350 / 369 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. 351 / 369 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. 352 / 369 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). 353 / 369 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 354 / 369 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 2 ejl 4 ejl 3 355 / 369 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 ): 356 / 369 ′′ ek4 ′′ ek3 a34 b4 a33 a32 G (ck ) b3 a31 ′′ ek1 ′ ek4 a24 ′′ ek2 G (xk3 ) G (xk2 ) a23 ′ ek3 ′ ek2 a22 ′ ek1 a21 a14 a13 a12 ek3 ek4 b2 b1 a11 ek2 ek1 G (xk1 ) 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. 357 / 369 Hamilton-Kreis und Hamilton-Pfad sind NP-vollständig Beispiel: Sei F = (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ). {z } | {z } | c1 c2 G (x3 ) G (c2 ) G (c1 ) G (x2 ) G (x1 ) Dann ist G (F ) der folgende Graph: 358 / 369 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 ai1 − ai2 − ai3 − ai4 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. 359 / 369 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 . 360 / 369 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. 361 / 369 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 ). 362 / 369 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)). 363 / 369 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. 364 / 369 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)). 365 / 369 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 366 / 369 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 367 / 369 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 . 368 / 369 Varianten algorithmischer Probleme Wieder gilt: (A) in Polynomialzeit lösbar =⇒ (C) in Polynomialzeit lösbar. Zeigen Sie dies als Übung. 369 / 369