Verlustfreie Datenkomprimierung mit präfixfreien Codes variabler Länge – häufig vorkommende Zeichen bekommen kurze Codes, seltene Zeichen längere.
Der Huffman-Algorithmus stellt eine Methode zur verlustfreien Komprimierung von Daten dar. Er wurde 1952 von David A. Huffman entwickelt. Der Algorithmus erzeugt aus Symbolen und deren Verteilung im zu komprimierenden Text Binärbäume, aus welchen präfixfreie Codierungen variabler Länge (Huffman-Codes) gewonnen werden. Diese codieren den Text mit minimalem Speicherplatz. Die Codierung muss verlustlos sein, d. h. die Nachricht muss eindeutig und ohne Verlust von Information decodiert werden können. Häufig vorkommende Buchstaben werden mit kürzeren Codewörtern codiert, selten vorkommende Buchstaben können längere Codewörter haben.
Schauen wir es uns an einem Beispiel von Alice und Bob an: „ABRAKADABRA". Wir stellen eine Häufigkeitstabelle (Häufigkeitsanalyse) auf:
| Buchstabe | Häufigkeit |
|---|---|
| A | 5 |
| B | 2 |
| D | 1 |
| K | 1 |
| R | 2 |
Es werden die Buchstaben und ihre Häufigkeiten in die bzw. unter die Blätter eingetragen.
Es gibt noch vaterlose Knoten: A, B, K, D und R. Fasse die beiden vaterlosen Blätter mit den geringsten Häufigkeiten (K und D haben beide den Wert 1) in einem Vaterknoten zusammen, indem die Häufigkeiten der Kinder addiert werden. Trage die Summe 2 im Vaterknoten ein.
Es gibt noch vaterlose Blätter: A, B, R. Fasse die zwei Knoten mit den geringsten Häufigkeiten in einem Vaterknoten zusammen (z. B. den Vaterknoten mit dem Wert 2 und Blatt B mit dem Wert 2) und addiere die Häufigkeiten der Kinder. Trage die Summe 4 im Vaterknoten ein.
Es gibt noch einen vaterlosen Blatt: A. Fasse aber zuerst die Knoten mit den geringsten Häufigkeiten zusammen – den Vaterknoten (BR 4) und DK mit dem Wert 2 – in einem Vaterknoten und addiere die Häufigkeiten der Kinder. Trage die Summe 6 im Vaterknoten ein.
Füge nun Blatt A zum Vaterknoten (BDKR) hinzu. Summiere die Häufigkeiten (Vaterknoten mit Wert 6 und Blatt A mit Wert 5) in einem Vaterknoten. Trage die Summe 11 im Vaterknoten ein – die Wurzel ist erreicht.
Es gibt kein vaterloses Blatt mehr und genau einen vaterlosen Knoten (die Wurzel). Den linken Kanten wird je eine 0, den rechten je eine 1 zugewiesen. Nun kann man die Codierung für die verschiedenen Buchstaben ablesen: Starte bei der Wurzel und folge den Kanten bis zu einem Blatt. Schreibe 0 beim Gang nach links und 1 beim Gang nach rechts.
Beispiel „A": Von der Wurzel gehst du erst nach links und erreichst Blatt „A". Also ist das Codewort für „A" = 0. So entsteht die Code-Tabelle.
Was passiert, wenn Bob eine codierte Nachricht von Alice erhält und diese decodieren will? Um sie decodieren zu können, muss Bob natürlich wissen, wie der Huffman-Baum aussieht – ansonsten weiß er nicht, wie Alice codiert hat. Er geht Bit für Bit durch das codierte Wort und den Baum wie folgt: