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ó.
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.
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]
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:
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.
Tömörítési módszerek | |||||||
---|---|---|---|---|---|---|---|
Elmélet |
| ||||||
Veszteségmentes |
| ||||||
Hang |
| ||||||
Képek |
| ||||||
Videó |
|