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.