====== 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.//