StartseiteAlgorithmen & KIHuffman-Codierung

🌳 Huffman-Codierung

Baue einen Huffman-Baum Schritt für Schritt: zähle Häufigkeiten, verschmelze die zwei kleinsten Knoten zu einem Binärbaum, lies Präfixcodes ab und vergleiche Huffman-Bits mit fester Länge und Entropie.

Algorithmen & KI3DMittel60 FPS
huffman ↗ Eigenständig öffnen

Über die Huffman-Codierung

Die Huffman-Codierung ist ein verlustfreier Datenkompressionsalgorithmus, der 1952 von David A. Huffman erfunden wurde und häufigeren Zeichen kürzere Binärcodes und selteneren Zeichen längere Codes zuweist, was eine optimale präfixfreie Codierung ergibt. Sie baut einen Binärbaum von unten nach oben auf: Verschmelze wiederholt die beiden Knoten mit den geringsten Häufigkeiten aus einer Min-Prioritätswarteschlange, bis nur eine Wurzel übrig bleibt, und lies dann 0/1-Pfadbeschriftungen ab, um den Code jedes Zeichens abzuleiten. Der Algorithmus ist unter symbolweisen Codes nachweislich optimal und liegt Formaten wie DEFLATE (verwendet in ZIP und PNG), der Entropiestufe von JPEG und MP3 zugrunde.

In dieser Simulation kannst du beliebigen Eingabetext eintippen, beobachten, wie sich die Häufigkeitstabelle füllt, und jeden Verschmelzungsschritt durchgehen, während der Baum wächst. Das Feld rechts zeigt das jedem Zeichen zugewiesene Codewort, die gesamte Huffman-Bitlänge und wie diese im Vergleich zur festen 8-Bit-ASCII-Codierung und zur unteren Shannon-Entropiegrenze steht.

Häufig gestellte Fragen

Wie garantiert die Huffman-Codierung einen optimalen präfixfreien Code?

Huffmans gieriger Algorithmus verschmilzt bei jedem Schritt die beiden Knoten mit der geringsten Häufigkeit; dies erfüllt das Prinzip, dass häufiger vorkommende Symbole die kürzesten Pfade von der Wurzel zum Blatt haben sollten. Ein formales Austauschargument beweist, dass keine andere Zuweisung von Codelängen zu dieser Häufigkeitsverteilung eine kürzere erwartete Codelänge erreichen kann, was das Schema unter allen eindeutig decodierbaren Symbolcodes optimal macht.

Wie groß ist die durchschnittliche Codelänge, die die Huffman-Codierung erzeugt?

Die erwartete Codelänge L erfüllt H(X) ≤ L < H(X) + 1, wobei H(X) = −∑ pi log2 pi die Shannon-Entropie der Quelle ist. Im schlechtesten Fall (alle Symbole gleich wahrscheinlich) liegt Huffman nur ein Bit pro Symbol über der Entropie. Bei Quellen mit stark schiefen Häufigkeiten kann die durchschnittliche Codelänge sehr nahe an die Entropie herankommen.

Warum müssen Huffman-Codes präfixfrei sein?

Ein präfixfreier (oder Präfix-) Code stellt sicher, dass kein Codewort das Präfix eines anderen ist, sodass ein Decoder Bits aus einem Strom eindeutig lesen kann, ohne Trennzeichen zu benötigen. Da Huffman Codes über Blatt-zu-Wurzel-Pfade in einem Binärbaum zuweist, sind Blätter niemals Vorfahren voneinander, was die präfixfreie Eigenschaft automatisch garantiert.

Welche Datenstrukturen werden benötigt, um einen Huffman-Baum effizient zu erstellen?

Die Standardimplementierung nutzt einen Min-Heap (Prioritätswarteschlange), der nach Knotenhäufigkeit sortiert ist. Jede der n Verschmelzungsoperationen kostet O(log n) für Heap-Einfügung und -Extraktion, was eine Gesamtkonstruktionszeit von O(n log n) ergibt. Für ein 256-Symbol-Alphabet ist dies in der Praxis effektiv konstant.

Wie unterscheidet sich Huffman-Codierung von arithmetischer Codierung?

Huffman weist eine ganzzahlige Anzahl von Bits pro Symbol zu, kann also für Symbole mit sehr hoher Wahrscheinlichkeit nicht besser als ein Bit pro Symbol sein. Arithmetische Codierung codiert ganze Nachrichten als einzelnen Bruch und erreicht erwartete Längen, die beliebig nahe an der Entropie liegen, selbst wenn einzelne Symbolwahrscheinlichkeiten 0,5 übersteigen. Arithmetische Codierung ist jedoch rechenintensiver und historisch patentrechtlichen Beschränkungen unterworfen.

Wird Huffman-Codierung in modernen Dateiformaten verwendet?

Ja. DEFLATE — der Kompressionskern in ZIP, gzip und PNG — kombiniert LZ77-Zeichenkettenabgleich mit Huffman-Codierung. JPEG nutzt Huffman- (oder optional arithmetische) Codierung nach seinem DCT-Quantisierungsschritt. Auch das ältere PKZIP-Format und der Brotli-Webkompressionsalgorithmus bauen auf Huffman-Familienschemata auf.

Was passiert, wenn zwei Knoten während der Baumkonstruktion die gleiche Häufigkeit haben?

Gleichstände werden willkürlich aufgelöst; verschiedene Auflösungsstrategien erzeugen unterschiedliche Baumformen, erreichen aber immer dieselbe optimale erwartete Codelänge. In der Praxis geben stabile oder kanonische Huffman-Implementierungen eine deterministische Regel zur Auflösung von Gleichständen vor, sodass Encoder und Decoder denselben Baum aus einem kompakten Header rekonstruieren können.

Was ist ein kanonischer Huffman-Code?

Ein kanonischer Code weist Codewörter so neu zu, dass Codes gleicher Länge aufeinanderfolgende ganze Zahlen sind, wodurch der Decoder nur die Codelängen statt des gesamten Baums speichern muss. Dies reduziert den Header-Overhead drastisch: Statt den Baum zu serialisieren, überträgt der Kompressor nur die Symbollängen, was Kilobytes in Formaten wie der zlib-Schicht von PNG spart.

Kann Huffman-Codierung ein Kompressionsverhältnis von mehr als dem 8-Fachen im Vergleich zu ASCII erreichen?

Nur wenn die Quelle eine sehr niedrige Entropie hat — zum Beispiel eine Binärdatei, die fast ausschließlich einen einzigen Byte-Wert enthält. In diesem Extremfall könnte der Huffman-Code für dieses Symbol 1 Bit betragen, was eine Reduktion um bis zu das 8-Fache gegenüber 8-Bit-ASCII ergibt. Bei natürlichem englischem Text liegen die Kompressionsverhältnisse mit Huffman allein typischerweise beim 1,5- bis 2,5-Fachen.

Was ist adaptive (dynamische) Huffman-Codierung?

Adaptive Huffman-Codierung aktualisiert die Häufigkeitstabelle und baut den Baum bei jedem verarbeiteten Symbol neu auf (oder passt ihn schrittweise an), wodurch ein Zwei-Durchgang-Algorithmus oder ein gespeicherter Header überflüssig wird. Die Algorithmen FGK und Vitter erhalten die Geschwister-Eigenschaft, um inkrementelle Aktualisierungen mit O(log n) zu ermöglichen, was Einzeldurchgang-Streaming-Kompression erlaubt.

⚙ Unter der Haube

Baue einen optimalen präfixfreien Code, indem du wieder und wieder die beiden seltensten Symbole verschmelzt. Beobachte, wie der Baum wächst, lies die 0/1-Codes ab und vergleiche Huffman-Bits mit fester Länge und mit der Entropiegrenze.

Canvas 2DHuffmanKompressionPräfixcodeEntropie

3D · Three.js / WebGL-Renderer · Ziel-FPS 60 · läuft vollständig clientseitig, keine Installation

Was hast du gefunden?

Schritte zur Reproduktion hinzufügen (optional)