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
© Copyright 2024