Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

1.3.2001SWI072 Algoritmy komprese dat1 Algoritmy komprese dat Adaptivní Huffmanův kód.

Podobné prezentace


Prezentace na téma: "1.3.2001SWI072 Algoritmy komprese dat1 Algoritmy komprese dat Adaptivní Huffmanův kód."— Transkript prezentace:

1 1.3.2001SWI072 Algoritmy komprese dat1 Algoritmy komprese dat Adaptivní Huffmanův kód

2 1.3.2001SWI072 Algoritmy komprese dat2 Statické  adaptivní metody u statický model model kodér dekodér model zdroj

3 1.3.2001SWI072 Algoritmy komprese dat3 Statické  adaptivní metody u adaptivní model model kodér dekodér model zdroj aktualizace modelu aktualizace modelu

4 1.3.2001SWI072 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.

5 1.3.2001SWI072 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.

6 3 c:2 d:2 4 7 8 15 a:1 b:2

7 3 c:2 d:2 4 7 8 15 a:1 b:2 1 2 3 4 5 6 7 8 9 načti znak ´a´

8 3 c:2 d:2 4 7 8 15 a:2 b:2 1 2 3 4 5 6 7 8 9

9 4 c:2 d:2 4 8 8 16 a:2 b:2 1 2 3 4 5 6 7 8 9 načti znak ´a´

10 4 c:2 d:2 4 8 8 16 a:3 b:2 1 2 3 4 5 6 7 8 9

11 4 c:2 a:3 4 8 8 16 d:2 b:2 1 2 3 4 5 6 7 8 9

12 4 c:2 a:3 5 8 8 16 d:2 b:2 1 2 3 4 5 6 7 8 9

13 4 c:2 a:3 5 9 8 16 d:2 b:2 1 2 3 4 5 6 7 8 9

14 8 16 6 4 c:2 a:3 5 9 d:2 b:2 1 2 3 4 5 7 8 9

15 8 17 6 4 c:2 a:3 5 9 d:2 b:2 1 2 3 4 5 7 8 9

16 1.3.2001SWI072 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.

17 1.3.2001SWI072 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

18 1.3.2001SWI072 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.

19 1.3.2001SWI072 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.

20 1.3.2001SWI072 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.

21 1.3.2001SWI072 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.

22 1.3.2001SWI072 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),163-180. J.S.Vitter: Design and analysis of dynamic Huffman codes. J. ACM 34(1987),825-845.

23 1.3.2001SWI072 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 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

24 1.3.2001SWI072 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 6 6 6 12 18 3 3 r = 1/2

25 1.3.2001SWI072 Algoritmy komprese dat25 Reorganizace stromu u Je třeba znovu postavit celý strom 6 6 6 12 18 3 3 3 3 1 1 ? 3 2 3 5 8 11


Stáhnout ppt "1.3.2001SWI072 Algoritmy komprese dat1 Algoritmy komprese dat Adaptivní Huffmanův kód."

Podobné prezentace


Reklamy Google