Gliederung 1. Grundlagen 2. Zahlentheoretische Algorithmen 3. Sortierverfahren 4. Ausgewählte Datenstrukturen 5. Dynamisches Programmieren 6. Graphalgorithmen 7. String-Matching 8. Kombinatorische Algorithmen 9. Lineare Programmierung 5/3, Folie 1 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Problemstellung Menge A von Artikeln Funktion g(.), die jedem Artikel in A seine Größe zuordnet (/* d.h. g(.) ist bspw. eine Funktion von A nach N */) Funktion w(.), die jedem Artikel in A seinen Wert zuordnet (/* d.h. w(.) ist bspw. eine Funktion von A nach N */) Gesamtgröße G... Beispiel: Klausur A - Menge der Aufgaben g(a) - Zeit zum Lösen von Aufgabe a w(a) - Anzahl der erreichbaren Punkte für Aufgabe a G - die zur Verfügung stehende Gesamtzeit... Ziel: Teilmenge A* von A finden, so daß die Artikel in A* zusammen eine Größe G und einen maximalen Gesamtwert haben 5/3, Folie 2 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Rekursive Lösung es seien A = { a 1,...,a n }, g(.), w(.) und G gegeben der Aufruf erfolgt mit x = n und y = G int wert ( int x, int y ) { int result = 0; if ( x == 0 ) return(result); if ( g(a x ) > y ) result = wert(x-1,y); else { result = max(w(a x )+wert(x-1,y-g(a x )),wert(x-1,y)); return(result); } }... falls g(a x ) zu groß ist, so kann a x nicht benutzt werden... andernfalls, vergleiche den Wert der besten Teilmenge A mit a x A und einer Größe y - g(a x ) und den Wert der besten Teilmenge A mit a x A und einer Größe y 5/3, Folie 3 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Anmerkungen zur rekursiven Lösung korrekt, da das Bellmannsche Optimalitätskriterium erfüllt ist (/* für eine beste Teilmenge A A mit a x A und der Größe G gilt, daß A = A \ { a x } eine beste Teilmenge von A \ { a x } der Größe G - g(a x ) ist */) offenbar finden im worst case exponentiell viele Funktionsaufrufe statt (/* exponentiell in A ; genau 2 A viele */)... aber es gibt insgesamt höchstens A *G viele verschiedene Funktionsaufrufe... Idee: die Ergebnisse der verschiedenen Funktionsaufrufe systematisch berechnen und in einer Tabelle speichern 5/3, Folie 4 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung */) A = { a 1,a 2,a 3,a 4,a 5 } w(a 1 ) = 4; w(a 2 ) = 3; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 G = 10... wir verwenden eine Tabelle t der Größe 6 11 (/* zusätzliche Zeile und Spalte für eine einfache Initialisierung */)... t[x][y] = wert(x,y), d.h. bester Wert für A { a 1,...,a x ) einer Größe y... t[x][y] = 0, falls x = 0 oder y = 0... t[x][y] = t[x-1][y], falls x 0, y 0 und y - g(a x ) < 0... t[x][y] = max { w(a x ) + t[x-1][y-g(a x )], t[x-1][y] }, sonst 5/3, Folie 5 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 { a 1,a 2 } 0 { a 1,...,a 3 } 0 { a 1,...,a 4 } 0 { a 1,...,a 5 } 0 5/3, Folie 6 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung, Ausfüllen */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 0 3 3 3 3 3 3 3 3 3 { a 1,a 2 } 0 { a 1,...,a 3 } 0 { a 1,...,a 4 } 0 { a 1,...,a 5 } 0 max { w(a 1 ) + t[0][0], t[0][2] } 5/3, Folie 7 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung, Ausfüllen */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 0 3 3 3 3 3 3 3 3 3 { a 1,a 2 } 0 0 4 4 7 7 7 7 7 7 7 { a 1,...,a 3 } 0 { a 1,...,a 4 } 0 { a 1,...,a 5 } 0 max { w(a 2 ) + t[1][0], t[1][2] } max { w(a 2 ) + t[1][2], t[1][4] } 5/3, Folie 8 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung, Ausfüllen */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 0 3 3 3 3 3 3 3 3 3 { a 1,a 2 } 0 0 4 4 7 7 7 7 7 7 7 { a 1,...,a 3 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 4 } 0 { a 1,...,a 5 } 0 max { w(a 3 ) + t[2][4], t[2][7] } 5/3, Folie 9 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung, Ausfüllen */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 0 3 3 3 3 3 3 3 3 3 { a 1,a 2 } 0 0 4 4 7 7 7 7 7 7 7 { a 1,...,a 3 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 4 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 5 } 0 5/3, Folie 10 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung, Ausfüllen */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 0 3 3 3 3 3 3 3 3 3 { a 1,a 2 } 0 0 4 4 7 7 7 7 7 7 7 { a 1,...,a 3 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 4 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 5 } 0 0 4 4 7 7 7 10 10 12 12 max { w(a 5 ) + t[4][4], t[4][9] } 5/3, Folie 11 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Beispiel (/* Dynamische Programmierung, Lösung ablesen */) w(a 1 ) = 3; w(a 2 ) = 4; w(a 3 ) = 3; w(a 4 ) = 3; w(a 5 ) = 8 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 { a 1 } 0 0 3 3 3 3 3 3 3 3 3 { a 1,a 2 } 0 0 4 4 7 7 7 7 7 7 7 { a 1,...,a 3 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 4 } 0 0 4 4 7 7 7 10 10 10 10 { a 1,...,a 5 } 0 0 4 4 7 7 7 10 10 12 12 max { w(a 2 ) + t[1][1], t[1][3] } a 2 A* max { w(a 5 ) + t[4][3], t[4][10] } a 5 A* 5/3, Folie 12 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Komplexitätsanalyse es seien A, g(.), w(.) und G gegeben... Größe der Tabelle: O( A *G)... je Eintrag wird konstante Zeit benötigt... insgesamt wird die Zeit O( A *G) benötigt 5/3, Folie 13 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u Anmerkung (/* das ist NP-vollständig */) es seien A, g(.), w(.) und G gegeben falls bei der Beschreibung der Problemgröße n die Länge der Binärdarstellung bin(g) von G berücksichtigt wird (/* d.h. es kann etwa n O( bin(g) ) gelten */), so erhält man ein qualitativ anderes Ergebnis... Größe der Tabelle: O(n*2 n )... je Eintrag wird die Zeit O(n) benötigt... insgesamt wird die Zeit O(n 2 *2 n ) benötigt (/* also ist der vorgestellte Algorithmus einer mit exponentieller Laufzeit */) 5/3, Folie 14 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen
u... 5/3, Folie 15 2014 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen