Muster Präs. 05

SoSe 2015
C. Sohler
J. Flake, A. Krivo²ija
B. Rudak, V.Volz
DAP2 Präsenzübung 5
Besprechung: 13.05.2015 15.05.2015
Präsenzaufgabe 5.1: (Gierige Algorithmen)
Sie sind Häuptling eines Indianerstammes im Wilden Westen und wollen eine Möglichkeit haben,
Ihren Scouts Nachrichten überbringen zu können, ohne dass deren Position durch einen Reiter
verraten werden könnte.
Sie wollen deswegen einen Code aus Rauchzeichen für wichtige, also oft genutzte, Wörter entwickeln, um so Ihre Nachrichten zu übertragen. Die Wörter, die Sie auswählen, sind in folgender
Tabelle mit ihren erwarteten Verwendungshäugkeiten im nächsten Jahr aufgetragen.
Wort
Häugkeit
Feind gesichtet
42
Angri
25
1
Rückzug
Aufbruch
66
Osten
13
26
Norden
18
Westen
Süden
22
Position beziehen
33
Dabei stehen Ihnen jedoch nur folgende Zeichen zur Verfügung:
• groÿe Wolke
• kleine Wolke
• Kringel
Manche Worte müssen also mit zwei oder mehr Rauchzeichen kodiert werden. Um ein neues
Wort zu markieren, legen Sie eine Pause von 5 Sekunden fest.
Damit die Kommunikation möglichst schnell passieren kann, wollen Sie die Anzahl der zu
verwendenden Rauchzeichen bei einer Übertragung möglichst minimieren.
a) Entwickeln Sie einen gierigen Algorithmus, der einen Code erstellt, der die erwartete
Übertragungsdauer der Nachrichten (also die Anzahl übertragener Zeichen) minimiert.
Beschreiben Sie den Algorithmus mit eigenen Worten und geben Sie ihn in Pseudocode
an.
1
b) Geben Sie den gefundenen Code an und berechnen Sie die mittlere und die erwartete
Wortlänge (Anzahl Rauchzeichen eines Worts). Ist ihr Code optimal bezüglich der beiden
berechneten Gröÿen? Begründen Sie Ihre Antwort.
c) Bestimmen Sie die Laufzeit Ihres Algorithmus in Abhängigkeit der Länge des Arrays von
Wörtern.
Lösung:
a) Die am öftesten erwarteten Worte sollten die kürzesten Codierung haben. Also:
Code(Array W[1..n], Array H[1..n], Array Z[1..3]):
1 Sortiere W absteigend nach absoluten Häugkeiten in Array H
2 c ← [1..n]
3 s←1
4 k←0
5 for ← 1 to n do
6
j ← Darstellung von k zur Basis 3 mit s Stellen
7
c[i] ← (W [i], [Z[j + 1], . . . , Z[j + 1])
8
k ← k+1
9
if ≥ 3 then
10
k←0
11
s ← s+1
12 return c
b) Nach dem angegebenen Algorithmus ergibt sich folgender Code:
i
1
k
s
s
Wort
Feind gesichtet
Angri
Rückzug
Aufbruch
Osten
Norden
Westen
Süden
Position beziehen
Code
kW
gW, kW
kW, K
gW
kW, kW
gW, gW
kW, gW
gW, K
K
Mittlere Wortlänge:
= ≈ 1, 6
Algorithmus CodePentwickelt einen optimalen Code C, der die mittlere Codewortlänge des Codes w¯ =
|w | minimiert.
Für einen Widerspruchsbeweis nehmen wir an, die von unserem Algorithmus
berechnete Lösung von Codeworten a = (a , . . . , a ) sei nicht optimal. Dann gibt es
eine optimale Lösung b = (b , . . . , b ) mit b 6= a. Wir sortieren die Lösungen durch
Permutationen α und β so, dass (|a | ≤ |a | · · · ≤ |a |) und (|b | ≤ |b | · · · ≤
|b |).
1+2+2+1+2+2+2+2+1
9
5
3
Behauptung:
c
n
i=1
1
n
i
Beweis:
1
1
n
n
α(1)
α(2)
β(n)
2
α(n)
β(1)
β(2)
Sei j der kleinste Index, für den |a | =6 |b | gilt. Aufgrund unserer gierigen Strategie
gilt |a | < |b | und da die b aufsteigend sortiert sind, erhalten wir oensichtlich
eine Lösung b = (b , . . . , b , a , b , . . . , b ) mit niedrigerer durchschnittlicher Gesamtlänge als b. Dies ist ein Widerspruch zur Annahme, dass b optimal ist.
α(j)
α(j)
β(j)
0
β(j)
β(i)
β(1)
β(j−1)
α(j)
β(j+1)
β(n)
=
=
≈ 1, 3
Erwartete Wortlänge:
Algorithmus Code entwickelt einen optimalen Code C, der die gewichtete
durschnittliche Codewortlänge des Codes wg¯ = P h ∗ |w | minimiert, wobei h die
relative Häugkeit des Wortes w ist.
Für einen Widerspruchsbeweis nehmen wir an, die von unserem Algorithmus berechnete Lösung von Codeworten a = (a , . . . , a ) sei nicht optimal. Dann gibt es eine
optimale Lösung b = (b , . . . , b ) mit b 6= a. Wir sortieren die Lösungen durch Permutationen γ absteigend nach den Häugkeiten der codierten Wörter, für die die Codeworte
stehen. Aufgrund der gierigen Strategie gilt dann auch, dass (|a | ≤ |a | · · · ≤ |a |).
Sei j der kleinste Index, für den |a | =6 |b | gilt. Aufgrund unserer gierigen Strategie
gilt |a | < |b |.
Wenn b optimal ist, dann muss es (mindestens) einen Index k > j geben, für den gilt, dass
|a | > |b | gilt. Da die gierige Strategie jedoch möglichst kürze Codierungen für die
gröÿten Häugkeiten verwendet und auch alle solcher möglichen Codierungen verwendet,
muss entweder gelten k < j (und damit Widerspruch), oder die Codierungen an den
Indizes j und k sind genau vertauscht. In diesem Fall gilt aber, weil durch die Sortierung
gilt, dass h ≤ h und damit:
326
246
42∗1+25∗2+1∗2+66∗1+13∗2+26∗2+18∗2+22∗2+33∗1
246
163
123
Behauptung:
c
1
n
n
i=1
i
i
i
i
Beweis:
1
1
n
n
γ(1)
γ(j)
γ(j)
γ(k)
γ(2)
γ(n)
γ(j)
γ(j)
γ(k)
γ(j)
γ(k)
hγ(j) + |aγ(j) | + hγ(k) + |aγ(k) | ≤ hγ(j) + |aγ(k) | + hγ(k) + |aγ(j) |
hγ(j) (|aγ(j) | − |aγ(k) |) ≤ hγ(k) (|aγ(j) | − |aγ(k) |)
In diesem Fall wäre dann aber b nicht optimal oder die mittlere gewichtete Wortlängen
der beiden Lösungen sind gleich. Widerspruch.
c) Laufzeiten pro Zeile:
1 O(n log(n)) mit Sortierverfahren wie z.B. Mergesort
2 n ∈ O(n)
3 1 ∈ O(1)
4 1 ∈ O(1)
5 n + 1 ∈PO(n)
6 ≤ 1 + blog ic + 1 ≤ 1 + P log (n) ∈ O(n log (n) ∈ O(n log(n))
7 (s ∗ c + 2) ∗ n ≤ (log (n) ∗ c + 2) ∗ n ∈ O(n log(n)), mit c konstante Zeit zum Abfragen
8 n ∈ O(n)
9 n ∈ O(n)
10 ≤ n ∈ O(n)
11 ≤ n ∈ O(n)
12 1 ∈ O(1)
3
n−1
i=1
n
i=1
3
3
3
m
Da die Laufzeit des benötigten Sortierverfahrens im Algorithmus überwiegt, ist die Laufzeit des ganzen Algorithmus unabhängig von der Anzahl der zur Verfügung stehenden
Zeichen und ∈ O(n log(n)).
4