Obsah
Huffmanovo kódování
Huffmanovo kódování je algoritmus, který využívá metodu kódování s proměnnou délkou slova. Hlavní myšlenka je prostá: znaky (nebo symboly), které se v datech vyskytují nejčastěji, jsou kódovány kratší sekvencí bitů, zatímco méně časté znaky mají kódy delší.
Tímto způsobem se celková velikost dat zmenší, aniž by došlo k jakékoli ztrátě informací při zpětném dekódování.
Jak algoritmus funguje (Tvorba stromu)
Proces vytvoření Huffmanova kódu probíhá v několika krocích:
1. **Analýza četnosti:** Spočítáme, kolikrát se každý znak v textu vyskytuje. 2. **Vytvoření prioritní fronty:** Každý znak se stane samostatným uzlem (listem) stromu s váhou odpovídající jeho četnosti. 3. **Stavba binárního stromu:** * Vybereme dva uzly s nejmenší četností. * Spojíme je do nového uzlu, jehož váha je součtem obou. * Tento proces opakujeme, dokud nezůstane pouze jeden kořenový uzel. 4. **Přiřazení kódů:** Cestě doleva k potomkovi přiřadíme hodnotu **0** a cestě doprava hodnotu **1**.
Příklad v praxi
Mějme slovo: BANANA
- Četnosti: A (3x), N (2x), B (1x).
- Znak 'A' je nejčastější, dostane tedy nejkratší kód (např.
0). - Znak 'B' je nejméně častý, dostane nejdelší kód (např.
110).
Bez komprese (v ASCII) by každý znak zabral 8 bitů (celkem 48 bitů). Po Huffmanově kódování může celé slovo zabrat například jen 10-12 bitů.
Prefixová vlastnost
Klíčovou vlastností Huffmanova kódování je, že žádný kód není prefixem (začátkem) jiného kódu.
Díky tomu při čtení bitového proudu (např. 01101…) dekodér přesně ví, kde jeden znak končí a druhý začíná, aniž by potřeboval oddělovače. Jakmile narazí na sekvenci, která odpovídá nějakému znaku v Huffmanově stromu, okamžitě jej zapíše a začne číst další znak od nuly.
Výhody a omezení
| Vlastnost | Popis |
|---|---|
| Bezztrátovost | Po dekompresi získáme identická data, bit po bitu. |
| Optimalita | Je to nejefektivnější metoda kódování jednotlivých symbolů. |
| Statická vs. Dynamická | Vyžaduje buď uložení tabulky kódů spolu se souborem (statická), nebo složitější výpočet za běhu (adaptivní). |
| Závislost na četnosti | Pokud mají všechny znaky stejnou četnost, komprese nebude fungovat (soubor se nezmenší). |
Kde se Huffmanovo kódování používá?
Huffmanův algoritmus se málokdy používá samostatně, většinou je součástí složitějších kompresních řetězců:
- Deflate: Algoritmus v ZIPu a PNG, který kombinuje Huffmanovo kódování s metodou LZ77.
- Multimedia: Poslední fáze komprese u formátů JPEG a MP3.
- Síťová komunikace: Součást protokolu HTTP/2 pro kompresi hlaviček.
Související pojmy: Binární strom, Algoritmus, Komprese dat, ZIP, JPEG, Bitová hloubka, Entropie.
