SWI072 Algoritmy komprese dat1 Algoritmy komprese dat Adaptivní Huffmanův kód
SWI072 Algoritmy komprese dat2 Statické adaptivní metody u statický model model kodér dekodér model zdroj
SWI072 Algoritmy komprese dat3 Statické adaptivní metody u adaptivní model model kodér dekodér model zdroj aktualizace modelu aktualizace modelu
SWI072 Algoritmy komprese dat4 Adaptivní Huffmanův kód - algoritmus FGK u Faller(1973), Gallagher(1978), Knuth(1985). Algoritmus FGK: Kódování Inicializuj Huffmanův strom read(znak) while znak EOF do zakóduj znak aktualizuj strom read(znak) od. Algoritmus FGK: Dekódování Inicializuj Huffmanův strom dekóduj(znak) while znak EOF do write(znak) aktualizuj strom dekóduj(znak) od.
SWI072 Algoritmy komprese dat5 Charakterizace Huffmanových stromů u Huffmanův strom - binární strom s ohodnocenými vrcholy. u Dva vrcholy binárního stromu, které mají stejného otce, nazveme sourozenci. Binární strom s ohodnocenými vrcholy má sourozeneckou vlastnost, pokud –každý vrchol kromě kořene má sourozence –vrcholy lze uspořádat do neklesající posloupnosti dle jejich vah tak, že sourozenci jsou vždy na sousedních místech. u Věta(Gallagher): Binární strom s ohodnocenými vrcholy je Huffmanovým stromem právě tehdy, když má sourozeneckou vlastnost.
3 c:2 d: a:1 b:2
3 c:2 d: a:1 b: načti znak ´a´
3 c:2 d: a:2 b:
4 c:2 d: a:2 b: načti znak ´a´
4 c:2 d: a:3 b:
4 c:2 a: d:2 b:
4 c:2 a: d:2 b:
4 c:2 a: d:2 b:
c:2 a:3 5 9 d:2 b:
c:2 a:3 5 9 d:2 b:
SWI072 Algoritmy komprese dat16 Problém nulových četností u Jak kódovat znaky, které jsou načteny poprvé? u 1. řešení: Při počáteční inicializaci jsou do Huffmanova stromu vloženy všechny znaky vstupní abecedy, každý s četností 1. u 2. řešení: Při počáteční inicializaci je do Huffmanova stromu vložen spec. znak ESC. První výskyt znaku z je kódován jako Huffmanův kód znaku ESC, následovaný znakem z. Poté je do Huffmanova stromu vložen nový list, odpovídající znaku z.
SWI072 Algoritmy komprese dat17 Problém znaků, které jsou načteny poprvé u Počáteční inicializace Huffmanova stromu esc:0 0 z:0 u z je nově načtený znak, který se ve stromě nevyskytuje u aktualizuj strom
SWI072 Algoritmy komprese dat18 Aktualizace Huffmanova stromu u z je znak načtený na vstupu u if z se ve stromě nevyskytuje then k esc:k z:0 v esc:k else v:= list Huffmanova stromu se znakem z fi.
SWI072 Algoritmy komprese dat19 Aktualizace Huffmanova stromu if v je sourozenec vrcholu esc then vyměň v s listem, který má nejvyšší pořadí mezi vrcholy se stejnou váhou jako v v.váha++; v := otec(v) fi while v kořen-stromu do vyměň v s vrcholem, který má nejvyšší pořadí mezi vrcholy se stejnou váhou jako v (vymění se celé podstromy) v.váha++; v := otec(v) od.
SWI072 Algoritmy komprese dat20 FGK:Kódování Inicializuj Huffmanův strom (T) repeat read(znak) if první výskyt znaku then write(kód(ESC)) write(znak) else write(kód(znak)) fi aktualizuj strom(T,znak) until znak EOF.
SWI072 Algoritmy komprese dat21 FGK:Dekódování u InicializujHuffmanůvStrom(T); vrchol := kořen-stromu u repeat u while vrchol není list do read(bit) if bit=0 then vrchol := vrchol.levý-syn else vrchol := vrchol.pravý-syn fi od if vrchol.znak = ESC then read(znak) else znak := vrchol.znak fi if znak EOF then zapiš znak na výstup AktualizujStrom(T,znak) fi u until znak = EOF.
SWI072 Algoritmy komprese dat22 Vitterův algoritmus u J.S.Vitter (1987) u Pouze 1 výměna při aktualizaci stromu (FGK nejvýše l/2 výměn, kde l = délka právě zapsaného k. s.) u Vitter minimalizuje i l i a max i l i ( l i = délka i-tého k. s. ) u l A - průměrná délka kódového slova pro algoritmus A l FGK 2 l H l V l H +1 u l FGK l H + O(1) (Milidiu, Laber, Pessoa,1999) u D.E.Knuth: Dynamic Huffman Coding. J. Algorithms 6(1985), J.S.Vitter: Design and analysis of dynamic Huffman codes. J. ACM 34(1987),
SWI072 Algoritmy komprese dat23 Další empirické výsledky u E.R.Fiala,D.H.Greene (1989) SC TM NS CC BF SF RCF SNI SCI BI FGK V SC zdrojový kód TM ASCII (technické memoranda) NS ASCII (news service) CC zkompilovaný kód BF boot file SF splajnové fonty RCF bitové mapy fontů kódované RLE SNI syntetické obrázky SCI digitalizované barevné fotografie (8bitů/pixel) BI digitalizované faxové dokumenty
SWI072 Algoritmy komprese dat24 Implementační poznámky u Problém přetečení –délka souboru (kořen-stromu.váha) –délka nejdelšího kódového slova u Řešení: vynásobím váhy všech vrcholů koeficientem r < 1. Nevýhoda: nutná reorganizace stromu r = 1/2
SWI072 Algoritmy komprese dat25 Reorganizace stromu u Je třeba znovu postavit celý strom ?