Datenkompression und Dateiformate

Huffman-Codierung

David A. Huffman

Die Idee

Die Huffman-Kodierung ist ein Verfahren, dass eine Codierung von Eingabewörtern gleicher Länge mit Codes unterschiedlicher Länge unter Berücksichtigung der Fano-Bedingung ermöglicht. Dabei hat der Professor der Informatik David A. Huffman Im Jahre 1952 den Durchbruch erzielt. Er ermöglichte es die Baumstruktur soweit zu verändern, dass der Baum und der entstehende Code immer optimal ist.

Der optimale Baum - aber wie? :

Die Grundidee der Huffman-Kodierung ist die Sortierung der Eingabewörter nach ihrer Häufigkeit innerhalb der Eingabe. Unter Eingabewörtern versteht man meist Buchstaben, obwohl die Kodierung auch mit jeglichen anderen Daten machbar ist. Das genaue Funktionsprinzip soll anhand mehrer (Text-)Beispiele erklärt werden.

erstes Beispiel: AABAACDAAEABACD

Als erstes versuchen wir die Zeichenkette AABAACDAAEABACD möglichst platzsparend zu kodieren. Zuerst muss man die Häufigkeiten und die Wahrscheinlichkeiten aller Zeichen des Eingabestrings ermitteln:

Zeichen Häufigkeit in der Eingabe Wahrscheinlichkeit de Zeichens
A 8 8/15
B 2 2/15
C 2 2/15
D 2 2/15
E 1 1/15

Nun werden die zwei Eingabezeichen unter einem Knoten zusammengefasst, die die kleinste Summe der Wahrscheinlichkeiten ergeben: In diesem Beispiel wären das D und E. Diese bezeichnen wir ganz einfach mit Z und es erhät die Häufigkeit 3. Diesen Schritt wiederholen wir und fassen jetzt die Häufigkeiten von B und C zusammen, da diese in der Summe die kleinste Häufigkeit ergeben. Die Summe bezeichnen wir einfach mit Y. Das wird solange wiederholt, bis nur noch ein Knoten übrig ist. An dieser Abbildung wird es vielleicht noch deutlicher:
Codebaum-Erstellung mittels Huffman-Codes

Wer sich jetzt nicht vorstellen kan wie man daraus einen Codebaum erstellt der bekommt ihn hier:

Codebaum-Erstellung mittels Huffman-Codes

Aus diesem Baum kann man nun das Wörterbuch aufbauen. Das würde lauten: A-0; B-100; C-101; D-110; E-111. Wie sich erkennen lässt erfüllt dieser Code die Fano-Bedingung.
Anhand diesem Wörterbuch kann man nun die Zeichenfolge AABAACDAAEABACD kodieren, es ergibt sich: 001000010111000 11101000101110, also eine Bitfolge mit der Länge 29. Diese Kodierung ist die kürzeste mögliche. Dieser Sachverhalt wurde mathematisch bewiesen.
Um die Zeichenfolge wieder entshöüsseln zu können muss das Wörterbuch natürlich mit übertragen werden.

zweites Beispiel: Mississippi

Dieses Beispiel möchte ich kürzer fassen: Als erstes muss man die Häufigkeiten ermitteln:

Zeichen Häufigkeit in der Eingabe Wahrscheinlichkeit de Zeichens
M 1 1/11
I 4 4/11
S 4 4/11
P 2 2/11

Zusammenfassung zu Knoten:
Codebaum-Erstellung mittels Huffman-Codes

Erzeugung des Baumes:
Codebaum-Erstellung mittels Huffman-Codes

Wörterbuch: S-0; I-10; P-110; M-111
Kodierter Eingabestring: 111100010001011011010 (21 Bit)

Zurückübersetzung:

Die Zurückübersetzung ist eigentlich relativ einfach - entweder hat man den Baum oder das Wörterbuch. Hat man den Baum beginnt man an der Wurzel und geht bei einer 0 nach links und bei einer 1 nch rechts bis man bei einem Buchstaben abngelangt ist. Da die Codes die Fano-Bedingung erfüllen ducht man beim Nachschlagen im Wörterbuch (dieses sollte nach Code sortiert sein) einfach nach der Zeichenkette die passt.

Über diese Ausarbeitung | Begriffe © Johannes Uhlig, diese Seite darf im Rahmen der Weiterbildung der eigenen Person verwendet werden. © | nach oben