Lösungen Dynamisches Programmieren

Aus ProgrammingWiki

Wechseln zu: Navigation, Suche

Loading

Autoren:
Markus Ullrich - simaullr@stud.hs-zigr.de
Norbert Baum   - sinobaum@stud.hs-zigr.de


Inhaltsverzeichnis

Lösungen zu Fibonacci

Die ersten 2 Lösungen sind bereits aus dem Abschnitt Dynamisches_Programmieren bekannt, werden hier aber der Vollständigkeit wegen nochmal aufgeführt.

Fibonacci ohne Memoizing

Fibonacci mit Memoizing

Iterative Lösung von Fibonacci

Wie bereits erwähnt, ist ein wenig Denkaufwand erforderlich um auf die iterative Lösung zu kommen. Dabei wird der Wert Top-Down mit Hilfe einer for-Schleife berechnet. Da zum berechnen von nur und benötigt wird, müssen auch nur diese Werte zwischen gespeichert werden. Der aufmerksame Leser wird sich an das Rucksackproblem erinnern in dem wir genauso verfahren sind.

Mithilfe dieser Informationen kommt man nun auf folgendes Ergebnis:

Zusatz: mit fast konstantem Speicheraufwand (und ohne Stackoverflow)

Bei der Berechnung sehr großer Fibonacci-Zahlen wird von Java ziemlich schnell ein StackOverflowError geworfen. Das liegt natürlich an der Rekursonstiefe. Bei sehr großen ist diese ein Problem, da alle Aufrufe bis zur 'Berechnung' von im Stack verbleiben müssen, damit diese terminieren können.

Umgehen können wir dieses Problem, indem wir nur eine bestimmte Rekursionstiefe zulassen. Das erreichen wir mit Hilfe einer for-Schleife mit dem Schleifenzähler , die in 200er Schritten zählt und in jedem Durchlauf berechnet. Das geschieht bis größer werden würde als . Danach muss nur noch berechnet werden. Somit erreichen wir eine maximale Rekursionstiefe von 200 Aufrufen, weil der vorher berechnete Wert natürlich noch in der memoliste gespeichert ist und einfach nur noch abgerufen werden muss.

Zusätzlich können wir den Speicheraufwand (fast) konstant halten indem wir, wie bei der iterativen Variante nur und speichern. Das erreichen wir indem wir nach der Berechnung einfach wieder aus der memoliste entfernen.

Somit erhalten wir folgende 2 Methoden:

Lösungen zur Matrizenkettenmultiplikation

Wir verwenden wieder generateMatrix(int zeilen, int spalten) um uns Matrizen beliebiger Größe zu generieren und die bekannte memoListe zum speichern von Teillösungen. Danach bleibt uns nur noch die rekursive Vorschrift in eine rekursive Prozedur umzuformen, was sich als recht trivial erweißt. Lediglich die Abfrage, ob der berechnete Wert schon in der memoListe vorhanden ist, muss noch zusätzlich in die Prozedur eingebaut werden. Zusätzlich verwenden wir die kListe, in der die Stellen gespeichert werden, an denen sich die Kette bei der optimalen Klammerung zwischen und aufspaltet. Damit kann nach der Berechnung die optimale Klammerung mit einer einfachen Methode ausgegeben werden.

Persönliche Werkzeuge