130 likes | 312 Views
Algoritmy komprese dat. Huffmanův kód. Huffmanův kód . David Huffman (1951) Huffmanův kód je optimální prefixový kód. Situace: Je dána abeceda A a zpráva Z nad touto abecedou. Pro každý znak z Î A známe jeho četnost f(z) = # výskytů znaku z v Z. Pozorování:
E N D
Algoritmy komprese dat Huffmanův kód SWI072 Algoritmy komprese dat
Huffmanův kód • David Huffman (1951) • Huffmanův kód je optimální prefixový kód. • Situace: Je dána abeceda A a zpráva Z nad touto abecedou. Pro každý znak zÎA známe jeho četnost f(z) = # výskytů znaku z v Z. • Pozorování: • pro každý optimální prefixový kód musí mít znaky s větší četnostístejně dlouhá či kratší kódová slova než znaky s menší četností • pro libovolné dva znaky s nejmenšími četnostmi existuje optimální prefixový kód, v němž mají tyto znaky kódová slova o stejné délce SWI072 Algoritmy komprese dat
Příklad f:5 e:9 a:45 d:16 b:13 c:12 SWI072 Algoritmy komprese dat
14 f:5 e:9 Příklad a:45 d:16 b:13 c:12 SWI072 Algoritmy komprese dat
14 f:5 e:9 Příklad a:45 d:16 b:13 c:12 SWI072 Algoritmy komprese dat
14 25 f:5 b:13 e:9 c:12 Příklad d:16 a:45 SWI072 Algoritmy komprese dat
30 d:16 14 f:5 e:9 Příklad a:45 25 b:13 c:12 SWI072 Algoritmy komprese dat
55 30 25 b:13 c:12 d:16 14 f:5 e:9 Příklad a:45 SWI072 Algoritmy komprese dat
30 d:16 14 f:5 e:9 Příklad 100 a:45 55 25 b:13 c:12 SWI072 Algoritmy komprese dat
Konstrukce Huffmanova stromu • Vstup: Množina znaků M, které se vyskytují ve vstupní zprávě, četnost f(z) (f(z) ¹0) pro každý znak zÎM. • Huffman(A) • for i:=1 to n-1 do vytvoř nový vrchol v • x:=levý-syn(v):=ExtractMin(M) • y:=pravý-syn(v):=ExtractMin(M) • f(v):=f(x)+f(y) • Insert(M,v) od • return ExtractMin(M). SWI072 Algoritmy komprese dat
0 1 a 0 1 0 1 b 0 1 0 1 0 1 a b c c 0 1 0 1 d e d e Minimální variace délky kódového slova • Dva různé Huffmanovy stromy pro týž vstup. SWI072 Algoritmy komprese dat
Problémy • Jak provést konstrukci Huffmanova stromu, abychom obdrželi kód s minimální variací? • Jaká je maximální výška Huffmanova stromu pro vstup délky n? • Existuje nějaký optimální prefixový kód, který nelze získat Huffmanovým algoritmem? SWI072 Algoritmy komprese dat
Implemetační poznámky • bitový vstup a výstup • problém přetečení • rekonstrukce kódu při dekompresi SWI072 Algoritmy komprese dat