1 / 123

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2). Organisatorisches. Test (18.5.) Bitte seien Sie um 12 Uhr im Audimax Hilfsmittel: ein handbeschriebenes DIN A4 Blatt Übungsgruppen Wenn ihre Übungsgruppe wegen eines Feiertags ausfällt, gehen Sie in eine andere

yuma
Télécharger la présentation

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

  2. Organisatorisches Test (18.5.) • Bitte seien Sie um 12 Uhr im Audimax • Hilfsmittel: ein handbeschriebenes DIN A4 Blatt Übungsgruppen • Wenn ihre Übungsgruppe wegen eines Feiertags ausfällt, gehen Sie in eine andere • Falls Sie an keiner Übung teilnehmen, wird dies als Fehlen gewertet

  3. Dynamische Programmierung Fibonacci-Zahlen • F(1) = 1 • F(2) = 1 • F(n) = F(n-1) + F(n-2)

  4. Dynamische Programmierung Fib(n) • if n=1 return 1 • if n=2 return 1 • return Fib(n-1) + Fib(n-2)

  5. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • Wir zeigen, dass die Laufzeit T(n) von Fib(n) größer als . n

  6. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • Wir zeigen, dass die Laufzeit T(n) von Fib(n) größer als . • Damit folgt das Lemma wegen . n

  7. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • Wir zeigen, dass die Laufzeit T(n) von Fib(n) größer als . • Damit folgt das Lemma wegen . • Beweis per Induktion über n. • (I.A.) Für n=1 ist T(1) ≥ 1 ≥ . n

  8. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • Wir zeigen, dass die Laufzeit T(n) von Fib(n) größer als . • Damit folgt das Lemma wegen . • Beweis per Induktion über n. • (I.A.) Für n=1 ist T(1) ≥ 1 ≥ . Für n=2 ist T(2) ≥ 1 ≥ . n

  9. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • (I.V.) Für m<n ist T(n) ≥ . n

  10. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • (I.V.) Für m<n ist T(n) ≥ . • (I.S.) Wir haben T(n) ≥ T(n-1) + T(n-2) da der Algorithmus für n>2 Fib(n-1) und Fib(n-2) rekursiv aufruft. Nach (I.V.) gilt somit n

  11. Dynamische Programmierung Lemma • Die Laufzeit von Fib(n) ist W(1.6 ). Beweis • (I.V.) Für m<n ist T(n) ≥ . • (I.S.) Wir haben T(n) ≥ T(n-1) + T(n-2) da der Algorithmus für n>2 Fib(n-1) und Fib(n-2) rekursiv aufruft. Nach (I.V.) gilt somit n

  12. Dynamische Programmierung Warum ist die Laufzeit so schlecht? • Betrachten wir Rekursionbaum für Aufruf Fib(6) 6 4 5 2 3 3 4 2 1 1 2 3 2 1 2

  13. Dynamische Programmierung Warum ist die Laufzeit so schlecht? • Betrachten wir Rekursionbaum für Aufruf Fib(6) Bei der Berechnung von Fib(6) wird Fib(3) dreimal aufgerufen! 6 4 5 2 3 3 4 2 1 1 2 3 2 1 2

  14. Dynamische Programmierung Warum ist die Laufzeit so schlecht? • Betrachten wir Rekursionbaum für Aufruf Fib(6) Es wird also mehrmals dieselbe Rechnung durchgeführt! 6 4 5 2 3 3 4 2 1 1 2 3 2 1 2

  15. Dynamische Programmierung Warum ist die Laufzeit so schlecht? • Betrachten wir Rekursionbaum für Aufruf Fib(6) Bei großem n passiert dies sehr häufig! 6 4 5 2 3 3 4 2 1 1 2 3 2 1 2

  16. Dynamische Programmierung Memoisation • Memoisation bezeichnet die Zwischenspeicherung der Ergebnisse von Funktionsaufrufen eines rekursiven Algorithmus.

  17. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n] • for i 1 to n do • F[i]  0 • F[1]  1 • F[2]  1 • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  18. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do • F[i]  0 • F[1]  1 • F[2]  1 • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  19. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do  Setze Feldeinträge auf 0 • F[i]  0 • F[1]  1 • F[2]  1 • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  20. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do  Setze Feldeinträge auf 0 • F[i]  0 • F[1]  1  Setze F[1] auf korrekten Wert • F[2]  1  Setze F[2] auf korrekten Wert • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  21. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do  Setze Feldeinträge auf 0 • F[i]  0 • F[1]  1  Setze F[1] auf korrekten Wert • F[2]  1  Setze F[2] auf korrekten Wert • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  22. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do  Setze Feldeinträge auf 0 • F[i]  0 • F[1]  1  Setze F[1] auf korrekten Wert • F[2]  1  Setze F[2] auf korrekten Wert • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n]  Gib Wert zurück, falls  schon berechnet • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  23. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do  Setze Feldeinträge auf 0 • F[i]  0 • F[1]  1  Setze F[1] auf korrekten Wert • F[2]  1  Setze F[2] auf korrekten Wert • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n]  Gib Wert zurück, falls  schon berechnet • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F)  Ansonsten berechne Wert  und speichere Wert ab • return F[n]

  24. Dynamische Programmierung Fib2(n) • Initialisiere Feld F[1..n]  Initialisiere Feld für Funktionswerte • for i 1 to n do  Setze Feldeinträge auf 0 • F[i]  0 • F[1]  1  Setze F[1] auf korrekten Wert • F[2]  1  Setze F[2] auf korrekten Wert • return FibMemo(n,F) FibMemo(n,F) • if F[n]>0 then return F[n]  Gib Wert zurück, falls  schon berechnet • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F)  Ansonsten berechne Wert  und speichere Wert ab • return F[n]  Gib Wert zurück

  25. Dynamische Programmierung Fib2(n) Laufzeit: • Initialisiere Feld F[1..n] O(n) • for i 1 to n do O(n) • F[i]  0 O(n) • F[1]  1 O(1) • F[2]  1 O(1) • return FibMemo(n,F) 1+T(n) FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n]

  26. Dynamische Programmierung Beispiel • FibMemo(6,F) 6

  27. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5

  28. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4

  29. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 3

  30. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 3 2

  31. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 3 2

  32. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 3 1 2

  33. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 3 1 2 1

  34. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 3 1 1 2 1

  35. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 2 3 1 1 2 1

  36. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 2 3 2 1 1 2 1

  37. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 2 1 3 2 1 1 2 1

  38. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 3 4 2 1 3 2 1 1 2 1

  39. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 3 3 4 2 1 3 2 1 1 2 1

  40. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 2 3 3 4 2 1 3 2 1 1 2 1

  41. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 5 2 3 3 4 2 1 3 2 1 1 2 1

  42. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 5 4 5 2 3 3 4 2 1 3 2 1 1 2 1

  43. Dynamische Programmierung Beispiel • FibMemo(6,F) 6 3 5 4 5 2 3 3 4 2 1 3 2 1 1 2 1

  44. Dynamische Programmierung 8 Beispiel • FibMemo(6,F) 6 3 5 4 5 2 3 3 4 2 1 3 2 1 1 2 1

  45. Dynamische Programmierung FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n] Laufzeit • Jeder Aufruf FibMemo(m,F) generiert höchstens einmal die rekursiven Aufrufe FibMemo(m-1,F) und FibMemo(m-2,F)

  46. Dynamische Programmierung FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n] Laufzeit • Jeder Aufruf FibMemo(m,F) generiert höchstens einmal die rekursiven Aufrufe FibMemo(m-1,F) und FibMemo(m-2,F) • Also wird für jedes m<n die Funktion FibMemo(m,F) höchstens zweimal aufgerufen

  47. Dynamische Programmierung FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n] Laufzeit • Jeder Aufruf FibMemo(m,F) generiert höchstens einmal die rekursiven Aufrufe FibMemo(m-1,F) und FibMemo(m-2,F) • Also wird für jedes m<n die Funktion FibMemo(m,F) höchstens zweimal aufgerufen • Ohne die Laufzeit für die rekursiven Aufrufe benötigt FibMemo O(1) Zeit

  48. Dynamische Programmierung FibMemo(n,F) • if F[n]>0 then return F[n] • F[n]  FibMemo(n-1, F) + FibMemo(n-2, F) • return F[n] Laufzeit • Jeder Aufruf FibMemo(m,F) generiert höchstens einmal die rekursiven Aufrufe FibMemo(m-1,F) und FibMemo(m-2,F) • Also wird für jedes m<n die Funktion FibMemo(m,F) höchstens zweimal aufgerufen • Ohne die Laufzeit für die rekursiven Aufrufe benötigt FibMemo O(1) Zeit • Wir zählen jeden Aufruf mit Parameter 1..n. Daher müssen wir den Aufwand für die rekursiven Aufrufe nicht berücksichtigen. Damit ergibt sich eine Laufzeit von T(n)=O(n)

  49. Dynamische Programmierung Beobachtung • Die Funktionswerte werden bottom-up berechnet Grundidee der dynamischen Programmierung • Berechne die Funktionswerte iterativ und bottom-up FibDynamischeProgrammierung(n) • Initialisiere Feld F[1..n] • F[1]  1 • F[2]  1 • for i  3 to n do • F[i]  F[i-1] + F[i-2] • return F[i]

  50. Dynamische Programmierung Beobachtung • Die Funktionswerte werden bottom-up berechnet Grundidee der dynamischen Programmierung • Berechne die Funktionswerte iterativ und bottom-up FibDynamischeProgrammierung(n) • Initialisiere Feld F[1..n] • F[1]  1 • F[2]  1 • for i  3 to n do • F[i]  F[i-1] + F[i-2] • return F[i] Laufzeit O(n)

More Related