Was ist Dynamische Programmierung?

Methode des Algorithmenentwurfs, die ein Problem in kleinere Teilprobleme zerlegt und deren Lösungen zur Wiederverwendung in einer Tabelle festhält, um dieselbe Berechnung nicht mehrfach auszuführen. Sie wird unter anderem für das Rucksackproblem, das Wechselgeldproblem mit möglichst wenigen Münzen, die längste gemeinsame Teilfolge und kürzeste Wege eingesetzt.

Japanische Bezeichnung: 動的計画法

„Dynamische Programmierung“ kommt in 2 Übungsfragen aus 1 Themen vor, z. B. Datenstrukturen und Algorithmen.

Fachgebiet: Datenstrukturen und Algorithmen

Die Idee: jedes überlappende Teilproblem nur einmal lösen

Werden Fibonacci-Zahlen direkt nach fib(n) = fib(n−1) + fib(n−2) rekursiv berechnet, werden dieselben Werte immer wieder neu berechnet, und die Zahl der Aufrufe wächst exponentiell (etwa 2,69 Millionen für fib(30)). Die dynamische Programmierung hält die Lösung jedes Teilproblems fest, sobald sie gefunden ist, und schlägt sie danach nur noch nach, sodass fib(n) einen Aufwand proportional zu n erfordert. Sie ist anwendbar, wenn sich die optimale Lösung eines großen Problems aus optimalen Lösungen kleinerer Teilprobleme zusammensetzen lässt (optimale Teilstruktur) und dieselben Teilprobleme mehrfach auftreten (überlappende Teilprobleme).

Memoisation und das Füllen von Tabellen

Es gibt zwei Umsetzungsweisen: die Memoisation (Top-down), die die rekursive Form beibehält, sich aber berechnete Ergebnisse merkt, und den Bottom-up-Ansatz, der eine Tabelle beginnend bei den kleinsten Teilproblemen füllt. Beim 0/1-Rucksackproblem zum Beispiel enthält die Tabelle „den höchsten Wert, der mit den Gegenständen bis i innerhalb der Kapazität c erreichbar ist“, und sie wird gefüllt, indem jeweils das Größere aus Mitnehmen und Weglassen eines Gegenstands gewählt wird. Bei n Gegenständen und der Kapazität W kostet das O(nW). Das Problem der kleinsten Münzzahl lässt sich ebenso lösen, indem man für jeden Betrag von 0 bis zum Zielbetrag die kleinste Münzzahl tabelliert.

Unterschied zu Greedy-Algorithmen und Anwendungen

Ein Greedy-Algorithmus wählt einfach in jedem Moment die am besten erscheinende Möglichkeit und geht weiter; er ist daher schnell, bei manchen Problemen aber nicht optimal. Sollen 8 Yen mit Münzen zu 1, 4 und 6 Yen bezahlt werden, verwendet der Greedy-Algorithmus drei Münzen, 6 + 1 + 1, während die dynamische Programmierung zwei findet, 4 + 4. Die dynamische Programmierung ist weit verbreitet, etwa für die Editierdistanz und die längste gemeinsame Teilfolge von Zeichenketten (wie im Befehl diff), das Alignment von DNA-Sequenzen, den Viterbi-Algorithmus in der Spracherkennung und den Floyd-Warshall-Algorithmus für kürzeste Wege zwischen allen Knotenpaaren.

Jetzt üben: Fragen zu Dynamische Programmierung

8 Yen sollen mit Münzen zu 1 Yen, 4 Yen und 6 Yen bezahlt werden. Welche Aussage über die Zahl der Münzen, die ein Greedy-Algorithmus wählt (der zuerst so viele der größten Münze wie möglich verwendet), im Verhältnis zur kleinstmöglichen Münzzahl ist richtig?

  1. AAuch der Greedy-Algorithmus erreicht das Minimum von 2 Münzen
  2. BDer Greedy-Algorithmus verwendet 3 Münzen und verfehlt das Minimum von 2
  3. CDer Greedy-Algorithmus verwendet 3 Münzen, und das ist das Minimum
Antwort und Erläuterung anzeigen

Antwort: B. Der Greedy-Algorithmus verwendet 3 Münzen und verfehlt das Minimum von 2

Der Greedy-Algorithmus nimmt zuerst eine 6-Yen-Münze und zahlt die restlichen 2 Yen mit zwei 1-Yen-Münzen, insgesamt also 3 Münzen. Mit zwei 4-Yen-Münzen geht es aber mit nur 2. Weil ein Greedy-Algorithmus nur die jeweils im Moment beste Wahl aneinanderreiht, ist er bei manchen Münzsystemen nicht optimal. Die dynamische Programmierung, die eine Tabelle der kleinsten Münzzahl für jeden Betrag von 0 bis 8 Yen in aufsteigender Reihenfolge füllt, findet immer das Minimum. Bei Münzsystemen wie dem japanischen mit 1, 5, 10, 50, 100 und 500 Yen liefert der Greedy-Algorithmus stets das Minimum.

Ein Rucksack mit der Kapazität 8 wird mit Gegenständen aus vier Gegenständen mit (Gewicht, Wert) (2, 3), (3, 4), (4, 5) und (5, 6) gefüllt. Jeden Gegenstand gibt es nur einmal, und Gegenstände lassen sich nicht teilen. Wie groß ist der höchste Gesamtwert bei einem Gesamtgewicht von höchstens 8?

  1. A7
  2. B9
  3. C10
Antwort und Erläuterung anzeigen

Antwort: C. 10

Die Gegenstände mit den Gewichten 3 und 5 ergeben das Gewicht 8 und den Wert 4 + 6 = 10, das Maximum. Die Gewichte 2 und 5 (Wert 9) oder 3 und 4 (Wert 9) passen ebenfalls, erreichen aber nicht 10, und drei beliebige Gegenstände wiegen mindestens 2 + 3 + 4 = 9, mehr als die Kapazität. Ein Greedy-Algorithmus, der die Gegenstände nach Wert pro Gewichtseinheit einpackt, nimmt die Gegenstände mit den Gewichten 2 und 3 (Wert 7); danach passt kein Gegenstand mehr in die verbleibende Kapazität 3, und er bleibt bei 7 stehen. Die dynamische Programmierung aktualisiert Gegenstand für Gegenstand eine Tabelle des besten Werts, der innerhalb jeder Kapazität c erreichbar ist, und findet das Optimum in O(nW) für n Gegenstände und die Kapazität W.

Häufige Fragen

Wie unterscheidet sich die dynamische Programmierung von Teile und herrsche?

Beide zerlegen ein Problem in Teilprobleme, doch bei Teile-und-herrsche-Algorithmen wie Mergesort überlappen sich die Teilprobleme nicht, daher müssen keine Lösungen festgehalten werden. Die dynamische Programmierung unterscheidet sich darin, dass sie Lösungen festhält und wiederverwendet, wenn dieselben Teilprobleme mehrfach auftreten.

Was sind die Schwächen der dynamischen Programmierung?

Sie braucht Speicher und Aufwand proportional zur Größe der Tabelle. Das O(nW) des Rucksackproblems ist proportional zum Wert der Kapazität W und wird daher unpraktikabel, wenn W sehr groß ist. Der Speicherbedarf lässt sich verringern, indem nur das Nötige festgehalten oder nur die vorherige Zeile der Tabelle aufbewahrt wird.

„Dynamische Programmierung“ in den Erläuterungen

Fragen mit „Dynamische Programmierung“ (2)

  1. 8 Yen sollen mit Münzen zu 1 Yen, 4 Yen und 6 Yen bezahlt werden. Welche Aussage über die Zahl der Münzen, die ein Greedy-Algorithmus wählt (der zuerst so viele der größten Münze wie möglich verwendet), im Verhältnis zur kleinstmöglichen Münzzahl ist richtig?
  2. Ein Rucksack mit der Kapazität 8 wird mit Gegenständen aus vier Gegenständen mit (Gewicht, Wert) (2, 3), (3, 4), (4, 5) und (5, 6) gefüllt. Jeden Gegenstand gibt es nur einmal, und Gegenstände lassen sich nicht teilen. Wie groß ist der höchste Gesamtwert bei einem Gesamtgewicht von höchstens 8?

Verwandte Begriffe

Greedy-Algorithmus Binäre Suche (Binary Search) Binärer Heap (Binary Heap) Binärer Suchbaum (Binary Search Tree) Breitensuche (Breadth-First Search) Dijkstra-Algorithmus Hashtabelle (Hash Table) Rekursion Stabiles Sortierverfahren (Stable Sort) Stack (Stapelspeicher)

Zur Glossarübersicht