Informatik A

Werbung
Teillösungen zum 8. Aufgabenblatt zur Vorlesung
Informatik A
(Frank Hoffmann)
1. q-näre Bäume
Betrachten Sie einen Baum mit Wurzel, bei dem alle inneren Knoten festen Ausgrad q
haben mit q > 1. Was ist die Anzahl i von inneren Knoten und was ist die Anzahl l von
Blättern in einem solchen Baum, wenn er insgesamt n Knoten hat.
Lösung: Offensichtlich ist i + l = n.
Des weiteren ist jeder Knoten außer der Wurzel Kind genau eines inneren Knotens.
n−1
Damit gilt: i · q = n − 1. Also ist i = n−1
q und l = n − q .
2. Extreme Huffman-Bäume
Huffman–Codierungen führen zu Binärbäumen. Wie tief sind diese mindestens und wie
tief höchstens, wenn n Zeichen codiert werden. Geben Sie weiterhin ein hinreichendes
Kriterium für die Wahrscheinlichkeitsverteilung der n Zeichen an, so dass der Codierungsbaum maximale Tiefe hat.
Lösung: Sei die Tiefe d eines Binärbaumes T bei gegebener Blätterzahl n minimal.Wir
können weiterhin annehmen, dass T der Gestalt ist, dass es keine Blätter der Tiefe d − 2
gibt (ansonsten hängt man Blätter um). Also ist
2d−1 < n ≤ 2d
und wir haben d = dlog2 ne.
In Huffman-Bäumen haben alle inneren Knoten Ausgrad 2. Die Tiefe wird maximal,
wenn für jeden inneren Knoten (mindestens) ein Kind ein Blatt ist und es genau einen
inneren Knoten mit zwei Blättern als Kinder gibt. Damit ist die Tiefe bei n Blättern
dann n − 1.
3. Codierung allgemein
(a) Welcher der folgenden Codes ist eindeutig decodierbar und warum?
C1 = {0110, 010, 0, 111}, C2 = {010, 00, 001, 01}
Lösung: Seien a, b, c, d jeweils die durch die 4 Codewörter codierten Zeichen. Der
Code C1 ist eindeutig decodierbar. In einem codierten Text kann das Teilwort 111
nur auftreten, wenn es vom Zeichen d herrührt. Wir scannen also den Text von
links nach rechts und ersetzen 01110 jeweils durch d. Anschließend werden wieder
von links nach rechts die Zeichen a decodiert, die an dem Teilwort 11 eindeutig zu
erkennen sind, danach analog die Zeichen b. Die restlichen Nullen müssen jeweils
das Zeichen c codieren.
Bei C2 handelt es sich nicht um einen eindeutig decodierbaren Code.Zum Beipiel
kann das Wort 01001 sowohl dc als auch ad bedeuten.
(b) Konstruieren Sie für die folgenden Codewortlängen einen Präfixcode.
n1 = n2 = 2, n3 = n4 = n5 = 3, n6 = n7 = 4
Lösung: Wir überprüfen die Bedingung aus dem Satz von Kraft-McMillan
2 · 2−2 + 3 · 2−3 + 2 · 2−4 ≤ 1
Dies stimmt. Als Codewörter wählen wir von links nach rechts die jeweils lexikografisch kleinsten möglichen Wörter der vorgegebenen Längen. Dies sind:
00, 01, 100, 101, 110, 1110, 1111
4. Implementierung Blockcode
Entwickeln Sie eine Haskell–Funktion blockCode, die für einen Eingabestring die
Codierung mittels Blockcode-Verfahren über {0, 1} berechnet. Ausgabe ist ein Paar
bestehend aus codiertem String und einer Decodierungsliste als zweite Komponente.
Diese Liste enthält Paare von vorkommenden Zeichen und zugehörigen Blockcodewörtern. Dabei soll die verwendete Blocklänge minimal sein. Definieren Sie sich
geeignete Hilfsfunktionen! Die Umkehrfunktion blockDecode soll dann dekodieren.
Herunterladen