Fibonacci Zahlen 9. Dynamic Programming I Fibonacci, Längste aufsteigende Teilfolge, längste gemeinsame Teilfolge, Editierdistanz, Matrixettenmultipliation, Matrixmultipliation nach Strassen [Ottman/Widmayer, Kap..2.3, 7., 7.4, Cormen et al, Kap. 5] (schon wieder) F n := { wenn n < 2 F n + F n 2 wenn n 3. Analyse: warum ist der reursive Algorithmus so langsam. 495 496 Algorithmus FibonacciRecursive(n) Analyse Input : n 0 Output : n-te Fibonacci Zahl if n 2 then f else f FibonacciRecursive(n ) + FibonacciRecursive(n 2) return f T (n): Anzahl der ausgeführten Operationen. n =, 2: T (n) = Θ() n 3: T (n) = T (n 2) + T (n ) + c. T (n) = T (n 2) + T (n ) + c 2T (n 2) + c 2 n/2 c = ( 2) n c Algorithmus ist exponentiell (!) in n. 497 498
Grund, visualisiert Memoization F 47 Memoization (sic) Abspeichern von Zwischenergebnissen. F 46 F 45 F 44 F 44 F 43 F 43 F 42 F 45 F 44 F 43 F 43 F 42 F 42 F 4 Bevor ein Teilproblem gelöst wird, wird Existenz eines entsprechenden Zwischenergebnis geprüft. Existiert ein gespeichertes Zwischenergebnis bereits, so wird dieses verwendet. Andernfalls wird der Algorithmus ausgeführt und das Ergebnis wird entsprechend gespeichert. Knoten mit denselben Werten werden oft ausgewertet. 499 500 Memoization bei Fibonacci Algorithmus FibonacciMemoization(n) F 47 Input : n 0 Output : n-te Fibonacci Zahl F 45 F 44 F 43 F 46 F 44 F 45 if n 2 then f else if memo[n] then f memo[n] else f FibonacciMemoization(n ) + FibonacciMemoization(n 2) memo[n] f return f Rechtecige Knoten wurden bereits ausgewertet. 50 502
Analyse Genauer hingesehen... Berechnungsaufwand: T (n) = T (n ) + c =... = O(n). Algorithmus benötigt Θ(n) Speicher. 24... berechnet der Algorithmus der Reihe nach die Werte F, F 2, F 3,... verleidet im Top-Down Ansatz der Reursion. Kann den Algorithmus auch gleich Bottom-Up hinschreiben. Man spricht dann auch von dynamischer Programmierung. 24 Allerdings benötigt der naive Algorithmus auch Θ(n) Speicher für die Reursionsverwaltung. 503 504 Algorithmus FibonacciDynamicProgram(n) Dynamic Programming: Vorgehen Input : n 0 Output : n-te Fibonacci Zahl F [] F [2] for i 3,..., n do F [i] F [i ] + F [i 2] return F [n] Verwalte DP-Tabelle mit Information zu den Teilproblemen. Dimension der Tabelle? Bedeutung der Einträge? 2 Berechnung der Randfälle. Welche Einträge hängen nicht von anderen ab? 3 Berechnungsreihenfolge bestimen. In welcher Reihenfolge önnen Einträge berechnet werden, so dass benötigte Einträge jeweils vorhanden sind? 4 Auslesen der Lösung. Wie ann sich Lösung aus der Tabelle onstruieren lassen? Laufzeit (typisch) = Anzahl Einträge der Tabelle mal Aufwand pro Eintrag. 505 506
Dynamic Programming: Vorgehen am Beispiel Längste aufsteigende Teilfolge (LAT) Dimension der Tabelle? Bedeutung der Einträge? Tabelle der Grösse n. n-ter Eintrag enthält n-te Fibonacci Zahl. 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 Welche Einträge hängen nicht von anderen ab? Werte F und F 2 sind unabhängig einfach berechenbar. In welcher Reihenfolge önnen Einträge berechnet werden, so dass benötigte Einträge jeweils vorhanden sind? F i mit aufsteigenden i. Wie ann sich Lösung aus der Tabelle onstruieren lassen? F n ist die n-te Fibonacci-Zahl. 3 2 4 6 5 7 3 2 4 6 5 7 Verbinde so viele passende Anschlüsse wie möglich, ohne dass sich die Anschlüsse reuzen. 507 508 Formalisieren Erster Entwurf Betrachte Folge A = (a,..., a n ). Suche eine längste aufsteigende Teilfolge von A. Beispiele aufsteigender Teilfolgen: (3, 4, 5), (2, 4, 5, 7), (3, 4, 5, 7), (3, 7). A 2 3 4 5 6 7 3 2 4 6 5 7 Verallgemeinerung: Lasse Zahlen ausserhalb von,..., n zu, auch mit Mehrfacheinträgen. Lasse nur strit aufsteigende Teilfolgen zu. Beispiel: (2,3,3,3,5,) mit aufsteigender Teilfolge (2,3,5). Annahme: LAT L für beannt. Wollen nun LAT L + für + berechnen. Wenn a + zu L passt, dann L + = L a + Gegenbeispiel: A 5 = (, 2, 5, 3, 4). Sei A 3 = (, 2, 5) mit L 3 = A. Bestimme L 4 aus L 3? So ommen wir nicht weiter: önnen nicht von L auf L + schliessen. 509 50
Zweiter Entwurf Dritter Entwurf Annahme: eine LAT L j für alle j beannt. Wollen nun LAT L + für + berechnen. Betrachte alle passenden L + = L j a + (j ) und wähle eine längste solche Folge. Gegenbeispiel: A 5 = (, 2, 5, 3, 4). Sei A 4 = (, 2, 5, 3) mit L = (), L 2 = (, 2), L 3 = (, 2, 5), L 4 = (, 2, 5). Bestimme L 5 aus L,..., L 4? So ommen wir nicht weiter: önnen nicht von jeweils nur einer beliebigen Lösung L j auf L + schliessen. Wir müssten alle möglichen LAT betrachten. Zu viel! Annahme: die LAT L j, welche mit leinstem Element endet sei für alle Längen j beannt. Betrachte nun alle passenden L j a + (j ) und atualisiere die Tabelle der längsten aufsteigenden Folgen, welche mit leinstem Element enden. Beispiel: A = (, 000, 00, 2, 3, 4,..., 999) A LAT () () (, 000) (), (, 000) (, 000, 00) (), (, 000), (, 000, 00) (, 000, 00, 2) (), (, 2), (, 000, 00) (, 000, 00, 2, 3) (), (, 2), (, 2, 3) 5 52 DP Table Dynamic Programming Algorithmus LAT Idee: speichere jeweils nur das letzte Element der aufsteigenden Folge am Slot j. Beispielfolge: 3 2 5 6 4 Problem: Tabelle enthält zum Schluss nicht die Folge, nur den letzten Wert. Lösung: Zweite Tabelle mit den Vorgängern. Index 2 3 4 5 6 Wert 3 2 5 6 4 Vorgänger 2 5 0 2 3 4... - - 3-2 - 2 5-5 - 5 6-4 6 2 Dimension der Tabelle? Bedeutung der Einträge? Zwei Tabellen T [0,..., n] und V [,..., n]. Zu Beginn T [0], T [i] i > Berechnung eines Eintrags Einträge in T aufsteigend sortiert. Für jeden Neueintrag a + binäre Suche nach l, so dass T [l] < a < T [l + ]. Setze T [l + ] a +. Setze V [] = T [l]. 53 54
Dynamic Programming Algorithmus LAT Analyse 3 4 Berechnungsreihenfolge Beim Traversieren der Liste werden die Einträge T [] und V [] mit aufsteigendem berechnet. Wie ann sich Lösung aus der Tabelle onstruieren lassen? Suche das grösste l mit T [l] <. l ist der letzte Index der LAT. Suche von l ausgehend den Index i < l, so dass V [l] = A[i], i ist der Vorgänger von l. Repetiere mit l i bis T [l] = Berechnung Tabelle: Initialisierung: Θ(n) Operationen Berechnung -ter Eintrag: Binäre Suche auf Positionen {,..., } plus onstante Anzahl Zuweisungen. n (log + O()) = O(n) + = n log() = Θ(n log n). = Reonstrution: Traversiere A von rechts nach lins: O(n). Somit Gesamtlaufzeit Θ(n log n). 55 56 Längste Gemeiname Teilfolge Teilfolgen einer Zeichenette: Problem: Teilfolgen(KUH): (), (K), (U), (H), (KU), (KH), (UH), (KUH) Eingabe: Zwei Zeichenetten A = (a,..., a m ), B = (b,..., b n ) der Längen m > 0 und n > 0. Gesucht: Eine längste gemeinsame Teilfolge (LGT) von A und B. Sinnvolle Anwendung: Ähnlicheit von DNA-Sequenzen in der Biologie. Längste Gemeiname Teilfolge Beispiele: LGT(IGEL,KATZE)=E, LGT(TIGER,ZIEGE)=IGE Ideen zur Lösung? T I G E R Z I E G E 57 58
Reursives Vorgehen Reursion Annahme: Lösungen L(i, j) beannt für A[,..., i] und B[,..., j] für alle i m und j n, jedoch nicht für i = m und j = n. L(m, n) max {L(m, n ) + δ mn, L(m, n ), L(m, n)} T I G E R Z I E G E Betrachten Zeichen a m, b n. Drei Möglicheiten: A wird um ein Leerzeichen erweitert. L(m, n) = L(m, n ) 2 B wird um ein Leerzeichen erweitert. L(m, n) = L(m, n) 3 L(m, n) = L(m, n ) + δ mn mit δ mn = wenn a m = b n und δ mn = 0 sonst für m, n > 0 und Randfälle L(, 0) = 0, L(0, ) = 0. Z I E G E 0 0 0 0 0 0 T 0 0 0 0 0 0 I 0 0 G 0 0 2 2 E 0 0 2 2 3 R 0 0 2 2 3 59 520 Dynamic Programming Algorithmus LGT Dynamic Programming Algorithmus LGT Dimension der Tabelle? Bedeutung der Einträge? Tabelle L[0,..., m][0,..., n]. L[i, j]: Länge einer LGT der Zeichenetten (a,..., a i ) und (b,..., b j ) 3 Berechnungsreihenfolge Abhängigeiten berücsichtigen: z.b. Zeilen aufsteigend und innerhalb von Zeilen Spalten aufsteigend. 2 Berechnung eines Eintrags L[0, i] 0 0 i m, L[j, 0] 0 0 j n. Berechnung von L[i, j] sonst mit L[i, j] = max(l[i, j ] + δ ij, L[i, j ], L[i, j]). 4 Wie ann sich Lösung aus der Tabelle onstruieren lassen? Beginne bei j = m, i = n. Falls a i = b j gilt, gib a i aus, sonst falls L[i, j] = L[i, j ] fahre mit j j fort, sonst falls L[i, j] = L[i, j] fahre mit i i fort. Terminiere für i = 0 oder j = 0. 52 522
Analyse LGT Anzahl Tabelleneinträge: (m + ) (n + ). Berechnung jeweils mit onstanter Anzahl Zuweisungen und Vergleichen. Anzahl Schritte O(mn) Bestimmen der Lösung: jeweils Verringerung von i oder j. Maximal O(n + m) Schritte. Laufzeit insgesamt: O(mn). Editierdistanz Editierdistanz von zwei Zeichenetten A = (a,..., a m ), B = (b,..., b m ). Editieroperationen: Einfügen eines Zeichens Löschen eines Zeichens Änderung eines Zeichens Frage: Wie viele Editieroperationen sind mindestens nötig, um eine gegebene Zeichenette A in eine Zeichenette B zu überführen. TIGER ZIGER ZIEGER ZIEGE 523 Editierdistanz= Levenshtein Distanz 524 Vorgehen? Zweidimensionale Tabelle E[0,..., m][0,..., n] mit Editierdistanzen E[i, j] zwischen Worten A i = (a,..., a i ) und B j = (b,..., b j ). Betrachte die jeweils letzten Zeichen von A i und B j. Drei mögliche Fälle: Lösche letztes Zeichen von A i : 25 E[i, j] +. 2 Füge Zeichen zu A i hinzu: 26 E[i, j ] +. 3 Ersetze A i durch B j : E[i, j ] + δ ij. E[i, j] min { E[i, j]+, E[i, j ]+, E[i, j ]+ δ ij } DP Tabelle E[i, j] min { E[i, j] +, E[i, j ] +, E[i, j ] + δ ij } Z I E G E 0 2 3 4 5 T 2 3 4 5 I 2 2 2 3 4 G 3 3 2 2 2 3 E 4 4 3 2 3 2 R 5 5 4 3 3 3 25 oder füge Zeichen zu B j hinzu 26 oder lösche letztes Zeichen von B j 525 Algorithmus: Übung! 526
Matrix-Kettenmultipliation Macht das einen Unterschied? Aufgabe: Berechnung des Produtes A A 2... A n von Matrizen A,..., A n. = = Matrizenmultipliation ist assoziativ, d.h. Klammerung ann beliebig gewählt. A A 2 A 3 A A 2 A 3 2 Operationen! A A 2 A 3 Ziel: möglichst effiziente Berechnung des Produtes. Annahme: Multipliation einer (r s)-matrix mit einer (s u)-matrix hat Kosten r s u. = Operationen! = A A 2 A 3 A A 2 A 3 A A 2 A 3 527 528 Reursion Berechnung der DP-Tabelle Annahme, dass die bestmögliche Berechnung von (A A 2 A i ) und (A i+ A i+2 A n ) für jedes i bereits beannt ist. Bestimme bestes i, fertig. n n-tabelle M. Eintrag M[p, q] enthält Kosten der besten Klammerung von (A p A p+ A q ). M[p, q] min (M[p, i] + M[i +, q] + Kosten letzte Multipliation) p i<p Randfälle: M[p, p] 0 für alle p n. Berechnung von M[p, q] hängt ab von M[i, j] mit p i j q, (i, j) (p, q). Insbesondere hängt M[p, q] höchstens ab von Einträgen M[i, j] mit i j < q p. Folgerung: Fülle die Tabelle von der Diagonale ausgehend. 529 530
Analyse Exurs: Matrixmultipliation Betrachten Multipliation zweier n n-matrizen. DP-Tabelle hat n 2 Einträge. Berechung eines Eintrages bedingt Betrachten von bis zu n anderen Einträgen. Gesamtlaufzeit O(n 3 ). Seien dann A = (a ij ) i,j n, B = (b ij ) i,j n, C = (c ij ) i,j n, C = A B Auslesen der Reihenfolge aus M: Übung! c ij = n a i b j. = 53 Naiver Algorithmus benötigt Θ(n 3 ) elementare Multipliationen. 532 Divide and Conquer Divide and Conquer B a c b d Annahme n = 2. Anzahl elementare Multipliationen: M(n) = 8M(n/2), M() =. a c b d A C = AB e f ea + fc eb + fd Ergibt M(n) = 8 log 2 n = n log 2 8 = n 3. Kein Gewinn e g f h ea + fc ga + hc eb + fd gb + hd g h ga + hc gb + hd 533 534
Strassens Matrixmultipliation Nichttriviale Beobachtung von Strassen (969): Es genügt die Berechnung der sieben Produte A = (e + h) (a + d), B = (g + h) a, C = e (b d), D = h (c a), E = (e + f) d, F = (g e) (a + b), G = (f h) (c + d). Denn: ea + fc = A + D E + G, eb + fd = C + E, ga + hc = B + D, gb + hd = A B + C + F. Damit ergibt sich M (n) = 7M(n/2), M () =. Also M (n) = 7 log 2 n = n log 2 7 n 2.807. e g f h a c ea + fc ga + hc b d eb + fd gb + hd Schnellster beannter Algorithmus: O(n 2.37 ) 535