11. Übung – Algorithmen I - Timo Bingmann, Christian Schulz
11. Übung – Algorithmen I - Timo Bingmann, Christian Schulz
11. Übung – Algorithmen I - Timo Bingmann, Christian Schulz
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