250 likes | 393 Views
Algoritmy komprese dat. Adaptivní Huffmanův kód. Statické adaptivní metody. statický model. model. model. kodér. zdroj. dekodér. aktualizace modelu. Statické adaptivní metody. adaptivní model. model. kodér. zdroj. model. dekodér. aktualizace modelu.
E N D
Algoritmy komprese dat Adaptivní Huffmanův kód SWI072 Algoritmy komprese dat
Statické adaptivní metody • statický model model model kodér zdroj dekodér SWI072 Algoritmy komprese dat
aktualizace modelu Statické adaptivní metody • adaptivní model model kodér zdroj model dekodér aktualizace modelu SWI072 Algoritmy komprese dat
Adaptivní Huffmanův kód - algoritmus FGK • Faller(1973), Gallagher(1978), Knuth(1985). • AlgoritmusFGK: KódováníInicializuj Huffmanův stromread(znak)while znak¹EOF do zakóduj znak aktualizuj strom read(znak) od . • AlgoritmusFGK: DekódováníInicializuj Huffmanův stromdekóduj(znak)while znak¹EOF do write(znak) aktualizuj strom dekóduj(znak) od . SWI072 Algoritmy komprese dat
Charakterizace Huffmanových stromů • Huffmanův strom - binární strom s ohodnocenými vrcholy. • 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. • Věta(Gallagher): Binární strom s ohodnocenými vrcholy je Huffmanovým stromem právě tehdy, když má sourozeneckou vlastnost. SWI072 Algoritmy komprese dat
15 7 8 4 3 a:1 b:2 c:2 d:2
15 7 8 4 3 a:1 b:2 c:2 d:2 9 • načti znak ´a´ 7 8 6 5 1 2 3 4
15 7 8 4 3 a:2 b:2 c:2 d:2 9 7 8 6 5 1 2 3 4
9 • načti znak ´a´ 16 7 8 8 8 6 4 5 4 a:2 b:2 c:2 d:2 1 2 3 4
9 16 7 8 8 8 6 4 5 4 a:3 b:2 c:2 d:2 1 2 3 4
9 16 7 8 8 8 6 4 5 4 d:2 b:2 c:2 a:3 1 2 3 4
9 16 7 8 8 8 6 5 5 4 d:2 b:2 c:2 a:3 1 2 3 4
9 16 7 8 9 8 6 5 5 4 d:2 b:2 c:2 a:3 1 2 3 4
9 16 8 7 8 9 6 5 5 4 d:2 b:2 c:2 a:3 1 2 3 4
9 17 8 7 8 9 6 5 5 4 d:2 b:2 c:2 a:3 1 2 3 4
Problém nulových četností • Jak kódovat znaky, které jsou načteny poprvé? • 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. • 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 dat
0 esc:0 z:0 esc:0 Problém znaků, které jsou načteny poprvé • Počáteční inicializace Huffmanova stromu esc:0 • z je nově načtený znak, který se ve stromě nevyskytuje • aktualizuj strom SWI072 Algoritmy komprese dat
v k esc:k z:0 esc:k Aktualizace Huffmanova stromu • z je znak načtený na vstupu • if z se ve stromě nevyskytujethen • else v:= list Huffmanova stromu se znakem zfi. SWI072 Algoritmy komprese dat
Aktualizace Huffmanova stromu • if v je sourozenec vrcholu escthen 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 dat
FGK:Kódování • Inicializuj Huffmanův strom (T)repeatread(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 dat
FGK:Dekódování • InicializujHuffmanůvStrom(T); vrchol := kořen-stromu • repeat • while vrchol není list do read(bit)if bit=0 then vrchol := vrchol.levý-synelsevrchol := vrchol.pravý-syn fiod • ifvrchol.znak = ESCthen read(znak) else znak := vrchol.znak fi if znak¹ EOF then zapiš znak na výstupAktualizujStrom(T,znak) fi • until znak= EOF . SWI072 Algoritmy komprese dat
Vitterův algoritmus • J.S.Vitter (1987) • 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.) • Vitter minimalizuje ilia maxili( li = délka i-téhok. s. ) • lA - průměrná délka kódového slova pro algoritmus AlFGK 2lH lV lH+1 • lFGK lH + O(1) (Milidiu, Laber, Pessoa,1999) • D.E.Knuth: Dynamic Huffman Coding. J. Algorithms 6(1985),163-180.J.S.Vitter: Design and analysis of dynamic Huffman codes. J. ACM 34(1987),825-845. SWI072 Algoritmy komprese dat
Další empirické výsledky • E.R.Fiala,D.H.Greene (1989) SC TM NS CC BF SF RCF SNI SCI BI FGK 75.1 62.5 59.5 80.4 75.6 63.7 76.7 41.5 85.0 20.5 V 74.9 62.4 59.5 80.2 75.6 63.7 76.6 41.4 85.0 20.5 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 dat
18 12 6 r = 1/2 3 3 6 6 Implementační poznámky • Problém přetečení • délka souboru (kořen-stromu.váha) • délka nejdelšího kódového slova • Řešení: vynásobím váhy všech vrcholů koeficientem r < 1. • Nevýhoda: nutná reorganizace stromu SWI072 Algoritmy komprese dat
? 18 8 12 5 6 3 3 1 3 1 3 6 2 6 3 3 1 1 Reorganizace stromu • Je třeba znovu postavit celý strom SWI072 Algoritmy komprese dat