25.12.2013 Aufrufe

11. Übung – Algorithmen I - Timo Bingmann, Christian Schulz

11. Übung – Algorithmen I - Timo Bingmann, Christian Schulz

11. Übung – Algorithmen I - Timo Bingmann, Christian Schulz

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

<strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS<br />

1 KIT <strong>Timo</strong> <strong>–</strong> Universität <strong>Bingmann</strong>, des Landes<strong>Christian</strong> Baden-Württemberg <strong>Schulz</strong> und<br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

nationales Forschungszentrum in der Helmholtz-Gemeinschaft<br />

Fakultät für Informatik<br />

Institut für Theoretische www.kit.edu Informatik


Organisatorisches<br />

Klausuranmeldung bis einschließlich 22.7.2013<br />

Erlaubte Hilfsmittel für die Klausur:<br />

blauer oder schwarzer Stift<br />

DIN-A4 Blatt (beidseitig) handbeschrieben<br />

für die Identifikation: Studentenausweis<br />

2 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Inhalt<br />

Lineare Programmierung<br />

Dynamische Programmierung<br />

Faltungscodes und der Viterbi-Algorithmus<br />

3 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Lineare Programmierung<br />

2. Teil<br />

4 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Beispiel: Süßwarenfabrik Matrixform<br />

maximiere<br />

unter<br />

50 ¢ · x A + 70 ¢ · x B<br />

x A ≤ 100 kg<br />

x B ≤ 70 kg<br />

0,8 · x A + 0,7 · x B ≤ 100 kg<br />

0,06 · x A + 0,2 · x B ≤ 15 kg<br />

x ≥ 0<br />

oder: ⎧<br />

⎛ ⎞ ⎛ ⎞⎫<br />

⎪⎨ ( ) t 1 0 100 kg<br />

50 ¢<br />

max x<br />

70 ¢<br />

x ∈ R 2 , x ≥ 0, ⎜ 0 1<br />

⎟<br />

⎝<br />

⎪⎩<br />

0,8 0,7⎠ x ≤ ⎜ 70 kg<br />

⎪⎬<br />

⎟<br />

⎝100 kg⎠<br />

∣<br />

⎪⎭<br />

0,06 0,2 15 kg<br />

(Eine) allgemeine Matrixform: max{c t x | x ∈ R n , x ≥ 0, Ax ≤ b}<br />

mit A ∈ R m×n , b ∈ R m , c ∈ R n .<br />

5 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Verbindung zu Graph-Problemen<br />

Graph (V , E) mit Gewichten c : E → R + .<br />

max{f (x) | x ∈ R V , x ≥ 0, . . .} oder max{f (x) | x ∈ R E , x ≥ 0, . . .}<br />

6 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Verbindung zu Graph-Problemen<br />

Graph (V , E) mit Gewichten c : E → R + .<br />

max{f (x) | x ∈ R V , x ≥ 0, . . .} oder max{f (x) | x ∈ R E , x ≥ 0, . . .}<br />

Kürzeste Wege:<br />

{ ∣ }<br />

∑ ∣∣∣∣<br />

max d v d ∈ R V , d s = 0, d w ≤ d v + c(v, w) ∀ (v, w) ∈ E<br />

v∈V<br />

6 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Verbindung zu Graph-Problemen<br />

Graph (V , E) mit Gewichten c : E → R + .<br />

∞ ∞<br />

∞<br />

2<br />

∞<br />

s<br />

0 1 2<br />

3<br />

max{f (x) | x ∈ R V , x ≥ 0, . . .} oder max{f (x) | x ∈ R E , x ≥ 0, . . .}<br />

Kürzeste Wege:<br />

{ ∣ }<br />

∑ ∣∣∣∣<br />

max d v d ∈ R V , d s = 0, d w ≤ d v + c(v, w) ∀ (v, w) ∈ E<br />

v∈V<br />

6 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Verbindung zu Graph-Problemen<br />

Graph (V , E) mit Gewichten c : E → R + .<br />

3 3<br />

3<br />

2<br />

3<br />

s<br />

0 1 2<br />

3<br />

max{f (x) | x ∈ R V , x ≥ 0, . . .} oder max{f (x) | x ∈ R E , x ≥ 0, . . .}<br />

Kürzeste Wege:<br />

{ ∣ }<br />

∑ ∣∣∣∣<br />

max d v d ∈ R V , d s = 0, d w ≤ d v + c(v, w) ∀ (v, w) ∈ E<br />

v∈V<br />

6 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Minimum Spanning Tree LP<br />

Zusammenhängender Graph (V , E) mit Gewichten c : E → R + .<br />

{ }<br />

∑<br />

min c(e)x e | x ∈ R E , x ≥ 0, . . .<br />

e∈E<br />

7 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Minimum Spanning Tree LP<br />

Zusammenhängender Graph (V , E) mit Gewichten c ∈ (R + ) E .<br />

⎧<br />

⎨<br />

min<br />

⎩ ct x<br />

x ∈ R E ,<br />

∣ x ≥ 0,<br />

⎫<br />

⎬<br />

⎭<br />

8 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Minimum Spanning Tree LP<br />

Zusammenhängender Graph (V , E) mit Gewichten c ∈ (R + ) E .<br />

⎧<br />

⎨<br />

min<br />

⎩ ct x<br />

x ∈ R E ,<br />

∣ x ≥ 0,<br />

∑<br />

x e = |V | − 1,<br />

e∈E<br />

⎫<br />

⎬<br />

⎭<br />

8 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Minimum Spanning Tree LP<br />

Zusammenhängender Graph (V , E) mit Gewichten c ∈ (R + ) E .<br />

⎧<br />

⎨<br />

min<br />

⎩ ct x<br />

x ∈ R E ,<br />

∣ x ≥ 0,<br />

∑<br />

x e = |V | − 1,<br />

e∈E<br />

∀ A ⊆ V<br />

A ≠ ∅<br />

:<br />

∑<br />

e∈E(G[A])<br />

⎫<br />

⎬<br />

x e ≤ |A| − 1<br />

⎭<br />

wobei A über alle nicht-leere Knotenteilmengen läuft und E(G[A]) alle<br />

Kanten mit Endknoten in A sind.<br />

8 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Minimum Spanning Tree LP<br />

Zusammenhängender Graph (V , E) mit Gewichten c ∈ (R + ) E .<br />

⎧<br />

⎨<br />

min<br />

⎩ ct x<br />

x ∈ R E ,<br />

∣ x ≥ 0,<br />

∑<br />

x e = |V | − 1,<br />

e∈E<br />

∀ A ⊆ V<br />

A ≠ ∅<br />

:<br />

∑<br />

e∈E(G[A])<br />

⎫<br />

⎬<br />

x e ≤ |A| − 1<br />

⎭<br />

wobei A über alle nicht-leere Knotenteilmengen läuft und E(G[A]) alle<br />

Kanten mit Endknoten in A sind.<br />

8 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dynamisches Programmieren<br />

9 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Algorithmus Entwurfsprinzip:<br />

dynamische Programmierung<br />

Aufbau von Lösungen aus Bausteinen<br />

Optimalitätsprinzip:<br />

1<br />

Optimale Lösungen bestehen aus optimalen Lösungen für Teilprobleme<br />

2<br />

Mehrere optimale Lösungen ⇒ es ist egal welche benutzt wird<br />

10 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Fibonacci-Zahlen<br />

Beispiel: f (n) = f (n − 1) + f (n − 2), f (1) = 1, f (0) = 1<br />

Rekursiver Ansatz?<br />

1: procedure fib(n ∈ N)<br />

2: if n ∈ {0, 1} then return 1<br />

3: else return fib(n − 1) + fib(n − 2)<br />

4: return<br />

Problem: Mehrfachberechnung von Lösungen<br />

f (5) = f (4) + f (3)<br />

f (5) = f (3) + f (2) + f (2) + f (1)<br />

11 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Fibonacci-Zahlen<br />

Beispiel: f (n) = f (n − 1) + f (n − 2), f (1) = 1, f (0) = 1<br />

Baue f (n) aus Teillösungen Bottom-Up zusammen<br />

Merke Zwischenlösungen (z.B. in Tabelle)<br />

Function fib(n of N) :<br />

f := Array < 1, 1, 0, . . . , 0 ><br />

for j := 3 to n do<br />

f [j] = f [j − 1] + f [j − 2]<br />

return f [n]<br />

// array of size n<br />

12 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

Problem: Gegeben eine m × n Matrix über {0, 1}, finde die größte<br />

quadratische Teilmatrix, die nur aus 1en besteht.<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

13 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

Problem: Gegeben eine m × n Matrix über {0, 1}, finde die größte<br />

quadratische Teilmatrix, die nur aus 1en besteht.<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

13 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

Teilproblemstruktur:<br />

Verwende Lösungen der Teilmatrizen und baue so Gesamtlösung auf<br />

Matrix M ∈ {0, 1} m×n<br />

Zusätzliche Matrix S ∈ N m×n initialisiert mit 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

14 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 1 0 0<br />

1 0 0 0 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 1 2 0<br />

1 0 0 0 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 1 2 1<br />

1 0 0 0 0<br />

0 0 0 0 0<br />

1 0 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 1 2 1<br />

1 1 1 2 2<br />

0 0 1 2 3<br />

1 1 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

S fertig<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 1 2 1<br />

1 1 1 2 2<br />

0 0 1 2 3<br />

1 1 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

S fertig<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

M =<br />

1 0 1 1 0<br />

0 0 1 1 1<br />

1 1 1 1 1<br />

0 0 1 1 1<br />

1 1 0 0 0<br />

S =<br />

1 0 1 1 0<br />

0 0 1 2 1<br />

1 1 1 2 2<br />

0 0 1 2 3<br />

1 1 0 0 0<br />

M[i][j] == 0 :S[i][j] = 0<br />

M[i][j] == 1 :S[i][j] = min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

initialisiere S: S[0][∗] := M[0][∗], S[∗][0] := M[∗][0]<br />

Lösung iterativ durch bekannte Teillösungen aufbauen<br />

S fertig<br />

15 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Largest One Submatrix<br />

Code<br />

Function largest_square_submatrix(M[m, n] of Matrix) : N<br />

S :=Matrix<br />

// solution matrix<br />

S[0][∗] := M[0][∗]<br />

// one for loop<br />

S[∗][0] := M[∗][0]<br />

// one for loop<br />

for i := 1 to m − 1 do<br />

for j := 1 to n − 1 do<br />

if M[i][j] == 1 then<br />

S[i][j] := min(S[i][j − 1], S[i − 1][j], S[i − 1][j − 1]) + 1<br />

else<br />

S[i][j] := 0<br />

return max i,j S[i][j]<br />

// two for loops<br />

Komplexität: O(mn) = O(#Matrixelemente)<br />

16 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Subarray Problem<br />

Problem: Gegeben ein Array von Zahlen (positiv, negativ), finde das<br />

(zusammenhängende) Teilarray mit der größten Summe.<br />

Trivialer Algorithmus in O ( n 2)<br />

−2, 1, −3, 4, −1, 2, 1, −5, 4<br />

1<br />

berechne die Summe aller Teilarrays (zwei For-Schleifen)<br />

Besser: dynamische Programmierung verwenden → O(n)<br />

17 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Subarray Problem<br />

Problem: Gegeben ein Array von Zahlen (positiv, negativ), finde das<br />

(zusammenhängende) Teilarray mit der größten Summe.<br />

−2, 1, −3, 4, −1, 2, 1, −5, 4<br />

Besser: dynamische Programmierung verwenden → O(n)<br />

Algorithmus:<br />

scanne einmal über das Array:<br />

Function largest_cont_subseq(A Array of N) : Z<br />

overall_max=A[0] : N; cur_max=A[0] : N;<br />

for i := 1 to size(A) do<br />

cur_max = max(A[i], cur_max + A[i]);<br />

overall_max = max(overall_max, cur_max);<br />

return overall_max<br />

17 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Subarray Problem<br />

Problem: Gegeben ein Array von Zahlen (positiv, negativ), finde das<br />

(zusammenhängende) Teilarray mit der größten Summe.<br />

original: -2, 1, -3, 4, -1, 2, 1, -5, 4<br />

cur_max: -2, 1, -2, 4, 3, 5, 6, 1, 5<br />

18 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

Problem: Gegeben eine n × n Matrix M über Z, finde die Teilmatrix,<br />

die die größte Summe hat.<br />

Summe=Max!<br />

Brute-Force: alle Teilmatrizen<br />

(<br />

ausrechnen<br />

1<br />

pro Teilmatrix O n 2) Zeit<br />

(<br />

2<br />

O n 4) Teilmatrizen<br />

3<br />

insgesamt O<br />

(n 6)<br />

19 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

Problem: Gegeben eine n × n Matrix M über Z, finde die Teilmatrix,<br />

die die größte Summe hat.<br />

Summe=Max!<br />

Summe<br />

S_i,j<br />

Besser: Dinge vorberechnen<br />

1<br />

errechne Matrix S: S i,j = ∑ Elemente links-oberhalb von M i,j<br />

einschließlich der Zeile i und Spalte j<br />

20 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

Problem: Gegeben eine n × n Matrix M über Z, finde die Teilmatrix,<br />

die die größte Summe hat.<br />

A<br />

B<br />

Summe=Max!<br />

C<br />

D<br />

E<br />

Besser: Dinge vorberechnen<br />

1<br />

errechne Matrix S: S i,j = ∑ Elemente links-oberhalb von M i,j<br />

einschließlich der Zeile i und Spalte j<br />

2<br />

pro Teilmatrix O(1) Zeit, insgesamt O<br />

(n 4)<br />

20 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

Summe=Max!<br />

Noch besser: Dinge vorberechen + Dynamische Programmierung<br />

1<br />

Prefixsummen der Spalten von M in Matrix S speichern<br />

S i,j = ∑ il=1 M l,j<br />

21 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

i<br />

K<br />

Summe=Max!<br />

j<br />

A<br />

Summe<br />

Noch besser: Dinge vorberechen + Dynamische Programmierung<br />

1<br />

Prefixsummen der Spalten von M in Matrix S speichern<br />

S i,j = ∑ il=1 M l,j<br />

2<br />

probiere alle Zeilenpaare i < j<br />

1 pro Zeilenpaar berechene Array A[1, . . . , n]<br />

2 A[K ] = ∑ j<br />

l=i M l,K = S j,K − S i−1,K<br />

21 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

i<br />

K<br />

Summe=Max!<br />

j<br />

A<br />

Summe<br />

Noch besser: Dinge vorberechen + Dynamische Programmierung<br />

1<br />

Prefixsummen der Spalten von M in Matrix S speichern<br />

S i,j = ∑ il=1 M l,j<br />

2<br />

probiere alle Zeilenpaare i < j<br />

1 pro Zeilenpaar berechene Array A[1, . . . , n]<br />

2 A[K ] = ∑ j<br />

l=i M l,K = S j,K − S i−1,K<br />

3 auf A Maximum Subarray Problem lösen<br />

21 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Maximum Submatrix Problem<br />

i<br />

K<br />

Summe=Max!<br />

j<br />

A<br />

Summe<br />

Noch besser: Dinge vorberechen + Dynamische Programmierung<br />

1<br />

Prefixsummen der Spalten von M in Matrix S speichern<br />

O ( n 2) Zeit<br />

2<br />

probiere alle Zeilenpaare i < j<br />

1 O ( n 2) viele Zeilenpaare<br />

2 pro Zeilenpaar O(n)<br />

3<br />

insgesamt O<br />

(n 3)<br />

21 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Faltungscodes<br />

und der Viterbi-Algorithmus<br />

802.11<br />

WLAN<br />

22 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

I s 2<br />

Output A<br />

Output B<br />

I s 1<br />

Input I s 1 s 2<br />

s 1<br />

I s 2<br />

Output C<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

1 0<br />

1 = Output A<br />

1 = Output B<br />

1 0<br />

Input 1 0 0<br />

0<br />

1 0<br />

1 = Output C<br />

Input: 1011<br />

Output: 111<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

0 0<br />

0 = Output A<br />

0 = Output B<br />

0 1<br />

Input 0 1 0<br />

1<br />

0 0<br />

1 = Output C<br />

Input: 1011<br />

Output: 111 001<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

1 1<br />

1 = Output A<br />

0 = Output B<br />

1 0<br />

Input 1 0 1<br />

0<br />

1 1<br />

0 = Output C<br />

Input: 1011<br />

Output: 111 001 100<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

1 0<br />

1 = Output A<br />

1 = Output B<br />

1 1<br />

Input 1 1 0<br />

1<br />

1 0<br />

0 = Output C<br />

Input: 1011<br />

Output: 111 001 100 110<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

0 1<br />

0 = Output A<br />

1 = Output B<br />

0 1<br />

Input 0 1 1<br />

1<br />

0 1<br />

0 = Output C<br />

Input: 1011 | 0<br />

Output: 111 001 100 110 | 010<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

0 1<br />

0 = Output A<br />

1 = Output B<br />

0 0<br />

Input 0 0 1<br />

0<br />

0 1<br />

1 = Output C<br />

Input: 1011 | 00<br />

Output: 111 001 100 110 | 010 011<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

0<br />

0 = Output A<br />

0 = Output B<br />

0<br />

Input 0 0<br />

0<br />

0<br />

Input: 1011 | 00<br />

Output: 111 001 100 110 | 010 011<br />

0 = Output C<br />

Redundanz in Übertragung ermöglicht Fehlerkorrektur!<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Schieberegister<br />

0<br />

0 = Output A<br />

0 = Output B<br />

0<br />

Input 0 0<br />

0<br />

0<br />

Das 802.11a Schieberegister<br />

Input: 1011 | 00<br />

Output: 111 001 100 110 | 010 011<br />

0 = Output C<br />

Output A<br />

Redundanz<br />

Input s<br />

in Übertragung 1 s 2 s<br />

ermöglicht 3 s 4 s<br />

Fehlerkorrektur!<br />

5 s 6<br />

23 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Output B<br />

Institut für Theoretische Informatik


Ein Faltungscode als Mealy-Automat<br />

0/000<br />

0/011<br />

00<br />

1/100<br />

1/111<br />

01 10<br />

0/001<br />

0/010<br />

11<br />

1/110<br />

1/101<br />

Legende: Kantenbeschriftung ist Input/Output.<br />

24 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Trellis<br />

t 0<br />

00<br />

000<br />

t 1<br />

00<br />

000<br />

t 2<br />

00<br />

000<br />

011<br />

t 3<br />

00<br />

000<br />

011<br />

t 4<br />

00<br />

000<br />

011<br />

t 5<br />

00<br />

000<br />

011<br />

t 6<br />

00<br />

01<br />

111<br />

01<br />

111<br />

01<br />

111<br />

100<br />

01<br />

111<br />

100<br />

01<br />

01<br />

01<br />

10<br />

10<br />

001<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

10<br />

110<br />

110<br />

110<br />

11<br />

11<br />

11<br />

101<br />

11<br />

Input: 1011 | 00<br />

Output: 111 001 100 110 | 010 011<br />

101<br />

11<br />

11<br />

11<br />

25 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Trellis<br />

t 0<br />

00<br />

000<br />

t 1<br />

00<br />

000<br />

t 2<br />

00<br />

000<br />

011<br />

t 3<br />

00<br />

000<br />

011<br />

t 4<br />

00<br />

000<br />

011<br />

t 5<br />

00<br />

000<br />

011<br />

t 6<br />

00<br />

01<br />

111<br />

01<br />

111<br />

01<br />

111<br />

100<br />

01<br />

111<br />

100<br />

01<br />

01<br />

01<br />

10<br />

10<br />

001<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

10<br />

110<br />

110<br />

110<br />

11<br />

11<br />

11<br />

101<br />

11<br />

Input: 1011 | 00<br />

Output: 111 001 100 110 | 010 011<br />

101<br />

11<br />

11<br />

11<br />

25 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Ein Faltungscode als Trellis<br />

t 0<br />

00<br />

000<br />

t 1<br />

00<br />

000<br />

t 2<br />

00<br />

000<br />

011<br />

t 3<br />

00<br />

000<br />

011<br />

t 4<br />

00<br />

000<br />

011<br />

t 5<br />

00<br />

000<br />

011<br />

t 6<br />

00<br />

01<br />

111<br />

01<br />

111<br />

01<br />

111<br />

100<br />

01<br />

111<br />

100<br />

01<br />

01<br />

01<br />

10<br />

10<br />

001<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

10<br />

110<br />

110<br />

110<br />

11<br />

11<br />

11<br />

101<br />

11<br />

101<br />

Input: 1011 | 00<br />

Output: 111 001 100 110 | 010 011<br />

Aber, wie dekodiert man 011 100 101 010 | 111 001 ?<br />

11<br />

11<br />

11<br />

25 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Faltungscode: Fehlerkorrektur?<br />

Dekodiere: 011 100 101 010 | 111 001 ?<br />

Ziel: Finde die Eingabe, deren Kodierung die geringste<br />

Hamming-Distanz (Einzelbit-Fehler) zum gelesenen Codewort hat.<br />

26 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Faltungscode: Fehlerkorrektur?<br />

Dekodiere: 011 100 101 010 | 111 001 ?<br />

Ziel: Finde die Eingabe, deren Kodierung die geringste<br />

Hamming-Distanz (Einzelbit-Fehler) zum gelesenen Codewort hat.<br />

Erster Algorithmus: Enumeriere alle gültige Codewörter, berechne<br />

Hamming-Distanz und finde so die wahrscheinlichste Eingabe<br />

(maximum likelyhood detection).<br />

26 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dekodiere: 011 100 101 010 | 111 001<br />

Eingabe = Codewort Distanz<br />

0000 | 00 = 000 000 000 000 | 000 000 10<br />

0001 | 00 = 000 000 000 111 | 001 011 10<br />

0010 | 00 = 000 000 111 001 | 011 000 8<br />

0011 | 00 = 000 000 111 110 | 010 011 8<br />

0100 | 00 = 000 111 001 011 | 000 000 10<br />

0101 | 00 = 000 111 001 100 | 001 011 10<br />

0110 | 00 = 000 111 110 010 | 011 000 8<br />

0111 | 00 = 000 111 110 101 | 010 011 12<br />

1000 | 00 = 111 001 011 000 | 000 000 10<br />

1001 | 00 = 111 001 011 111 | 001 011 10<br />

1010 | 00 = 111 001 100 001 | 011 000 8<br />

1011 | 00 = 111 001 100 110 | 010 011 8<br />

1100 | 00 = 111 110 010 011 | 000 000 10<br />

1101 | 00 = 111 110 010 100 | 001 011 10<br />

1110 | 00 = 111 110 101 010 | 011 000 4<br />

1111 | 00 = 111 110 101 101 | 010 011 8<br />

27 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dekodiere: 011 100 101 010 | 111 001<br />

Eingabe = Codewort Distanz<br />

0000 | 00 = 000 000 000 000 | 000 000 10<br />

0001 | 00 = 000 000 000 111 | 001 011 10<br />

0010 | 00 = 000 000 111 001 | 011 000 8<br />

0011 | 00 = 000 000 111 110 | 010 011 8<br />

0100 | 00 = 000 111 001 011 | 000 000 10<br />

0101 | 00 = 000 111 001 100 | 001 011 10<br />

0110 | 00 = 000 111 110 010 | 011 000 8<br />

0111 | 00 = 000 111 110 101 | 010 011 12<br />

1000 | 00 = 111 001 011 000 | 000 000 10<br />

1001 | 00 = 111 001 011 111 | 001 011 10<br />

1010 | 00 = 111 001 100 001 | 011 000 8<br />

1011 | 00 = 111 001 100 110 | 010 011 8<br />

1100 | 00 = 111 110 010 011 | 000 000 10<br />

1101 | 00 = 111 110 010 100 | 001 011 10<br />

1110 | 00 = 111 110 101 010 | 011 000 4<br />

1111 | 00 = 111 110 101 101 | 010 011 8<br />

27 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dekodiere im Trellis<br />

Dekodiere: 011 100 101 010 | 111 001 ?<br />

t 0<br />

00<br />

000<br />

t 1<br />

00<br />

000<br />

t 2<br />

00<br />

000<br />

011<br />

t 3<br />

00<br />

000<br />

011<br />

t 4<br />

00<br />

000<br />

011<br />

t 5<br />

00<br />

000<br />

011<br />

t 6<br />

00<br />

01<br />

111<br />

01<br />

111<br />

01<br />

111<br />

100<br />

01<br />

111<br />

100<br />

01<br />

01<br />

01<br />

10<br />

10<br />

001<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

001<br />

010<br />

10<br />

10<br />

110<br />

110<br />

110<br />

11<br />

11<br />

11<br />

101<br />

11<br />

2<br />

101<br />

11<br />

11<br />

11<br />

28 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dekodiere im Trellis<br />

Dekodiere: 011 100 101 010 | 111 001 ?<br />

t 0<br />

00<br />

2<br />

t 1<br />

00<br />

1<br />

t 2<br />

00<br />

2<br />

2<br />

t 3<br />

00<br />

1<br />

1<br />

t 4<br />

00<br />

3<br />

1<br />

t 5<br />

00<br />

1<br />

1<br />

t 6<br />

00<br />

01<br />

1<br />

01<br />

2<br />

01<br />

1<br />

1<br />

01<br />

2<br />

2<br />

01<br />

01<br />

01<br />

2<br />

1<br />

2<br />

2<br />

10<br />

10<br />

10<br />

3<br />

10<br />

0<br />

10<br />

2<br />

10<br />

10<br />

1<br />

2<br />

1<br />

11<br />

11<br />

11<br />

0<br />

11<br />

3<br />

11<br />

11<br />

11<br />

29 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dekodiere im Trellis<br />

Dekodiere: 011 100 101 010 | 111 001 ?<br />

t 0<br />

t 1<br />

00<br />

2<br />

00<br />

0 2<br />

1<br />

t 2<br />

00<br />

3<br />

2<br />

2<br />

t 3<br />

00<br />

5<br />

1<br />

1<br />

t 4<br />

00<br />

6<br />

3<br />

1<br />

t 5<br />

00<br />

3<br />

1<br />

1<br />

t 6<br />

00<br />

4<br />

01<br />

1<br />

01<br />

2<br />

2<br />

01<br />

3<br />

1<br />

1<br />

1<br />

01<br />

5<br />

2<br />

2<br />

2<br />

01<br />

2<br />

01<br />

7<br />

01<br />

2<br />

3<br />

0<br />

2<br />

10<br />

10<br />

1<br />

1<br />

10<br />

4<br />

2<br />

10<br />

4<br />

1<br />

10<br />

7<br />

10<br />

10<br />

11 11 11<br />

2<br />

Verwende Bellman-Ford:<br />

0<br />

11<br />

2<br />

3<br />

11<br />

5<br />

11<br />

11<br />

29 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Dekodiere im Trellis<br />

Dekodiere: 011 100 101 010 | 111 001 ?<br />

t 0<br />

t 1<br />

00<br />

2<br />

00<br />

0 2<br />

1<br />

t 2<br />

00<br />

3<br />

2<br />

2<br />

t 3<br />

00<br />

5<br />

1<br />

1<br />

t 4<br />

00<br />

6<br />

3<br />

1<br />

t 5<br />

00<br />

3<br />

1<br />

1<br />

t 6<br />

00<br />

4<br />

01<br />

1<br />

01<br />

2<br />

2<br />

01<br />

3<br />

1<br />

1<br />

1<br />

01<br />

5<br />

2<br />

2<br />

2<br />

01<br />

2<br />

01<br />

7<br />

01<br />

2<br />

3<br />

0<br />

2<br />

10<br />

10<br />

1<br />

1<br />

10<br />

4<br />

2<br />

10<br />

4<br />

1<br />

10<br />

7<br />

10<br />

10<br />

11 11 11 11 11 11<br />

0 3<br />

2 2 5<br />

Verwende Bellman-Ford: kürzester Pfad entspricht 1110 | 00.<br />

11<br />

29 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Der Viterbi-Algorithmus (Pseudocode)<br />

t k−1<br />

00<br />

w[k−1][00]<br />

01<br />

w[k−1][01]<br />

10<br />

w[k−1][10]<br />

11<br />

w[k−1][11]<br />

w[k][z] =<br />

t k<br />

00<br />

w[k][00]<br />

01<br />

w[k][01]<br />

10<br />

w[k][10]<br />

11<br />

w[k][11]<br />

min<br />

v∈Vorgänger(z)<br />

Procedure Viterbi(A : Folge, G : Schichtengraph)<br />

w[0][z] := 0, pre[0][z] := nil ∀z ∈ Zustände(G)<br />

foreach k = 1, . . . , #Schichten(G)<br />

foreach z ∈ Zustände(G)<br />

Wähle unter allen v ∈ Vorgängern(z)<br />

denjenigen mit besten Kosten unter<br />

w[k−1][v], Kante(v, z) und A[k] aus.<br />

Setze w[k][z] und pre[k][z].<br />

wobei im Beispiel<br />

Zustände(G) = {00, 01, 10, 11},<br />

Vorgänger(z) die Vorgängerzustände von<br />

z sind und<br />

w[k−1][v] + Hamming(A[k], Kante(v, z))<br />

30 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Der Viterbi-Algorithmus<br />

Schichten-Graph erlaubt effiziente Implementierung des kürzesten<br />

Pfad Algorithmus mit nur einer Variable pro Ebenen im Trellis oder<br />

Knoten im Automaten.<br />

Der Viterbi-Algorithmus funktioniert auch in allgemeineren Fällen:<br />

Wahrscheinlichkeiten statt Distanzen (Logarithmierungstrick)<br />

Beste Pfade in Hidden Markov Models (siehe Automaten).<br />

31 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik


Der Viterbi-Algorithmus<br />

Schichten-Graph erlaubt effiziente Implementierung des kürzesten<br />

Pfad Algorithmus mit nur einer Variable pro Ebenen im Trellis oder<br />

Knoten im Automaten.<br />

Der Viterbi-Algorithmus funktioniert auch in allgemeineren Fällen:<br />

Wahrscheinlichkeiten statt Distanzen (Logarithmierungstrick)<br />

Beste Pfade in Hidden Markov Models (siehe Automaten).<br />

Weitere wichtige Optimierung:<br />

Da der Faltungscode im Beispiel nur vier Zustände hat und jeder<br />

Knoten genau zwei Ausgangskanten hat, gibt von jedem Knoten in<br />

Schicht k zu jedem Knoten in Schicht k + 3 mehr als ein Pfad.<br />

⇒ Bei der Berechnung von Schicht k + 3 steht der kürzeste Teilpfad<br />

von Schicht 0 bis k bereits fest. Die entsprechenden Bits können<br />

schon ausgegeben werden.<br />

31 <strong>Timo</strong> <strong>Bingmann</strong>, <strong>Christian</strong> <strong>Schulz</strong><br />

<strong>11.</strong> <strong>Übung</strong> <strong>–</strong> <strong>Algorithmen</strong> I<br />

Fakultät für Informatik<br />

Institut für Theoretische Informatik

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!