Adaptivní Huffmanův algoritmus

Adaptivní Huffmanovo kódování (také nazývané dynamické Huffmanovo kódování ) je adaptivní metoda založená na Huffmanově kódování . Umožňuje sestavit kódové schéma v režimu streamování (bez předběžného skenování dat), bez jakýchkoli počátečních znalostí z původní distribuce, což umožňuje komprimovat data v jediném průchodu. Výhodou této metody je možnost kódování za chodu.

Algoritmy

Existuje několik implementací této metody, nejpozoruhodnější je "FGK" (FGK: Voller, Gallagher a Knuth ) a Witterův algoritmus.

Algoritmus FGK

Umožňuje vám dynamicky upravovat Huffmanův strom bez počátečních frekvencí. FGD Huffmanův strom má speciální vnější uzel, nazývaný 0-node , který se používá k identifikaci příchozích znaků. To znamená, že kdykoli se objeví nový znak, jeho cesta ve stromu začíná od nulového uzlu. Nejdůležitější je, že v případě potřeby musíte zkrátit a vyvážit FGD Huffmanův strom a aktualizovat frekvenci přidružených uzlů. Se zvyšující se frekvencí symbolu se musí zvyšovat i frekvence všech jeho rodičů. Toho je dosaženo postupnou permutací uzlů, podstromů nebo obou.

Důležitým rysem stromu FGD je princip bratrství (neboli rivality): každý uzel má dvě děti (uzly bez dětí se nazývají listy) a váhy jsou v sestupném pořadí. Díky této vlastnosti lze strom uložit do běžného pole, což zvyšuje výkon. [1] [2]

Witterův algoritmus

Kód je reprezentován jako stromová struktura, ve které má každý uzel přiřazenou váhu a jedinečné číslo.

Čísla klesají a zprava doleva.

Závaží musí splňovat princip bratrství. Pokud je tedy A rodič B a C je potomkem B, pak .

Váha je jen počet dosud naražených postav.

Sada uzlů se stejnými váhami je blok .

Abychom získali kód pro každý uzel, v případě binárního stromu bychom mohli jednoduše projít všechny cesty od kořene k uzlu a napsat například „1“, pokud půjdeme doprava, a „0“, pokud jděte doleva.

Také tento algoritmus používá speciální list (uzel bez potomků), NYT (z angličtiny dosud nevysílaný - dosud nepřenesený znak), ze kterého „vyrůstají nové, dříve neviděné znaky“.

Kodér a dekodér začínají pouze u kořenového uzlu, který má maximální váhu. Na začátku je to náš NYT uzel.

Když předáme znak NYT, musíme nejprve předat kód samotného uzlu a poté data.

Pro každý symbol, který je již ve stromu, musíme předat pouze kód koncových uzlů (listů).

Pro každý vysílaný znak provedou vysílač a přijímač postup aktualizace:

  1. Pokud není aktuální symbol nalezen, přidejte dva podřízené uzly do NYT: jeden pro další NYT a druhý pro symbol. Zvyšte váhu nového listu a starého NYT a přejděte ke kroku 4. Pokud aktuální symbol není NYT, přejděte na list symbolů.
  2. Pokud tento uzel nemá nejvyšší váhu v bloku, zaměňte jej za uzel s nejvyšším číslem, pokud tento uzel není nadřazený [3]
  3. Zvýšení váhy pro aktuální uzel
  4. Pokud to není kořenový uzel, přejděte na nadřazený uzel a poté přejděte ke kroku 2. Pokud se nejedná o kořenový uzel, dokončete.

Poznámka: Nahrazení uzlů znamená nahrazení vah a odpovídajících symbolů, nikoli čísel.

Příklad

Začínáme s prázdným stromem.

Pro "a" předáme jeho binární kód.

NYT vytvoří dva podřízené uzly: 254 a 255. Zvyšte váhu kořene. Kód "a" spojený s uzlem 255 se stane 1.

Pro "b" pošlete 0 (kód NYT uzlu) a poté jeho binární kód.

NYT plodí dvě děti: 252 pro NYT a 253 pro b . Zvyšujeme váhy 253, 254 a kořen. Kód pro "b" je 01.

Pro další "b" se přenese 01.

Jdeme na list 253. Máme blok váhy na 1 a největší číslo v bloku 255, takže změníme váhy a symboly uzlů 253 a 255, zvýšíme váhu, přejdeme na kořen a zvýšíme váhu kořene.

V budoucnu bude kód pro „b“ 1 a pro „a“ je nyní 01, což odráží jejich frekvenci.

Poznámky

  1. [1] Archivováno 24. září 2016 na Wayback Machine , FGK Algorithm
  2. [2] Archivováno 21. září 2016 na Wayback Machine , Huffman Adaptive Coding
  3. Adaptivní Huffmanovo kódování . Cs.duke.edu. Získáno 26. února 2012. Archivováno z originálu 12. února 2012.

Literatura

  • Vitterův původní článek: JS Vitter, " Design and Analysis of Dynamic Huffman Codes ", ACM Journal, 34(4), říjen 1987, str. 825-845.
  • JS Vitter, "ALGORITHM 673 Dynamic Huffman Coding", ACM Transactions on Mathematical Software, 15(2), červen 1989, str. 158–167. Také se objeví v Collected Algorithms of ACM.
  • Donald E. Knuth, "Dynamic Huffman Coding", Journal of Algorithm, 6(2), 1985, str. 163–180.

Odkazy