Dynamische Programmierung

Ähnliche Dokumente
Dynamische Programmierung

Datenstrukturen & Algorithmen

Dynamische Programmierung

Dynamische Programmierung. Problemlösungsstrategie der Informatik

Dynamische Programmierung

Programmierung 2. Dynamische Programmierung. Sebastian Hack. Klaas Boesche. Sommersemester

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Einstieg in die Informatik mit Java

5.4 Das Rucksackproblem

Informatik II, SS 2014

Algorithmen und Datenstrukturen 1 Kapitel 3

Ein Dieb raubt einen Laden aus; um möglichst flexibel zu sein, hat er für die Beute nur einen Rucksack dabei

Vorlesung Datenstrukturen

JAVA - Suchen - Sortieren

13. Binäre Suchbäume

12 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Algorithmen & Komplexität

3. Übungsblatt zu Algorithmen I im SoSe 2017

Backtracking mit Heuristiken

Randomisierte Algorithmen 2. Erste Beispiele

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Einführung in die Informatik I

11.1 Grundlagen - Denitionen

13. Bäume: effektives Suchen und Sortieren

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

11. Elementare Datenstrukturen

Datenbankanwendung. Prof. Dr.-Ing. Sebastian Michel TU Kaiserslautern. Wintersemester 2014/15.

Algorithmen und Datenstrukturen 2

Bäume Jiri Spale, Algorithmen und Datenstrukturen - Bäume 1

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

Lösungsvorschlag Serie 2 Rekursion

15. Elementare Graphalgorithmen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

6. Verkettete Strukturen: Listen

11 Dynamisches Programmieren

Informatik B Sommersemester Musterlösung zur Klausur vom

Algorithmen & Programmierung. Rekursive Funktionen (1)

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Komplexität von Algorithmen

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen

16. All Pairs Shortest Path (ASPS)

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Datenstrukturen und Algorithmen

Algorithmische Bioinformatik 1

Achtung: Groß O definiert keine totale Ordnungsrelation auf der Menge aller Funktionen! Beweis: Es gibt positive Funktionen f und g so, dass

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Optimierung. Algorithmik III Algorithmen und Modelle für kontinuierliche Datenstrukturen. Vorgehen: Dynamische Programmierung

Informatik I: Einführung in die Programmierung

12. Rekursion Grundlagen der Programmierung 1 (Java)

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Bäume, Suchbäume und Hash-Tabellen

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Kasparov versus Deep Blue. Till Tantau. Institut für Theoretische Informatik Universität zu Lübeck

Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Programmieren, Algorithmen und Datenstrukturen II 8. Allgemeine Lösungsverfahren

Informatik-Seminar Thema 6: Bäume

Grundlagen Datenstrukturen Transitive Hülle Traversierung Kürzeste Wege Spannender Baum Max. Fluss Zuordnungen. 6. Graphen

Algorithmen und Datenstrukturen 1-1. Seminar -

Breiten- und Tiefensuche in Graphen

Klausur Algorithmen und Datenstrukturen II 10. August 2015

Advanced Programming in C

Grundlagen: Algorithmen und Datenstrukturen

Praktikum Algorithmen-Entwurf (Teil 7)

Geometrie I. Sebastian Redinger Informatik 2 Programmiersysteme Martensstraße Erlangen

Informatik II Greedy-Algorithmen

Klausur Algorithmen und Datenstrukturen II 29. Juli 2013

Balancierte Bäume. Minimale Knotenanzahl von AVL-Bäumen. AVL-Bäume. Definition für "balanciert":

Wirtschaftsinformatik I

Seminar über aktuelle Forschungsthemen in der Algorithmik, Dozent Prof. Dr. Alt;

Algorithmentheorie Randomisierung. Robert Elsässer

Algorithmen II Vorlesung am

Praxis der Programmierung

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Dynamisches Programmieren - Problemstruktur

Gliederung. Algorithmen und Datenstrukturen II. Problem: Längste gemeinsame Teilsequenz. Problem: Längste gemeinsame Teilsequenz

Binäre lineare Optimierung mit K*BMDs p.1/42

Rekursive Funktionen

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

Binärbäume: Beispiel

Programmieren I. Kapitel 7. Sortieren und Suchen

Suchen und Sortieren

7. Sortieren Lernziele. 7. Sortieren

Projekt Systementwicklung

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Algorithmen und Datenstrukturen Suchbaum

Programmierung mit C Algorithmen

Algorithmen und Datenstrukturen Tafelübung 4. Jens Wetzl 15. November 2011

Transkript:

Dynamische Programmierung Ludwig Höcker 13.06.2012 Ludwig Höcker Dynamische Programmierung 13.06.2012 1 / 61

Gliederung Dynamic Programming Bsp.: FAU-Kabel Naiv Top-Down Bottom-Up Longest Increasing Subsequence Optimal Binary Search Tree Ludwig Höcker Dynamische Programmierung 13.06.2012 2 / 61

Was ist DP? Programmierkonzept zum Lösen von [Optimierungs-] Problemen Berechnung des Gesamtproblems aus [abhängigen] Teilproblemen Eingeführt von Richard Bellman Ludwig Höcker Dynamische Programmierung 13.06.2012 3 / 61

Wofür? Teilprobleme nicht mehrfach berechnen Meist bei Baumrekursion angewandt Bei großen Lösungsräume, bei denen die naive Variante zu lange dauern würde Ludwig Höcker Dynamische Programmierung 13.06.2012 4 / 61

Gliederung Dynamic Programming Bsp.: FAU-Kabel Naiv Top-Down Bottom-Up Longest Increasing Subsequence Optimal Binary Search Tree Ludwig Höcker Dynamische Programmierung 13.06.2012 5 / 61

FAU-Kabel Das Department Informatik hat beschlossen mehr CIP Pools für Studenten bereitzustellen. Da diese Computer mit dem Rest des Uni Netzwerks vernetzt werden müssen, werden nun LAN-Kabel benötigt. Die Kosten hierfür sollen natürlich so minimal wie nötig gehalten werden. Da die CIP Admins alle Frickler sind, ist es möglich LAN-Kabel so oft zu stückeln wie eben nötig. Die Kosten sind abhängig von der Länge. Für einen Kostenvoranschlag sollen nun die die Kosten für die billigste Kabelkombination berechnet werden Ludwig Höcker Dynamische Programmierung 13.06.2012 6 / 61

FAU-Kabel Kosten Länge 1 2 3 4 5 6 7 8 9 10 Kosten 4 5 8 11 16 17 17 21 22 25 Ludwig Höcker Dynamische Programmierung 13.06.2012 7 / 61

FAU-Kabel Kosten Länge 1 2 3 4 5 6 7 8 9 10 Kosten 4 5 8 11 16 17 17 21 22 25 Kabel Kosten Kabel Kosten 4 11 3.1 12 2.2 10 1.3 12 1.1.2 13 1.2.1 13 2.1.1 13 1.1.1.1 16 Ludwig Höcker Dynamische Programmierung 13.06.2012 7 / 61

FAU-Kabel (naiv) Alle Möglichkeiten ausprobieren um die Länge mit 2 Kabeln zu erreichen. Aus diesen wird die kostengünstigste Kombination auswählen. 1 Teil: Kosten aus der Liste (1..n) 2 Teil: Kosten rekursiv berechnen (n-1..0) Immer das Minimum abspeichern cable (n): q: MAX for (i: 1.. n) q = min (q, kosten [i] + cable (n-i)); return q; Ludwig Höcker Dynamische Programmierung 13.06.2012 8 / 61

FAU-Kabel (naiv) 4 3 2 1 0 2 1 0 1 0 0 1 0 0 0 0 Ludwig Höcker Dynamische Programmierung 13.06.2012 9 / 61

FAU-Kabel (naiv) Rekursiver Top-Down Ansatz int p[] = { 0,4,5,8,11,16,17,17,21,22,25 }; int cabletopdownnaiv ( int n){ if( n == 0) return 0; } int q = MAX ; for (i: 1.. n) q = min (q, p[i] + cabletopdownnaiv (n-i)); return q; Ludwig Höcker Dynamische Programmierung 13.06.2012 10 / 61

Memoization Those who cannot remember the past are condemned to repeat it George Santayana Ludwig Höcker Dynamische Programmierung 13.06.2012 11 / 61

Memoization Mehrfache Berechnung der Teilergebnisse überflüssig Bereits errechnete Teilergebnisse zwischenspeichern Basisfälle direkt eintragen Entweder muss ein Wert berechnet werden, oder er steht in der Tabelle D.h. statt exponentieller Laufzeit nun polynomiell D.h. Zusätzlicher Speicherplatz nötig Ludwig Höcker Dynamische Programmierung 13.06.2012 12 / 61

FAU-Kabel (Top-Down) 4 3 2 1 0 2 1 0 1 0 0 1 0 0 0 0 Ludwig Höcker Dynamische Programmierung 13.06.2012 13 / 61

FAU-Kabel (Top-Down) Rekursiver Top-Down Ansatz int p[] = { 0,4,5,8,11,16,17,17,21,22,25 }; int tmp [ MAXN ]; // init. mit INF int cabletopdownmemo ( int n, int tmp []) { if( n == 0) return 0; if(tmp [n]!= INF ) return tmp [n]; // Lookup int q = MAX ; for (i: 1.. n) q = min (q, p[i] + cabletopdownmemo (n-i,tmp )); } tmp [n] = q; // Store return q; Ludwig Höcker Dynamische Programmierung 13.06.2012 14 / 61

FAU-Kabel (Bottom-Up) Umwandlung der rekursiven Variante in eine Iterative Von unten herauf zuerst alle möglichen Teilergebnisse berechnen und in einer Tabelle abspeichern Einfache Berechnung von prob(n+1) wenn prob(n) bekannt ist D.h. Zusätzlicher Speicherplatz nötig Ludwig Höcker Dynamische Programmierung 13.06.2012 15 / 61

FAU-Kabel (Bottom-Up) Bottom-Up Ansatz int p[] = { 0,4,5,8,11,16,17,17,21,22,25 }; int cablebottomup ( int n){ int tmp [n +1]; tmp [0] = 0; } for (i: 1.. n) { int q = MAX ; for (j: 1.. i){ q = min (q, p[j] + tmp [i-j]); } tmp [i] = q; } return tmp [n]; Ludwig Höcker Dynamische Programmierung 13.06.2012 16 / 61

Übersicht Zeittest cable (35) ; Zeit ist Geld $ time./cnaiv $ time./ctop $ time./cbottom real 7m54.389s real 0m0.001s real 0m0.001s Ludwig Höcker Dynamische Programmierung 13.06.2012 17 / 61

Pro und Contra Top-Down DP Pro Memoization Einfache Implementierung Nur Ergebnisse, die benötigt werden, werden berechnet Contra Rekursion Overhead durch Funktionsaufrufe Ludwig Höcker Dynamische Programmierung 13.06.2012 18 / 61

Pro und Contra Bottom-Up DP Pro Eine Rekursion Meist schneller Da Berechnung zu Beginn Contra Umwandlung zu iterativer Variante u.u. schwierig Eventuell mehr Ergebnisse berechnen als nötig Ludwig Höcker Dynamische Programmierung 13.06.2012 19 / 61

DP - Probleme DP nimmt man für... Optimierungsprobleme (Minimum, Maximum) Problem besitzt [überlappende] Teilprobleme DP nimmt man nicht für... Zu große Funktionswerte Zu kleine Funktionswerte (naiv ist da meist besser) Speicherplatz für die Speicherung der Teilergebnisse zu groß Ludwig Höcker Dynamische Programmierung 13.06.2012 20 / 61

Gliederung Dynamic Programming Bsp.: FAU-Kabel Naiv Top-Down Bottom-Up Longest Increasing Subsequence Optimal Binary Search Tree Ludwig Höcker Dynamische Programmierung 13.06.2012 21 / 61

Longest Increasing Subsequence Typisches Problem: Wir stehen in der Mensa-Schlange an, die an den Theken vorbei führt. Es gibt nur die Möglichkeit einmal von vorne bis hinten durchzulaufen. Wir wollen möglichst viele Teller aufladen Es dürfen aber nur Teller ausgewählt werden, die größer sind als der vorher Genommene, damit die Teller nicht im Essen stehen, sondern am Rand aufliegen. Die Teller, die wir nehmen können sind in beliebiger Reihenfolge und nicht sortiert. Ludwig Höcker Dynamische Programmierung 13.06.2012 22 / 61

Longest Increasing Subsequence Mathematisch: Wir haben eine Zahlenfolge gegeben und wollen von Anfang bis Ende die längste aufsteigende Folge haben, die wir finden. Die Zahlen müssen in der Anfangsfolge nicht benachbart sein. Ludwig Höcker Dynamische Programmierung 13.06.2012 23 / 61

Longest Increasing Subsequence Warum nicht einfach bruteforcen? Alle möglichen Kombinaten mit Zahlenfolgen der.. Länge 3: 123,12,13,23,1,2,3 Länge 4: 1234,123,124,134,234,12,13,14,23,24,34,1,2,3,4 Länge 5: 12345,123,124,125,234,235,345,12,13,14... 2 n -1 Möglichkeiten Ludwig Höcker Dynamische Programmierung 13.06.2012 24 / 61

Longest Increasing Subsequence Vorgehensweise Durchlaufen der Zahlenfolge Abspeichern der Zahl an Stelle i in einem seperaten Array, sodass dieses immer aufsteigend sortiert ist. Eine weiter Liste(bspw. lis) speichert uns die LIS bis zur Position i Falls am Ende eingefügt wurde erhöhen wir die maxlänge Falls mitten drin eingefuegt wird, so wird der vorherige Wert an dieser Stelle überschrieben Ludwig Höcker Dynamische Programmierung 13.06.2012 25 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis min 0, maxlength: 0 Ludwig Höcker Dynamische Programmierung 13.06.2012 26 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis min 0, maxlength: 0 i: 0 Ludwig Höcker Dynamische Programmierung 13.06.2012 27 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1 min 0,17 maxlength: 1 i: 0 Ludwig Höcker Dynamische Programmierung 13.06.2012 28 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1 min 0,17 maxlength: 1 i: 1 Ludwig Höcker Dynamische Programmierung 13.06.2012 29 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2 min 0,17,20 maxlength: 2 i: 1 Ludwig Höcker Dynamische Programmierung 13.06.2012 30 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2 min 0,17,20 maxlength: 2 i: 2 Ludwig Höcker Dynamische Programmierung 13.06.2012 31 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3 min 0,17,20,50 maxlength: 3 i: 2 Ludwig Höcker Dynamische Programmierung 13.06.2012 32 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3 min 0,17,20,50 maxlength: 3 i: 3 Ludwig Höcker Dynamische Programmierung 13.06.2012 33 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3 min 0,17,20,30 maxlength: 3 i: 3 Ludwig Höcker Dynamische Programmierung 13.06.2012 34 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3 min 0,17,20,30 maxlength: 3 i: 4 Ludwig Höcker Dynamische Programmierung 13.06.2012 35 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4 min 0,17,20,30,40 maxlength: 4 i: 4 Ludwig Höcker Dynamische Programmierung 13.06.2012 36 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4 min 0,17,20,30,40 maxlength: 4 i: 5 Ludwig Höcker Dynamische Programmierung 13.06.2012 37 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3 min 0,17,20,21,40 maxlength: 4 i: 5 Ludwig Höcker Dynamische Programmierung 13.06.2012 38 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3 min 0,17,20,21,40 maxlength: 4 i: 6 Ludwig Höcker Dynamische Programmierung 13.06.2012 39 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4 min 0,17,20,21,22 maxlength: 4 i: 6 Ludwig Höcker Dynamische Programmierung 13.06.2012 40 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4 min 0,17,20,21,22 maxlength: 4 i: 7 Ludwig Höcker Dynamische Programmierung 13.06.2012 41 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5 min 0,17,20,21,22,23 maxlength: 5 i: 7 Ludwig Höcker Dynamische Programmierung 13.06.2012 42 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5 min 0,17,20,21,22,23 maxlength: 5 i: 8 Ludwig Höcker Dynamische Programmierung 13.06.2012 43 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5, 1 min 0,11,20,21,22,23 maxlength: 5 i: 8 Ludwig Höcker Dynamische Programmierung 13.06.2012 44 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5, 1 min 0,11,20,21,22,23 maxlength: 5 i: 9 Ludwig Höcker Dynamische Programmierung 13.06.2012 45 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5, 1, 2 min 0,11,12,21,22,23 maxlength: 5 i: 9 Ludwig Höcker Dynamische Programmierung 13.06.2012 46 / 61

Longest Increasing Subsequence x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5, 1, 2 min 0,11,12,21,22,23 maxlength: 5 i: 9 Ludwig Höcker Dynamische Programmierung 13.06.2012 47 / 61

Longest Increasing Subsequence LIS, Aufwand O(N*N) int sequ [ MAXN ]; int lis [ MAXN ]; int minval [ MAXN +1]; int LIS ( int N) { int maxlen = 0; minval [0] = INT_MIN ; FOR (i, 0, N) { lis [i] = maxlen +1; FOR (j, 1, maxlen ) { if( minval [j] > sequ [i]){ lis [i] = j; break ; } } if ( lis [i] > maxlen ) { maxlen = lis [i]; minval [ maxlen ] = sequ [i]; } else if ( sequ [i] < minval [ lis [i ]]) { minval [ lis [i]] = sequ [i]; } } return maxlen ; } Ludwig Höcker Dynamische Programmierung 13.06.2012 48 / 61

Longest Increasing Subsequence LIS, Aufwand O(N*log(N)) // aus dem HW wiki int sequ [ MAXN ]; int lis [ MAXN ]; int minval [ MAXN +1]; int LIS ( int N) { int maxlen = 0; minval [0] = INT_MIN ; FOR (i, 0, N) { // binary search : lis [i] = lower_bound ( minval, minval + maxlen + 1, sequ [i]) - minval ; if ( lis [i] > maxlen ) { maxlen = lis [i]; minval [ maxlen ] = sequ [i]; } else if ( sequ [i] < minval [ lis [i ]]) { minval [ lis [i]] = sequ [i]; } } return maxlen ; } Ludwig Höcker Dynamische Programmierung 13.06.2012 49 / 61

Longest Increasing Subsequence Rekonstruktion der Subsequence Statt Zahlen Indices in min speichern Zusätzliches Array id, welches Vorgänger speichert x 17,20,50,30,40,21,22,23,11,12 lis 1, 2, 3, 3, 4, 3, 4, 5, 2, 3 min 0, 8, 9, 5, 6, 7 (Index zu x) id -1, 0, 1, 1, 3, 1, 5, 6,-1, 8 maxid: 7 Ludwig Höcker Dynamische Programmierung 13.06.2012 50 / 61

Longest Increasing Subsequence LIS, Aufwand O(N*log(N)) int sequ [ MAXN ]; int lis [ MAXN ]; int minval [ MAXN +1]; int ids [ MAXN ]; int maxid = -1; // Speicherplatz fuer IDs int LIS ( int N) { int maxlen = 0; minval [0] = INT_MIN ; FOR (i, 0, N) { lis [i] = maxlen +1; FOR (j, 1, maxlen ) { if(sequ [ minval [j]] > sequ [i]){ lis [i] = j; break ; } } if(lis [i] == 1) id[i] = -1; // erstes Element else id[i] = minval [lis [i ] -1]; // Parentelement } if ( lis [i] > maxlen ) { maxlen = lis [i]; minval [ maxlen ] = i; maxid = i; // maxid setzen } else if ( sequ [i] < minval [ lis [i ]]) { minval [ lis [i]] = i; } } return maxlen ; Ludwig Höcker Dynamische Programmierung 13.06.2012 51 / 61

Gliederung Dynamic Programming Bsp.: FAU-Kabel Naiv Top-Down Bottom-Up Longest Increasing Subsequence Optimal Binary Search Tree Ludwig Höcker Dynamische Programmierung 13.06.2012 52 / 61

OBST k2 k1 k4 d0 d1 k3 k5 d2 d3 d4 d5-0 1 2 3 4 5 p i 0.15 0.10 0.05 0.10 0.20 q i 0.05 0.10 0.05 0.05 0.05 0.10 Ludwig Höcker Dynamische Programmierung 13.06.2012 53 / 61

OBST Gegeben: BST mit Knotenhäufigkeiten Gesucht: Optimaler BST anhand Gewichtungsfunktion Rekursiv alle möglichen BSTs zu testen dauert zu lange, da die Anzahl an BSTs mit wachsender Knotenanzahl exponentiell ansteigt. Lösung: Dynamische Programmierung Ludwig Höcker Dynamische Programmierung 13.06.2012 54 / 61

OBST Gewichtung Eine mögliche Gewichtung eines BST: n (Tiefe T (k i ) + 1) p i + i=1 n (Tiefe T (d i ) + 1) q i i=0 Ein optimal binary search tree ist die Konstellation mit der niedrigsten Gewichtung Ludwig Höcker Dynamische Programmierung 13.06.2012 55 / 61

OBST Zur Wiederholung Ein BST(i, j) hat einen linken Teilbaum k i...k r 1 und hat den root Knoten k r hat einen rechten Teilbaum k r+1...k j Ein BST(i, i-1) hat die Wahrscheinlichkeit d i 1 des Blattknoten Ludwig Höcker Dynamische Programmierung 13.06.2012 56 / 61

OBST Kosten für tree(i, j): Rekursionsformel: cost(i, j) = cost(i, r 1) + cost(r + 1, j) +GEWICHTUNG(i, j) q i 1 fallsj = i 1 cost(i, j) = min i r j (cost(i, r 1) + cost(r + 1, j) fallsi j +GEWICHTUNG(i, j)) Ludwig Höcker Dynamische Programmierung 13.06.2012 57 / 61

OBST OBST, naiv cost (i, j, p[], q []) { if(j == i -1) return q[i -1]; tmp : MAX ; for (r: i..j){ tmp = min (tmp, cost (i, r -1, p, q) + cost (r+1, j, p, q) + GEWICHTUNG (i, j, p, q)); } return tmp ; } Ludwig Höcker Dynamische Programmierung 13.06.2012 58 / 61

OBST Problem: Per naiver Rekursionsformel, werden Teilbäume mehrfach berechnet Lösung: Kosten für einen gefundenen optimal Teilbaum abspeichern Trick: Sind rechter und linker Teilbäume optimal, so ist auch der Baum optimal. Ludwig Höcker Dynamische Programmierung 13.06.2012 59 / 61

OBST OBST, TopDown mit DP table [MAXN ][ MAXN ]; // init. mit INF cost (i, j, p[], q []) { if(j == i -1) return q[i -1]; if( table [i][j]!= INF ) return table [i][j]; // Lookup } gewicht = GEWICHTUNG (i, j, p, q); tmp : MAX ; for (r: i..j){ tmp = min (tmp, cost (i, r -1, p, q) + cost (r+1, j, p, q) + gewicht ); } table [i][j] = tmp ; // Store return table [i][j]; Ludwig Höcker Dynamische Programmierung 13.06.2012 60 / 61

Quellen T. Cormen, et al. Introduction to Algorithms (Third Edition) Manuel Grandeit, Hallo Welt DP-Vortrag 2011 Rainer Müller, Hallo Welt DP-Vortrag 2008 Tobias Werth, Hallo Welt DP-Vortrag 2004 http://forums.topcoder.com/?module=thread& threadid=700080&start=0&mc=5 http://forums.topcoder.com/?module=thread& threadid=697925&start=0&mc=9 http://en.wikipedia.org/wiki/longest increasing subsequence Ludwig Höcker Dynamische Programmierung 13.06.2012 61 / 61