Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

123
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

description

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 - PowerPoint PPT Presentation

Transcript of Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Page 1: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Page 2: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

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

Page 3: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

3

Dynamische Programmierung

Fibonacci-Zahlen F(1) = 1 F(2) = 1 F(n) = F(n-1) + F(n-2)

Page 4: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

4

Dynamische Programmierung

Fib(n)

1. if n=1 return 1

2. if n=2 return 1

3. return Fib(n-1) + Fib(n-2)

Page 5: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

5

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (1.6 ).

Beweis• Wir zeigen, dass die Laufzeit T(n) von Fib(n) größer als .

n

2

51

3

1

n

Page 6: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

6

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (1.6 ).

Beweis• Wir zeigen, dass die Laufzeit T(n) von Fib(n) größer als .

• Damit folgt das Lemma wegen .

n

2

51

3

1

6.12

51

n

Page 7: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

7

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (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

2

51

3

1

6.12

51

2

51

3

1

n

Page 8: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

8

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (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

2

51

3

1

6.12

51

2

51

3

1

2

2

51

3

1

n

Page 9: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

9

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (1.6 ).

Beweis• (I.V.) Für m<n ist T(n) ≥ .

m

2

51

3

1

n

Page 10: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

10

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (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

m

2

51

3

1

n

21

2

51

3

1

2

51

3

1)2()1()(

nn

nTnTnT

Page 11: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

11

Dynamische Programmierung

Lemma• Die Laufzeit von Fib(n) ist (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

m

2

51

3

1

n

21

2

51

3

1

2

51

3

1)2()1()(

nn

nTnTnT

nn

2

51

3

1

2

511

2

51

3

12

Page 12: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

12

Dynamische Programmierung

Warum ist die Laufzeit so schlecht? Betrachten wir Rekursionbaum für Aufruf Fib(6)

6

5 4

4 3 3 2

3 2 2 1 2 1

2 1

Page 13: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

13

Dynamische Programmierung

Warum ist die Laufzeit so schlecht? Betrachten wir Rekursionbaum für Aufruf Fib(6)

6

5 4

4 3 3 2

3 2 2 1 2 1

2 1

Bei der Berechnung von Fib(6) wird Fib(3) dreimal

aufgerufen!

Page 14: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

14

Dynamische Programmierung

Warum ist die Laufzeit so schlecht? Betrachten wir Rekursionbaum für Aufruf Fib(6)

6

5 4

4 3 3 2

3 2 2 1 2 1

2 1

Es wird also mehrmals dieselbe Rechnung

durchgeführt!

Page 15: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

15

Dynamische Programmierung

Warum ist die Laufzeit so schlecht? Betrachten wir Rekursionbaum für Aufruf Fib(6)

6

5 4

4 3 3 2

3 2 2 1 2 1

2 1

Bei großem n passiert dies sehr häufig!

Page 16: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

16

Dynamische Programmierung

Memoisation Memoisation bezeichnet die Zwischenspeicherung der Ergebnisse von

Funktionsaufrufen eines rekursiven Algorithmus.

Page 17: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

17

Dynamische Programmierung

Fib2(n)

1. Initialisiere Feld F[1..n]

2. for i 1 to n do

3. F[i] 0

4. F[1] 1

5. F[2] 1

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Page 18: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

18

Dynamische Programmierung

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do

3. F[i] 0

4. F[1] 1

5. F[2] 1

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Page 19: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

19

Dynamische Programmierung

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do Setze Feldeinträge auf 0

3. F[i] 0

4. F[1] 1

5. F[2] 1

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Page 20: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

20

Dynamische Programmierung

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do Setze Feldeinträge auf 0

3. F[i] 0

4. F[1] 1 Setze F[1] auf korrekten Wert

5. F[2] 1 Setze F[2] auf korrekten Wert

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Page 21: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

21

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do Setze Feldeinträge auf 0

3. F[i] 0

4. F[1] 1 Setze F[1] auf korrekten Wert

5. F[2] 1 Setze F[2] auf korrekten Wert

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Dynamische Programmierung

Page 22: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

22

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do Setze Feldeinträge auf 0

3. F[i] 0

4. F[1] 1 Setze F[1] auf korrekten Wert

5. F[2] 1 Setze F[2] auf korrekten Wert

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n] Gib Wert zurück, falls schon berechnet

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Dynamische Programmierung

Page 23: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

23

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do Setze Feldeinträge auf 0

3. F[i] 0

4. F[1] 1 Setze F[1] auf korrekten Wert

5. F[2] 1 Setze F[2] auf korrekten Wert

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n] Gib Wert zurück, falls schon berechnet

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F) Ansonsten berechne Wert und speichere Wert ab

3. return F[n]

Dynamische Programmierung

Page 24: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

24

Fib2(n)

1. Initialisiere Feld F[1..n] Initialisiere Feld für Funktionswerte

2. for i 1 to n do Setze Feldeinträge auf 0

3. F[i] 0

4. F[1] 1 Setze F[1] auf korrekten Wert

5. F[2] 1 Setze F[2] auf korrekten Wert

6. return FibMemo(n,F)

FibMemo(n,F)

1. if F[n]>0 then return F[n] Gib Wert zurück, falls schon berechnet

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F) Ansonsten berechne Wert und speichere Wert ab

3. return F[n] Gib Wert zurück

Dynamische Programmierung

Page 25: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

25

Dynamische Programmierung

Fib2(n) Laufzeit:

1. Initialisiere Feld F[1..n] O(n)

2. for i 1 to n do O(n)

3. F[i] 0 O(n)

4. F[1] 1 O(1)

5. F[2] 1 O(1)

6. return FibMemo(n,F) 1+T(n)

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. return F[n]

Page 26: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

26

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

Page 27: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

27

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

Page 28: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

28

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

Page 29: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

29

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

3

Page 30: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

30

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

3

2

Page 31: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

31

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

3

2

Page 32: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

32

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

3

2

1

Page 33: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

33

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

3

2

1

1

Page 34: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

34

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 0 0 0 0

4

3

2

1

1

1

Page 35: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

35

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 0 0 0

4

3

2

1

1

1

2

Page 36: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

36

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 0 0 0

4

3

2

1

1

1

2

2

Page 37: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

37

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 0 0 0

4

3

2

1

1

1

2

2

1

Page 38: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

38

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 0 0

4

3

2

1

1

1

2

2

1

3

Page 39: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

39

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 0 0

4

3

2

1

1

1

2

2

13

3

Page 40: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

40

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 0 0

4

3

2

1

1

1

2

2

13

3 2

Page 41: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

41

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 5 0

4

3

2

1

1

1

2

2

13

3 2

5

Page 42: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

42

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 5 0

4

3

2

1

1

1

2

2

13

3 2

5

4

Page 43: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

43

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 5 0

4

3

2

1

1

1

2

2

13

3 2

5

4

3

Page 44: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

44

Dynamische Programmierung

Beispiel• FibMemo(6,F) 6

5

i: 1 2 3 4 5 6

F[i]: 1 1 2 3 5 8

4

3

2

1

1

1

2

2

13

3 2

5

4

3

8

Page 45: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

45

Dynamische Programmierung

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. 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)

Page 46: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

46

Dynamische Programmierung

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. 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

Page 47: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

47

Dynamische Programmierung

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. 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

Page 48: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

48

Dynamische Programmierung

FibMemo(n,F)

1. if F[n]>0 then return F[n]

2. F[n] FibMemo(n-1, F) + FibMemo(n-2, F)

3. 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)

Page 49: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

49

Dynamische Programmierung

Beobachtung Die Funktionswerte werden bottom-up berechnet

Grundidee der dynamischen Programmierung Berechne die Funktionswerte iterativ und bottom-up

FibDynamischeProgrammierung(n)

1. Initialisiere Feld F[1..n]

2. F[1] 1

3. F[2] 1

4. for i 3 to n do

5. F[i] F[i-1] + F[i-2]

6. return F[i]

Page 50: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

50

Dynamische Programmierung

Beobachtung Die Funktionswerte werden bottom-up berechnet

Grundidee der dynamischen Programmierung Berechne die Funktionswerte iterativ und bottom-up

FibDynamischeProgrammierung(n)

1. Initialisiere Feld F[1..n]

2. F[1] 1

3. F[2] 1

4. for i 3 to n do

5. F[i] F[i-1] + F[i-2]

6. return F[i]

Laufzeit O(n)

Page 51: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

51

Dynamische Programmierung

Dynamische Programmierung Formuliere Problem rekursiv Löse die Rekursion „bottom-up“ durch schrittweises Ausfüllen einer Tabelle

der möglichen Lösungen

Wann ist dynamische Programmierung effizient? Die Anzahl unterschiedlicher Funktionsaufrufe (Größe der Tabelle) ist klein Bei einer „normalen Ausführung“ des rekursiven Algorithmus ist mit vielen

Mehrfachausführungen zu rechnen

Page 52: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

52

Dynamische Programmierung

Analyse der dynamischen Programmierung Korrektheit: Für uns wird es genügen, eine Korrektheit der rekursiven

Problemformulierung zu zeigen (für einen vollständigen formalen Korrektheitsbeweis wäre auch noch die korrekte Umsetzung des Auffüllens der Tabelle mittels Invarianten zu zeigen. Dies ist aber normalerweise offensichtlich)

Laufzeit: Die Laufzeitanalyse ist meist recht einfach, da der Algorithmus typischerweise aus geschachtelten for-Schleifen besteht

Hauptschwierigkeit bei der Algorithmenentwicklung Finden der Rekursion

Page 53: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

53

Dynamische Programmierung

Problem: Partition Eingabe: Menge M mit n natürlichen Zahlen Ausgabe: Ja, gdw. man M in zwei Mengen L und R partitionieren kann, so

dass x = x gilt; nein sonst

Beispiel 4, 7, 9, 10, 13, 23

xL xR

Page 54: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

54

Dynamische Programmierung

Problem: Partition Eingabe: Menge M mit n natürlichen Zahlen Ausgabe: Ja, gdw. man M in zwei Mengen L und R partitionieren kann, so

dass x = x gilt; nein sonst

Beispiel 4, 7, 9, 10, 13, 23

xL xR

Page 55: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

55

Dynamische Programmierung

Problem: Partition Eingabe: Menge M mit n natürlichen Zahlen Ausgabe: Ja, gdw. man M in zwei Mengen L und R partitionieren kann, so

dass x = x gilt; nein sonst

Beispiel 4, 7, 9, 10, 13, 23 4 + 7 + 9 + 13 = 33

xL xR

Page 56: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

56

Dynamische Programmierung

Problem: Partition Eingabe: Menge M mit n natürlichen Zahlen Ausgabe: Ja, gdw. man M in zwei Mengen L und R partitionieren kann, so

dass x = x gilt; nein sonst

Beispiel 4, 7, 9, 10, 13, 23 4 + 7 + 9 + 13 = 33 10 +23 = 33

xL xR

Page 57: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

57

Dynamische Programmierung

Problem: Partition Eingabe: Menge M mit n natürlichen Zahlen Ausgabe: Ja, gdw. man M in zwei Mengen L und R partitionieren kann, so

dass x = x gilt; nein sonst

Beispiel 4, 7, 9, 10, 13, 23 4 + 7 + 9 + 13 = 33 10 +23 = 33 Ausgabe: Ja

xL xR

Page 58: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

58

Dynamische Programmierung

Beobachtung Sei M eine Menge mit n natürlichen Zahlen.

M kann genau dann in zwei Mengen L,R mit x = x partitioniert

werden, wenn es eine Teilmenge L von M gibt mit x =W/2, wobei

W= x die Summe aller Zahlen aus M ist.

xL xR

xL

xM

Page 59: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

59

Dynamische Programmierung

Beobachtung Sei M eine Menge mit n natürlichen Zahlen.

M kann genau dann in zwei Mengen L,R mit x = x partitioniert

werden, wenn es eine Teilmenge L von M gibt mit x =W/2, wobei

W= x die Summe aller Zahlen aus M ist.

Neue Frage

• Gibt es LM mit x = W/2 ?

xL xR

xL

xM

xL

Page 60: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

60

Dynamische Programmierung

Allgemeinere Frage Welche Zahlen lassen sich als Summe einer Teilmenge von M darstellen?

Page 61: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

61

Dynamische Programmierung

Noch allgemeiner Sei M(i) die Menge der ersten i Zahlen von M Für jedes i: Welche Zahlen lassen sich als Summe einer Teilmenge von M(i)

darstellen?

Formulierung als Funktion Sei G(i,j) = 1 , wenn man die Zahl j als Summe einer Teilmenge der ersten i

Zahlen aus M darstellen kann Sei G(i,j) = 0 , sonst

Page 62: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

62

Dynamische Programmierung

Noch allgemeiner Sei M(i) die Menge der ersten i Zahlen von M Für jedes i: Welche Zahlen lassen sich als Summe einer Teilmenge von M(i)

darstellen?

Formulierung als Funktion Sei G(i,j) = 1 , wenn man die Zahl j als Summe einer Teilmenge der ersten i

Zahlen aus M darstellen kann Sei G(i,j) = 0 , sonst Sei G(0,0) = 1

(Man kann die Null als Summe über die leere Menge darstellen)

Page 63: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

63

Dynamische Programmierung

Noch allgemeiner Sei M(i) die Menge der ersten i Zahlen von M Für jedes i: Welche Zahlen lassen sich als Summe einer Teilmenge von M(i)

darstellen?

Formulierung als Funktion Sei G(i,j) = 1 , wenn man die Zahl j als Summe einer Teilmenge der ersten i

Zahlen aus M darstellen kann Sei G(i,j) = 0 , sonst Sei G(0,0) = 1

(Man kann die Null als Summe über die leere Menge darstellen) Sei G(0,j) = 0 für j≠0

(Man kann keine Zahl ungleich 0 als Summe über die leere Menge darstellen)

Page 64: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

64

Dynamische Programmierung

Noch allgemeiner Sei M(i) die Menge der ersten i Zahlen von M Für jedes i: Welche Zahlen lassen sich als Summe einer Teilmenge von M(i)

darstellen?

Formulierung als Funktion Sei G(i,j) = 1 , wenn man die Zahl j als Summe einer Teilmenge der ersten i

Zahlen aus M darstellen kann Sei G(i,j) = 0 , sonst Sei G(0,0) = 1

(Man kann die Null als Summe über die leere Menge darstellen) Sei G(0,j) = 0 für j≠0

(Man kann keine Zahl ungleich 0 als Summe über die leere Menge darstellen)

Page 65: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

65

Dynamische Programmierung

Beispiel• M = {13, 7, 10, 15}

• G(1,20) = 0, da man 20 nicht als Summe einer Teilmenge der ersten Zahl aus M darstellen kann

• G(2,20) = 1, da man 20= 13 +7 als Summe einer Teilmenge der erste beiden Zahlen aus M darstellen kann

Page 66: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

66

Dynamische Programmierung

Formulierung als Funktion Sei G(i,j) = 1 , wenn man die Zahl j als Summe einer Teilmenge der ersten i

Zahlen aus M darstellen kann Sei G(i,j) = 0 , sonst Sei G(0,0) = 1

(Man kann die Null als Summe über die leere Menge darstellen) Sei G(0,j) = 0 für j≠0

(Man kann keine Zahl ungleich 0 als Summe über die leere Menge darstellen)

Page 67: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

67

Dynamische Programmierung

Formulierung als Funktion Sei G(i,j) = 1 , wenn man die Zahl j als Summe einer Teilmenge der ersten i

Zahlen aus M darstellen kann Sei G(i,j) = 0 , sonst Sei G(0,0) = 1

(Man kann die Null als Summe über die leere Menge darstellen) Sei G(0,j) = 0 für j≠0

(Man kann keine Zahl ungleich 0 als Summe über die leere Menge darstellen)

Rekursion• G(i,j) = 1, wenn G(i-1,j) =1 oder (j≥M[i] und G(i-1,j-M[i]) = 1)

• G(i,j) = 0, sonst

Page 68: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

68

Dynamische Programmierung

PartitionMemoInit(M)

1. W0

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0

5. Initialisiere Feld G[0..length[M]][0..W]

6. for i 0 to length[M] do

7. G[i,0] 1

8. for j 1 to W do

9. G[i,j] -1

10. for j 1 to W do

11. G[0,j] 0

12. if PartitionMemo(M,G, n, W/2)=1 then return 1

13. else return 0

Page 69: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

69

Dynamische Programmierung

PartitionMemoInit(M)

1. W0 Berechne W

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0

5. Initialisiere Feld G[0..length[M]][0..W]

6. for i 0 to length[M] do

7. G[i,0] 1

8. for j 1 to W do

9. G[i,j] -1

10. for j 1 to W do

11. G[0,j] 0

12. if PartitionMemo(M,G, n, W/2)=1 then return 1

13. else return 0

Page 70: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

70

Dynamische Programmierung

PartitionMemoInit(M)

1. W0 Berechne W

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0 Keine 2 gleich großen Teilmengen

5. Initialisiere Feld G[0..length[M]][0..W]

6. for i 0 to length[M] do

7. G[i,0] 1

8. for j 1 to W do

9. G[i,j] -1

10. for j 1 to W do

11. G[0,j] 0

12. if PartitionMemo(M,G, n, W/2)=1 then return 1

13. else return 0

Page 71: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

71

PartitionMemoInit(M)

1. W0 Berechne W

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0 Keine 2 gleich großen Teilmengen

5. Initialisiere Feld G[0..length[M]][0..W] Initialisiere Feld G

6. for i 0 to length[M] do Setze dabei G[i,0] auf 1 und

7. G[i,0] 1 Setze dabei G[0,j], j>0, auf 0

8. for j 1 to W do G[i,j] = -1 heißt, Funktionswert noch

9. G[i,j] -1 nicht bekannt

10. for j 1 to W do

11. G[0,j] 0

12. if PartitionMemo(M,G, n, W/2)=1 then return 1

13. else return 0

Dynamische Programmierung

Page 72: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

72

PartitionMemoInit(M)

1. W0 Berechne W

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0 Keine 2 gleich großen Teilmengen

5. Initialisiere Feld G[0..length[M]][0..W] Initialisiere Feld G

6. for i 0 to length[M] do Setze dabei G[i,0] auf 1 und

7. G[i,0] 1 Setze dabei G[0,j], j>0, auf 0

8. for j 1 to W do G[i,j] = -1 heißt, Funktionswert noch

9. G[i,j] -1 nicht bekannt

10. for j 1 to W do

11. G[0,j] 0

12. if PartitionMemo(M,G, n, W/2)=1 then return 1

13. else return 0

Dynamische Programmierung

Page 73: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

73

PartitionMemoInit(M)

1. W0 Berechne W

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0 Keine 2 gleich großen Teilmengen

5. Initialisiere Feld G[0..length[M]][0..W] Initialisiere Feld G

6. for i 0 to length[M] do Setze dabei G[i,0] auf 1 und

7. G[i,0] 1 Setze dabei G[0,j], j>0, auf 0

8. for j 1 to W do G[i,j] = -1 heißt, Funktionswert noch

9. G[i,j] -1 nicht bekannt

10. for j 1 to W do

11. G[0,j] 0

12. if PartitionMemo(M,G, n, W/2)=1 then return 1

13. else return 0

Dynamische Programmierung

Page 74: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

74

Dynamische Programmierung

PartitionMemo(M,G, i, j)

1. if j<0 return 0

2. if G[i,j]≠-1 then return G[i,j]

3. if PartitionMemo(M,G,i-1,j)=1 or PartitionMemo(M,G,i-1,j-M[i]) then G[i,j]=1

4. else G[i,j]=0

5. return G[i,j]

Page 75: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

75

Dynamische Programmierung

PartitionMemo(M,G, i, j) Gibt es Teilmenge S von M[1..i] mit x = j ?

1. if j<0 return 0

2. if G[i,j]≠-1 then return G[i,j]

3. if PartitionMemo(M,G,i-1,j)=1 or PartitionMemo(M,G,i-1,j-M[i]) then G[i,j]=1

4. else G[i,j]=0

5. return G[i,j]

xL

Page 76: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

76

Dynamische Programmierung

PartitionMemo(M,G, i, j) Gibt es Teilmenge S von M[1..i] mit x = j ?

1. if j<0 return 0 Wenn j ungültig gib false zurück

2. if G[i,j]≠-1 then return G[i,j]

3. if PartitionMemo(M,G,i-1,j)=1 or PartitionMemo(M,G,i-1,j-M[i]) then G[i,j]=1

4. else G[i,j]=0

5. return G[i,j]

xL

Page 77: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

77

Dynamische Programmierung

PartitionMemo(M,G, i, j) Gibt es Teilmenge S von M[1..i] mit x = j ?

1. if j<0 return 0 Wenn j ungültig gib false zurück

2. if G[i,j]≠-1 then return G[i,j] G[i,j] bereits berechnet?

3. if PartitionMemo(M,G,i-1,j)=1 or PartitionMemo(M,G,i-1,j-M[i]) then G[i,j]=1

4. else G[i,j]=0

5. return G[i,j]

xL

Page 78: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

78

Dynamische Programmierung

PartitionMemo(M,G, i, j) Gibt es Teilmenge S von M[1..i] mit x = j ?

1. if j<0 return 0 Wenn j ungültig gib false zurück

2. if G[i,j]≠-1 then return G[i,j] G[i,j] bereits berechnet?

3. if PartitionMemo(M,G,i-1,j)=1 Sonst, berechne G[i,j] nach or PartitionMemo(M,G,i-1,j-M[i]) then G[i,j]=1 Rekursion

4. else G[i,j]=0

5. return G[i,j]

xL

Page 79: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

79

Dynamische Programmierung

PartitionMemo(M,G, i, j) Gibt es Teilmenge S von M[1..i] mit x = j ?

1. if j<0 return 0 Wenn j ungültig gib false zurück

2. if G[i,j]≠-1 then return G[i,j] G[i,j] bereits berechnet?

3. if PartitionMemo(M,G,i-1,j)=1 Sonst, berechne G[i,j] nach or PartitionMemo(M,G,i-1,j-M[i]) then G[i,j]=1 Rekursion

4. else G[i,j]=0

5. return G[i,j]

xL

Page 80: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

80

Dynamische Programmierung

PartitionDynamicProg(M)

1. W0

2. for i 1 to length[M] do

3. W W+ M[i]

4. if W ist ungerade then return 0

5. Initialisiere Feld G[0..length[M]][0..W]

6. for i 0 to length[M] do

7. for j 0 to W/2 do

8. if j=0 then G[i,j] 1

9. else if i=0 then G[i,j] 0

10. else if G[i-1,j] = 1 or (M[i]≤j und G[i-1,j-M[i]]) then G[i,j] 1

11. else G[i,j] 0

12. return G[length[M],W/2]

Page 81: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

81

Dynamische Programmierung

PartitionDynamicProg(M)

1. W0 Berechnen von W und

2. for i 1 to length[M] do Initialisierung von G

3. W W+ M[i]

4. if W ist ungerade then return 0

5. Initialisiere Feld G[0..length[M]][0..W]

6. for i 0 to length[M] do

7. for j 0 to W/2 do

8. if j=0 then G[i,j] 1

9. else if i=0 then G[i,j] 0

10. else if G[i-1,j] = 1 or (M[i]≤j und G[i-1,j-M[i]]) then G[i,j] 1

11. else G[i,j] 0

12. return G[length[M],W/2]

Page 82: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

82

PartitionDynamicProg(M)

1. W0 Berechnen von W und

2. for i 1 to length[M] do Initialisierung von G

3. W W+ M[i]

4. if W ist ungerade then return 0

5. Initialisiere Feld G[0..length[M]][0..W]

6. for i 0 to length[M] do Berechnung

7. for j 0 to W/2 do von G

8. if j=0 then G[i,j] 1

9. else if i=0 then G[i,j] 0

10. else if G[i-1,j] = 1 or (M[i]≤j und G[i-1,j-M[i]]) then G[i,j] 1

11. else G[i,j] 0

12. return G[length[M],W/2]

Dynamische Programmierung

Page 83: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

83

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0

1

2

3

4

5

Page 84: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

84

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1

1

2

3

4

5

Page 85: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

85

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1

2

3

4

5

Page 86: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

86

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1

2

3

4

5

M[1]=1M[1]=1

Page 87: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

87

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1

2

3

4

5

M[1]=1M[1]=1

Page 88: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

88

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2

3

4

5

M[1]=1M[1]=1

Page 89: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

89

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1

3

4

5

M[2]=4M[2]=4

Page 90: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

90

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1

3

4

5

M[2]=4M[2]=4

Page 91: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

91

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0

3

4

5

M[2]=4M[2]=4

Page 92: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

92

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1

3

4

5

M[2]=4M[2]=4

Page 93: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

93

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1

3

4

5

M[2]=4M[2]=4

Page 94: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

94

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3

4

5

M[2]=4M[2]=4

Page 95: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

95

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1

4

5

M[3]=3M[3]=3

Page 96: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

96

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1

4

5

M[3]=3M[3]=3

Page 97: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

97

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0

4

5

M[3]=3M[3]=3

Page 98: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

98

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1

4

5

M[3]=3M[3]=3

Page 99: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

99

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1

4

5

M[3]=3M[3]=3

Page 100: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

100

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1 0

4

5

M[3]=3M[3]=3

Page 101: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

101

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1 0 1 1

4

5

M[3]=3M[3]=3

Page 102: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

102

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1 0 1 1 0 0

4

5

M[3]=3M[3]=3

Page 103: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

103

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1 0 1 1 0 0

4 1

5

M[4]=5M[4]=5

Page 104: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

104

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1 0 1 1 0 0

4 1 1 0 1 1 1 1 1 1 1 1

5

M[4]=5M[4]=5

Page 105: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

105

Dynamische Programmierung

Beispiel: M = 1, 4, 3, 5, 7

ji

0 1 2 3 4 5 6 7 8 9 10

0 1 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0

2 1 1 0 0 1 1 0 0 0 0 0

3 1 1 0 1 1 1 0 1 1 0 0

4 1 1 0 1 1 1 1 1 1 1 1

5 1 1 0 1 1 1 1 1 1 1 1

M[5]=7M[5]=7

Page 106: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

106

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis PartitionDynamicProg berechnet zunächst die Summe W der Elemente

aus M. Ist diese ungerade, so kann es keine Partition in zwei gleich große Teilmengen geben.

Page 107: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

107

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis PartitionDynamicProg berechnet zunächst die Summe W der Elemente

aus M. Ist diese ungerade, so kann es keine Partition in zwei gleich große Teilmengen geben.

Ansonsten berechnet der Algorithmus die Funktion G, mit G[i,0]= 1 für alle i G[0,j]= 0 für alle j>0 G[i,j] = 1, gdw. G[i-1,j]=1 oder (j≥M[i] und G[i-1,j-M[i]]=1)

Page 108: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

108

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis PartitionDynamicProg berechnet zunächst die Summe W der Elemente

aus M. Ist diese ungerade, so kann es keine Partition in zwei gleich große Teilmengen geben.

Ansonsten berechnet der Algorithmus die Funktion G, mit G[i,0]= 1 für alle i G[0,j]= 0 für alle j>0 G[i,j] = 1, gdw. G[i-1,j]=1 oder (j≥M[i] und G[i-1,j-M[i]]=1) Der Algorithmus gibt 1 zurück, gdw. G[length[M],W/2] = 1.

Page 109: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

109

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis PartitionDynamicProg berechnet zunächst die Summe W der Elemente

aus M. Ist diese ungerade, so kann es keine Partition in zwei gleich große Teilmengen geben.

Ansonsten berechnet der Algorithmus die Funktion G, mit G[i,0]= 1 für alle i G[0,j]= 0 für alle j>0 G[i,j] = 1, gdw. G[i-1,j]=1 oder (j≥M[i] und G[i-1,j-M[i]]=1) Der Algorithmus gibt 1 zurück, gdw. G[length[M],W/2] = 1.

Page 110: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

110

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis Wir zeigen per Induktion über i: G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i] darstellen kann

Page 111: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

111

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis Wir zeigen per Induktion über i: G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i] darstellen kann (I.A.) Für i=0, j=0 kann man j als Summe der leeren Teilmenge darstellen

Für i=0, j>0, kann man j nicht als Summe einer Teilmenge der leeren Menge darstellen

Page 112: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

112

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis Wir zeigen per Induktion über i: G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i] darstellen kann (I.A.) Für i=0, j=0 kann man j als Summe der leeren Teilmenge darstellen

Für i=0, j>0, kann man j nicht als Summe einer Teilmenge der leeren Menge darstellen

(I.V.) Für alle k<i und alle j wird G[k,j] korrekt berechnet

Page 113: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

113

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis Wir zeigen per Induktion über i: G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i] darstellen kann (I.A.) Für i=0, j=0 kann man j als Summe der leeren Teilmenge darstellen

Für i=0, j>0, kann man j nicht als Summe einer Teilmenge der leeren Menge darstellen

(I.V.) Für alle k<i und alle j wird G[k,j] korrekt berechnet (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i]

darstellen kann.

Page 114: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

114

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i]

darstellen kann.

Page 115: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

115

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i]

darstellen kann. „<=“ Kann man j als Summe einer Teilmenge von M[1..i], so

kann man j entweder als Teilmenge von M[1..i-1] darstellen oder als M[i] vereinigt mit einer Teilmenge von M[1..i-1

Page 116: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

116

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i]

darstellen kann. „<=“ Kann man j als Summe einer Teilmenge von M[1..i], so

kann man j entweder als Teilmenge von M[1..i-1] darstellen oder als M[i] vereinigt mit einer Teilmenge von M[1..i-1]. Im ersten Fall folgt aus (I.V.), dass G[i-1,j]=1 ist und somit auch G[i,j]=1.

Page 117: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

117

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i]

darstellen kann. „<=“ Kann man j als Summe einer Teilmenge von M[1..i], so

kann man j entweder als Teilmenge von M[1..i-1] darstellen oder als M[i] vereinigt mit einer Teilmenge von M[1..i-1]. Im ersten Fall folgt aus (I.V.), dass G[i-1,j]=1 ist und somit auch G[i,j]=1. Im zweiten Fall muss die Teilmenge von M[1..i-1] Summe j-M[i] haben.

Page 118: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

118

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i]

darstellen kann. „<=“ Kann man j als Summe einer Teilmenge von M[1..i], so

kann man j entweder als Teilmenge von M[1..i-1] darstellen oder als M[i] vereinigt mit einer Teilmenge von M[1..i-1]. Im ersten Fall folgt aus (I.V.), dass G[i-1,j]=1 ist und somit auch G[i,j]=1. Im zweiten Fall muss die Teilmenge von M[1..i-1] Summe j-M[i] haben. Nach (I.V.) ist dann aber G[i-1,j-M[i]]=1 und somit G[i,j] = 1.

Page 119: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

119

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i] darstellen kann. „<=“ Kann man j als Summe einer Teilmenge von M[1..i], so

kann man j entweder als Teilmenge von M[1..i-1] darstellen oder als M[i] vereinigt mit einer Teilmenge von M[1..i-1]. Im ersten Fall folgt aus (I.V.), dass G[i-1,j]=1 ist und somit auch G[i,j]=1. Im zweiten Fall muss die Teilmenge von M[1..i-1] Summe j-M[i] haben. Nach (I.V.) ist dann aber G[i-1,j-M[i]]=1 und somit G[i,j] = 1.

„=>“ Ist G[i,j]=1, so war entweder G[i-1,j]=1 oder G[i-1,j-M[i]]=1. Nach (I.V.) kann man entweder j oder j-M[i] als Teilmenge von M[1..i-1] darstellen. Somitkann man j als Teilmenge von M[1..i] darstellen.

Page 120: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

120

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis (I.S.) Z.z. G[i,j] = 1, gdw. man j als Summe einer Teilmenge von M[1..i] darstellen kann. „<=“ Kann man j als Summe einer Teilmenge von M[1..i], so

kann man j entweder als Teilmenge von M[1..i-1] darstellen oder als M[i] vereinigt mit einer Teilmenge von M[1..i-1]. Im ersten Fall folgt aus (I.V.), dass G[i-1,j]=1 ist und somit auch G[i,j]=1. Im zweiten Fall muss die Teilmenge von M[1..i-1] Summe j-M[i] haben. Nach (I.V.) ist dann aber G[i-1,j-M[i]]=1 und somit G[i,j] = 1.

„=>“ Ist G[i,j]=1, so war entweder G[i-1,j]=1 oder G[i-1,j-M[i]]=1. Nach (I.V.) kann man entweder j oder j-M[i] als Teilmenge von M[1..i-1] darstellen. Somitkann man j als Teilmenge von M[1..i] darstellen.

Page 121: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

121

Dynamische Programmierung

Lemma 22 Algorithmus PartitionDynamicProg ist korrekt.

Beweis Somit gilt G[length[M],W/2] = 1 gdw. man j als Summe einer Teilmenge von

M[1..length[M]] darstellen kann.

Page 122: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

122

Dynamische Programmierung

Satz 23 Sei M eine Menge von n natürlichen Zahlen und R die Summe der Zahlen aus

M. Algorithmus PartitionDynamicProg löst Partition in Zeit O(nW).

Beweis• Die Korrektheit des Algorithmus folgt aus Lemma 22.

• Die Laufzeit ist offensichtlich O(nW).

Page 123: Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

LS 2 / Informatik

123

Dynamische Programmierung

Bemerkung Partition ist ein NP-vollständiges Problem Damit gibt es wahrscheinlich keinen polynomieller Algorithmus für Partition

Warum ist unser Algorithmus nicht polynomiell? Die Laufzeit hängt von W ab Sind die Zahlen aus M exponentiell groß, so ist die Laufzeit ebenfalls

exponentiell