Huffmanov kód

Kód D (tabuľka 2.4) má najmenšie spomedzi všetkých uvedených. Na druhej strane, malá zmena v kóde C (tabuľka 2.3) spôsobí, že jeho entropia klesne ešte pod túto hranicu. Keď vymeníme kódové slová pre symboly a , entropia pre kód C klesne o , teda . Tento nový kód je tiež jednoznačne dekódovateľný.

Týmto postupom môžeme entropiu postupne znižovať a tým daný kód stále zlepšovať. D.A. Huffman zostrojil algoritmus (Huffman, 1952) na tvorbu optimálneho kódu s minimálnym . Algoritmus a kód, ktorý sa vytvára, boli nazvané podľa ich autora.

Vytváranie optimálneho kódu

Majme teda zdrojovú abecedu:

Ďalej, bez ujmy na všeobecnosti môžeme predpokladať, že početnosti výskytov jednotlivých zdrojových symbolov sú
Keďže hľadáme optimálny kód pre S, musia dĺžky kódových slov pre jednotlivé znaky spĺňať podmienku
Na základe týchto požiadaviek na optimálny kód, Huffman odvodil nasledujúce pravidlá:
  • . Táto rovnica a 3.2 hovoria, že keď sú zdrojové symboly usporiadané zostupne podľa ich početnosti, potom dĺžky ich kódových slov by mali byť v neklesajúcom poradí. Inak povedané, dĺžky kódových slov častejšie sa vyskytujúcich zdrojových symbolov nesmú byť dlhšie ako menej vyskytujúcich sa symbolov. Kódové slová priradené posledným dvom zdrojovým symbolom (s najmenšou početnosťou) majú rovnakú dĺžku.
  • Zdrojové symboly s najmenšou početnosťou majú im prislúchajúce kódové slová líšiace sa len v poslednom bite.
  • Každá možná sekvencia dĺžky musí byť buď kódové slovo, alebo jeden z jej prefixov musí byť kódové slovo.

To, ako zabezpečiť tieto podmienky, je napísane v samotnej učebnici. Samotným algoritmom sa budeme zaoberať v nasledujúcej časti.

Algoritmus

Na základe týchto troch pravidiel vieme, že najmenej vyskytujúce sa zdrojové znaky majú rovnakú dĺžku kódových slov, ktoré im boli priradené. Tieto kódové slová sa líšia iba v poslednom bite (teda v 0 a 1). Preto tieto dva zdrojové symboly môžu byť spojené do nového symbolu, ktorého početnosť bude . Novovzniknutá abeceda má o jeden symbol menej ako pôvodná abeceda. Túto abecedu preusporiadame, aby sme znova splnili podmienku nerastúcich početností. Podobný postup môžeme aplikovať na túto abecedu a posledným dvom symbolom priradiť hodnoty $0$ a $1$ ktoré, spojíme do nového symbolu. Algoritmus sa zastaví v momente, keď spojíme posledné dva symboly a vznikne nám abeceda s jedným symbolom. Tomuto symbolu (pokiaľ sa nikde nevyskytla chyba) sme priradili početnosť .

Na ukážku si zoberme kód, ktorý je uvedený v tabuľke 3.1. Obrázky 3.13.6 ilustrujú postupné vytváranie Huffmanovho stromu. Sú na nich zobrazené len modifikované zdrojové abecedy, kde už sú jednotlivé symboly usporiadané podľa ich početnosti. Celý postup sa dá zhrnúť do nasledujúcich krokov.

  • zostupne zoraď symboly zdrojovej abecedy podľa ich početnosti
  • spoj posledné dva symboly
    • vytvor z nich nový symbol, ktorého početnosť bude ich súčtom.
    • priraď im binárne 0 a 1.
  • tento postup opakuj, pokiaľ nevznikne abeceda s jedným symbolom
  • traverzovaním vzniknutého stromu priraď jednotlivým symbolom ich kódové slová.
Tabuľka 3.1:Príklad na Huffmanov kód
Zdroj. symbol Početnosť Kódové slovo Dĺžka
2
3
2
4
4
2
Obrázok 3.1: Krok Huffmanovho algoritmu 1
Obrázok 3.2: Krok Huffmanovho algoritmu 2
Obrázok 3.3: Krok Huffmanovho algoritmu 3
Obrázok 3.4: Krok Huffmanovho algoritmu 4
Obrázok 3.5: Krok Huffmanovho algoritmu 5
Obrázok 3.6: Krok Huffmanovho algoritmu 6

Modifikácie

Pokiaľ máme zdroj, ktorý má iba binárnu abecedu (prvá časť tabuľky 3.2), vytvorením Huffmanovho kódu nič neušetríme. Na druhej strane nám entropia hovorí o možnosti kompresie, pretože jej hodnota je . Tu sa ponúka možnosť kódovať dibity. Huffmanov kód pre dibity je v druhej časti tabuľky 3.2 a výsledná bitová náročnosť je potom bitu na znak.

Tabuľka 3.2: Modifikácia Huffmanovho kódu
Zdroj. symbol
Početnosť
Huffman. kód 0

Ďalšími významnými modifikáciami sú Huffmanové kódy pre vopred neznáme postupnosti, kedy sa Huffmanova tabuľka mení adaptívne podľa kódovaných dát. Tieto kódy sú najdôležitejšie pri prenose dát v reálnom čase bez degradácie.

Záverečný komentár

Vytváranie Huffmanovho kódu nie je jednoznačné. Nejednoznačnosť nastáva v prípadoch, keď dva symboly počas výpočtu majú rovnakú početnosť. Tu môže ľahko nastať zámena týchto dvoch symbolov pri vytváraní Huffmanovho stromu. Tento problém sa rieši vzájomnou dohodou (na triedenie sa použije stabilný algoritmus).