🌳 Huffman Coding
Build a Huffman tree step by step: count frequencies, merge the two smallest nodes into a binary tree, read off prefix codes, and compare Huffman bits vs fixed-length and entropy.
About Huffman Coding
Huffman coding is a lossless data compression algorithm invented by David A. Huffman in 1952 that assigns shorter binary codes to more frequent characters and longer codes to rarer ones, producing an optimal prefix-free encoding. It builds a binary tree bottom-up: repeatedly merge the two nodes with the smallest frequencies from a min-priority queue until a single root remains, then read 0/1 path labels to derive each character's code. The algorithm is provably optimal among symbol-by-symbol codes and underpins formats such as DEFLATE (used in ZIP and PNG), JPEG's entropy stage, and MP3.
In this simulation you can type any input text, watch the frequency table populate, and step through each merge operation as the tree grows. The panel on the right shows each character's assigned code word, the total Huffman bit-length, and how it compares to fixed 8-bit ASCII encoding and the Shannon entropy lower bound.
Frequently Asked Questions
How does Huffman coding guarantee an optimal prefix-free code?
Huffman's greedy algorithm merges the two lowest-frequency nodes at every step; this satisfies the principle that symbols appearing most often should have the shortest paths from root to leaf. A formal exchange argument proves that any other assignment of code lengths to this frequency distribution cannot achieve a shorter expected code length, making the scheme optimal among all uniquely decodable symbol codes.
What is the average code length produced by Huffman coding?
The expected code length L satisfies H(X) ≤ L < H(X) + 1, where H(X) = −∑ pi log2 pi is the Shannon entropy of the source. In the worst case (all symbols equally probable), Huffman is only one bit per symbol above entropy. For sources with highly skewed frequencies the average code length can come very close to entropy.
Why must Huffman codes be prefix-free?
A prefix-free (or prefix) code ensures that no codeword is the prefix of another, so a decoder can unambiguously read bits from a stream without needing separator markers. Because Huffman assigns codes from leaf-to-root paths in a binary tree, leaves are never ancestors of one another, automatically guaranteeing the prefix-free property.
What data structures are needed to build a Huffman tree efficiently?
The standard implementation uses a min-heap (priority queue) keyed on node frequency. Each of the n merge operations costs O(log n) for heap insertion and extraction, giving an overall O(n log n) construction time. For a 256-symbol alphabet this is effectively constant-time in practice.
How does Huffman coding differ from arithmetic coding?
Huffman assigns an integer number of bits per symbol, so it cannot beat one bit per symbol for very high-probability symbols. Arithmetic coding encodes entire messages as a single fraction, achieving expected lengths arbitrarily close to entropy even when individual symbol probabilities exceed 0.5. However, arithmetic coding is more computationally intensive and subject to patent restrictions historically.
Is Huffman coding used in modern file formats?
Yes. DEFLATE — the compression kernel inside ZIP, gzip, and PNG — combines LZ77 string matching with Huffman coding. JPEG uses Huffman (or optionally arithmetic) coding after its DCT quantisation step. The older PKZIP format and the Brotli web-compression algorithm also build on Huffman-family schemes.
What happens when two nodes have equal frequency during tree construction?
Ties are broken arbitrarily; different tie-breaking strategies produce different tree shapes but always achieve the same optimal expected code length. In practice, stable or canonical Huffman implementations specify a deterministic tie-breaking rule so that encoder and decoder can reconstruct the same tree from a compact header.
What is a canonical Huffman code?
A canonical code reassigns codewords so that codes of the same length are consecutive integers, allowing the decoder to store only code lengths rather than the full tree. This dramatically reduces header overhead: instead of serialising the tree, the compressor transmits just the symbol lengths, saving kilobytes in formats like PNG's zlib layer.
Can Huffman coding achieve a compression ratio greater than 8× compared with ASCII?
Only if the source has very low entropy — for example a binary file containing almost exclusively one byte value. In that extreme case the Huffman code for that symbol might be 1 bit, yielding up to an 8× reduction versus 8-bit ASCII. For natural English text, compression ratios are typically 1.5–2.5× with Huffman alone.
What is adaptive (dynamic) Huffman coding?
Adaptive Huffman coding updates the frequency table and rebuilds (or incrementally adjusts) the tree as each symbol is processed, removing the need for a two-pass algorithm or a stored header. The FGK and Vitter algorithms maintain the sibling property to allow O(log n) incremental updates, enabling single-pass streaming compression.
Build an optimal prefix-free code by merging the two rarest symbols again and again. Watch the tree grow, read off the 0/1 codes, and compare Huffman bits to fixed-length and to the entropy limit.
3D · Three.js / WebGL renderer · 60 FPS target · runs fully client-side, no install