Adaptív Huffman algoritmus

Az adaptív Huffman-kódolás (más néven dinamikus Huffman-kódolás ) egy Huffman-kódoláson alapuló adaptív módszer . Lehetővé teszi egy kódséma felépítését streaming módban (az adatok előzetes szkennelése nélkül), az eredeti disztribúció kezdeti ismerete nélkül, amely lehetővé teszi az adatok tömörítését egyetlen lépésben. Ennek a módszernek az az előnye, hogy menet közben is kódolható.

Algoritmusok

Ennek a módszernek számos megvalósítása létezik, a legfigyelemreméltóbb az "FGK" (FGK: Voller, Gallagher és Knuth ) és a Witter-algoritmus.

FGK algoritmus

Lehetővé teszi a Huffman-fa dinamikus beállítását kezdeti frekvenciák nélkül. Az FGD Huffman-fának van egy speciális külső csomópontja, az úgynevezett 0-csomópont , amely a bejövő karakterek azonosítására szolgál. Ez azt jelenti, hogy amikor egy új karakterrel találkozunk, annak útvonala a fában a nulla csomóponttól kezdődik. A legfontosabb dolog az, hogy szükség esetén le kell vágni és ki kell egyensúlyozni az FGD Huffman fát, és frissíteni kell a kapcsolódó csomópontok gyakoriságát. Egy szimbólum gyakoriságának növekedésével az összes szülőjének gyakoriságát is növelni kell. Ez a csomópontok, részfák vagy mindkettő egymás utáni permutációjával érhető el.

Az FGD fa fontos jellemzője a testvériség (vagy rivalizálás) elve: minden csomópontnak két gyermeke van (a gyermek nélküli csomópontokat leveleknek nevezzük), és a súlyok csökkenő sorrendben vannak. Ennek a tulajdonságnak köszönhetően a fa szabályos tömbben tárolható, ami növeli a teljesítményt. [1] [2]

Witter-algoritmus

A kód egy fastruktúraként jelenik meg, amelyben minden csomóponthoz tartozik egy súly és egy egyedi szám.

A számok lefelé mennek, és jobbról balra.

A súlyoknak meg kell felelniük a testvériség elvének. Így ha A B szülője, C pedig B gyermeke, akkor .

A súly csak az eddig talált karakterek száma.

Az azonos súlyú csomópontok halmaza egy blokk .

Az egyes csomópontok kódjának megszerzéséhez egy bináris fa esetében egyszerűen bejárhatjuk az összes utat a gyökértől a csomópontig, például "1"-et írva, ha jobbra megyünk, és "0"-t, ha jobbra megyünk. menj balra.

Ezenkívül ez az algoritmus egy speciális levelet (csomópont utódok nélkül), NYT-t (az angol még nem továbbított - még nem továbbított karakterből) használ, amelyből új, korábban nem látott karakterek „nőnek ki”.

A kódoló és a dekódoló csak a legnagyobb súlyú gyökércsomóponttól indul. Kezdetben ez a mi NYT-csomópontunk.

Amikor átadjuk a NYT karaktert, először magának a csomópontnak a kódját kell átadnunk, majd az adatokat.

Minden egyes szimbólumhoz, amely már benne van a fában, csak a végcsomópontok (levelek) kódját kell átadnunk.

Az adó és a vevő minden egyes elküldött karakternél frissítési eljárást hajt végre:

  1. Ha az aktuális szimbólum nem található, adjon hozzá két gyermek csomópontot a NYT-hez: az egyik a következő NYT-hez, a másik a szimbólumhoz. Növelje az új lap és a régi NYT súlyát, és folytassa a 4. lépéssel. Ha az aktuális szimbólum nem NYT, lépjen a szimbólumlapra.
  2. Ha ennek a csomópontnak nincs a legnagyobb súlya a blokkban, cserélje ki a legnagyobb számú csomópontra, kivéve, ha ez a csomópont szülő [3]
  3. Az aktuális csomópont súlyának növelése
  4. Ha nem a gyökércsomópont, lépjen a szülőcsomópontra, majd folytassa a 2. lépéssel. Ha ez a gyökér, fejezze be.

Megjegyzés: A csomópontok cseréje a súlyok és a megfelelő szimbólumok cseréjét jelenti, nem a számokat.

Példa

Egy üres fával kezdjük.

Az "a" bináris kódját adjuk át.

A NYT két gyermek csomópontot hoz létre: 254 és 255. Növelje a gyökér súlyát. A 255-ös csomóponthoz tartozó "a" kód 1 lesz.

"b" esetén küldje el a 0-t (a csomópont NYT-kódja), majd a bináris kódját.

A NYT két gyermeket szül: 252 NYT és 253 b . Növeljük a 253, 254 és a gyökér súlyokat. A "b" kódja 01.

A következő "b"-hez 01 kerül átvitelre.

A 253-as lapra megyünk. 1-nél van egy súlyblokk, és a 255-ös blokkban van a legnagyobb szám, tehát megváltoztatjuk a 253-as és 255-ös csomópontok súlyát és szimbólumait, növeljük a súlyt, a gyökérhez megyünk és növeljük a gyökér súlyát.

A jövőben a "b" kódja 1, az "a" pedig most 01, ami a gyakoriságukat tükrözi.

Jegyzetek

  1. [1] Archivált : 2016. szeptember 24. a Wayback Machine , FGK Algorithm oldalán
  2. [2] Archivált : 2016. szeptember 21. itt: Wayback Machine , Huffman Adaptive Coding
  3. Adaptív Huffman kódolás . Cs.duke.edu. Letöltve: 2012. február 26. Az eredetiből archiválva : 2012. február 12..

Irodalom

  • Vitter eredeti közleménye: JS Vitter, " Dinamikus Huffman-kódok tervezése és elemzése ", ACM Journal, 34(4), 1987. október, 825-845.
  • JS Vitter, "ALGORITHM 673 Dynamic Huffman Coding", ACM Transactions on Mathematical Software, 15(2), 1989. június, 158–167. Az ACM összegyűjtött algoritmusaiban is megjelenik.
  • Donald E. Knuth, "Dynamic Huffman Coding", Journal of Algorithm, 6(2), 1985, 163–180.

Linkek