Kompresja danych – kodowanie Huffmana
Kompresja danych – kodowanie Huffmana
Kompresja danych – kodowanie Huffmana
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Kompresja</strong> <strong>danych</strong> <strong>–</strong><br />
<strong>kodowanie</strong> <strong>Huffmana</strong><br />
Dariusz Sobczuk
Plan wykładu<br />
Kodowanie metodą Shannona-Fano<br />
Kodowanie metodą <strong>Huffmana</strong><br />
Elementarny kod Golomba<br />
Kod Golomba<br />
Kod Rice’a<br />
kompresja <strong>danych</strong> 2
Efektywny kod symboli<br />
Słowa kodowe przyporządkowane są pojedynczym<br />
symbolom i mają różną liczbę bitów (warunek<br />
efektywnego kodu symboli)<br />
Słowa symboli o większym prawdopodobieństwie<br />
wystąpienia na wejściu są krótsze (długość słów<br />
proporcjonalna do il. Informacji związanej z danymi<br />
wydarzeniami)<br />
Kod jest przedrostkowy, czyli jednoznacznie<br />
dekodowalny (można korzystać za struktury drzewa<br />
binarnego)<br />
kompresja <strong>danych</strong> 3
Kodowanie Shannona<strong>–</strong>Fano (1948<strong>–</strong>1949)<br />
Pierwsza propozycja budowy kodu<br />
efektywnego o minimalnej redundancji<br />
Algorytm konstrukcji kodu nie gwarantuje,<br />
że zawsze zostanie uzyskany kod o<br />
minimalnej redundancji<br />
kompresja <strong>danych</strong> 4
Kod Shannona-Fano<br />
1. Określ wagi (il wystąpień) poszczególnych symboli<br />
2. Posortuj listę symboli w nierosnącym porządku<br />
wag, i ustal ją jako grupę początkową<br />
3. Podziel grupę symboli na dwie części o możliwie<br />
równej sumie wag z zachowaniem porządku listy<br />
4. Przyporządkuj symbolom grupy z większą wagą 0,<br />
a symbolom z mniejszą wagą 1<br />
5. Rekursywnie powtórz kroki 3 i 4, aż grupa<br />
początkowa podzielona zostanie na<br />
jednoelementowe grupy<br />
kompresja <strong>danych</strong> 5
Przykład kodowania metodą S-F<br />
Dany alfabet As={a,b,c,d,e} z wagami odpowiednio<br />
w(a)=6, w(b)=12, w(c)=4, w(d)=5, w(e)=4<br />
Posortowanie<br />
b,a,d,c,e wagi 12,6,5,4,4<br />
Pierwszy podział<br />
wagi 12,6 | 5,4,4 kod 0,0,1,1,1<br />
Następne 12 | 6 || 5 | 4,4 kod 00,01,10,11,11<br />
Końcowy kod 00,01,10,110,111<br />
kompresja <strong>danych</strong> 6
Binarne drzewo dla metody S-F<br />
0 1<br />
0 1 0 1<br />
b<br />
a<br />
d<br />
0 1<br />
c<br />
e<br />
kompresja <strong>danych</strong> 7
Efektywność metody S-F<br />
Entropia H dla tego przypadku wynosi<br />
H = 2.176<br />
Średnia bitowa<br />
L = 2.258<br />
Nie jest to wartość optymalna, nawet w tej<br />
klasie koderów<br />
Pomimo to używana jest w takich koderach<br />
jak WinZip, oraz Cabarc firmy Microsoft<br />
kompresja <strong>danych</strong> 8
Optymalne drzewo binarne<br />
kodu symboli<br />
Własności takiego drzewa to:<br />
Liść symbolu o najmniejszej wadze ma najdłuższe<br />
słowo, czyli leży najgłębiej w drzewie<br />
drzewo jest binarne i lokalnie pełne, a więc liść<br />
leżący na najgłębszym poziomie ma brata, którym<br />
jest liść o drugiej w kolejności najmniejszej wadze<br />
Własność tę posiada drzewo <strong>Huffmana</strong>, które<br />
jest optymalne w swojej klasie kodów symboli<br />
kompresja <strong>danych</strong> 9
Kodowanie <strong>Huffmana</strong> (1952)<br />
Shannon opowiada na wykładzie o<br />
problemach związanych z konstrukcją kodu o<br />
minimalnej redundancji<br />
Huffman, student Shannona po niedługim<br />
czasie proponuje właściwe rozwiązanie, dzięki<br />
czemu... zostaje zwolniony ze zdawania<br />
egzaminu<br />
kompresja <strong>danych</strong> 10
Kod <strong>Huffmana</strong> <strong>–</strong> założenia<br />
Symbolom o większym prawdopodobieństwie<br />
wystąpienia odpowiadają kody krótsze niż<br />
symbolom o mniejszym prawdopodobieństwie<br />
wystąpienia<br />
Dwóm najrzadziej występujące symbolom<br />
odpowiadają kody tej samej długości<br />
Niemożliwe skrócenie kodu dla żadnego<br />
symbolu<br />
kompresja <strong>danych</strong> 11
Kod <strong>Huffmana</strong><br />
1. Określ wagi dla symboli, tworząc zbiór wolnych<br />
wierzchołków<br />
2. Sortuj listę wierzchołków wolnych nierosnąco<br />
3. Dwa wolne wierzchołki z najmniejszymi wagami i<br />
połącz z tworzonym węzłem rodzica. Wagę rodzica<br />
ustal jako sumę wag dzieci. Zastąp te wierzchołki<br />
wierzchołkiem rodzica nadając dzieciom etykiety<br />
odpowiednio 0 i 1<br />
4. Powtarzaj krok 3 , aż zostanie wolny korzeń drzewa<br />
5. Odczytaj ze struktury drzewa słowa kodowe liści<br />
kompresja <strong>danych</strong> 12
Przykład drzewa <strong>Huffmana</strong><br />
porównanie<br />
0 1<br />
0 1<br />
12<br />
b<br />
19<br />
0 1 0 1<br />
11<br />
0 1<br />
8<br />
b<br />
a<br />
d<br />
0 1 0 1<br />
6 5 4 4<br />
a<br />
d<br />
c<br />
e<br />
c<br />
0 1<br />
e<br />
Drzewo <strong>Huffmana</strong><br />
Shanona-Fano<br />
kompresja <strong>danych</strong> 13
Kodowanie <strong>Huffmana</strong><br />
porównanie<br />
Weźmy ten sam przykład co dla S-F<br />
Otrzymujemy inne drzewo kodowe<br />
Entropia H dla tego wynosi H = 2.176<br />
Średnia bitowa dla S-F 2.258<br />
Średnia bitowa dla <strong>Huffmana</strong> 2.226<br />
Dla kodowania <strong>Huffmana</strong> jest to<br />
wartość optymalna w klasie koderów<br />
symboli<br />
kompresja <strong>danych</strong> 14
Przykładowy sekwencja<br />
poddawana kompresji<br />
Jakżeż ja się uspokoję <strong>–</strong><br />
Pełne strachu oczy moje,<br />
Pełne grozy myśli moje,<br />
Pełne trwogi serce moje,<br />
Pełne drżenia piersi moje <strong>–</strong><br />
Jakżeż ja się uspokoję...<br />
kompresja <strong>danych</strong> 15
Drzewo <strong>Huffmana</strong><br />
dla badanego tekstu<br />
153<br />
36<br />
65<br />
88<br />
18<br />
29<br />
48<br />
40<br />
8<br />
15<br />
25<br />
20<br />
4<br />
7<br />
12<br />
23<br />
10<br />
2 2 10 3 4 8 14 6 6 13 12 5<br />
1 1 1 1 4 5 5 18 1 2 2 2 4 4 7 7 3 3 3 3 6 7 6 6 11 2 3 5 10 20<br />
d h l ś ł m n e w g t z ę k p s u y , . N i a r o <strong>–</strong> c ż j<br />
W<br />
S<br />
P<br />
kompresja <strong>danych</strong> 16
Kod <strong>Huffmana</strong> dla badanego<br />
tekstu<br />
Symbol L. wyst. Kod Symbol L. wyst. Kod<br />
a 6 10100 p 7 0110<br />
c 3 110001 r 6 10101<br />
d 1 0000000 s 7 0111<br />
e 18 001 ś 1 0000011<br />
ę 4 01010 t 2 010010<br />
g 2 010001 u 3 100000<br />
h 1 0000001 w 1 010000<br />
i 7 10011 y 3 100001<br />
j 10 1101 z 2 010011<br />
k 4 01011 ż 5 11001<br />
l 1 0000010 , 3 100010<br />
ł 4 00001 . 3 100011<br />
m 5 00010 <strong>–</strong> 2 110000<br />
n 5 00011 20 111<br />
o 11 1011 6 10010<br />
kompresja <strong>danych</strong> 17
Kod <strong>Huffmana</strong> <strong>–</strong> cechy<br />
Nieskomplikowany sposób budowy drzewa<br />
<strong>Huffmana</strong><br />
Kod jest optymalny, tzn. nie istnieje sposób<br />
kodowania przyporządkowujący symbolom<br />
kody o innych długościach, dla którego<br />
średnia długość kodu byłaby mniejsza<br />
kompresja <strong>danych</strong> 18
Kod <strong>Huffmana</strong> <strong>–</strong> przykład tekstu<br />
Zastosowanie kodu <strong>Huffmana</strong> dla<br />
testowej wiadomości powoduje<br />
otrzymanie średniej długości kodu na<br />
symbol 4,48 bit (przy entropii 4,45 bit<br />
na symbol)<br />
kompresja <strong>danych</strong> 19
Czy kod <strong>Huffmana</strong><br />
to już koniec?<br />
Kodowanie <strong>Huffmana</strong> jest optymalne w klasie<br />
algorytmów przypisujących symbolom kody<br />
o długości wyrażonej w całkowitej liczbie<br />
bitów<br />
Możliwe jest skonstruowanie kodu, który<br />
średnio będzie przypisywał kody o<br />
długościach będących ułamkami bitów<br />
kompresja <strong>danych</strong> 20
Kod dwójkowy<br />
o prawie stałej długości<br />
W kodzie dwójkowym o prawie stałej wartości B n<br />
’<br />
dla<br />
n-elementowego alfabetu As={a 0 ,...,a n-1 } pierwszym<br />
r symbolom przypisywane są słowa k=[log 2 n] bitowe<br />
postaci B n’ (a i )=B k (i) a pozostałym słowa o długości<br />
(k+1) bitów postaci B n’ (a i )=B k+1 (r+i), r=2 k+1 <strong>–</strong>n<br />
Dla źródeł o alfabecie zawierającym n=2 i , i=1,2,...<br />
symboli B n’ =B i a r=0, kod staje się kodem o stałej<br />
długości<br />
kompresja <strong>danych</strong> 21
Przypomnienie: kod unarny<br />
Symbol<br />
Kod<br />
0 0<br />
1 10<br />
2 110<br />
3 1110<br />
4 11110<br />
5 111110<br />
6 1111110<br />
7 11111110<br />
8 111111110<br />
9 1111111110<br />
10 11111111110<br />
11 111111111110<br />
12 1111111111110<br />
13 11111111111110<br />
14 111111111111110<br />
15 1111111111111110<br />
Symbol<br />
Kod<br />
0 1<br />
1 01<br />
2 001<br />
3 0001<br />
4 00001<br />
5 000001<br />
6 0000001<br />
7 00000001<br />
8 000000001<br />
9 0000000001<br />
10 00000000001<br />
11 000000000001<br />
12 0000000000001<br />
13 00000000000001<br />
14 000000000000001<br />
15 0000000000000001<br />
kompresja <strong>danych</strong> 22
Elementarny kod Golomba<br />
Niech dla parametru m (rząd kodu), EGm oznacza<br />
kod o zmienno-zmiennej wartości zdefiniowany przez<br />
alfabet As={1,01,...,0 i 1,...,0 m-1 1,0 m } (ciąg prawie jak<br />
przy kodowaniu unarnym), gdzie 0 i oznacza ciąg 0 o<br />
długości i. Kod EGm przypisuje rozszerzonemu<br />
symbolowi a m = 0 m wartość ζ m = 0, podczas gdy<br />
symbole a i =0 i 1 są kodowane za pomocą przedrostka<br />
1 z dołączoną reprezentacją i w kodzie dwójkowym<br />
prawie stałej wartości B n’ .<br />
Warto zwrócić uwagę, że kod jest korzystny w<br />
przypadku często pojawiających się wartości 0 m<br />
kompresja <strong>danych</strong> 23
Słowa elementarnego<br />
kodu Golomba<br />
Alfabet<br />
a 0<br />
Bit ciągi alfabetu<br />
dla m=8<br />
Słowa<br />
kodowe<br />
Bit ciągi alfabetu dla<br />
m=9<br />
Słowa<br />
kodowe<br />
1 1000<br />
1 1000<br />
a 1<br />
01 1001<br />
01 1001<br />
a 2<br />
001 1010<br />
001 1010<br />
a 3<br />
0001 1011<br />
0001 1011<br />
a 4<br />
00001 1100<br />
00001 1100<br />
a 5<br />
000001 1101<br />
000001 1101<br />
a 6<br />
0000001 1110<br />
0000001 1110<br />
a 7<br />
0000001 1111<br />
0000001 11110<br />
a 8<br />
0000000<br />
0<br />
00000001 11111<br />
a 9<br />
--<br />
--<br />
00000000<br />
0<br />
kompresja <strong>danych</strong> 24
Kod Golomba<br />
Kod Golomba to kod symboli o nieskończonym<br />
alfabecie źródła z rzędem kodu m oznaczany Gm.<br />
Alfabet , składający się w wersji podstawowej z<br />
kolejnych liczb całkowitych nieujemnych, dzielony<br />
jest na rozłączne przedziały o stałej długości<br />
określonej przez rząd kodu<br />
A S ={(0,1,...,m-1),(m,m+1,...,2m-1),...} lub<br />
A<br />
S<br />
(<br />
= { π<br />
m)<br />
0<br />
(<br />
, π<br />
m)<br />
1<br />
,....}<br />
kompresja <strong>danych</strong> 25
Kod Golomba cd<br />
Formułując słowo kodowe ζ i należy wskazać numer<br />
przedziału u do którego trafia symbol i, a potem<br />
miejsce i od początku tego przedziału d.<br />
Długość przedziału m powinna się korelować z<br />
geometrycznym rozkładem prawdopodobieństwa<br />
źródła (gdzie p i+1 = ρ·p i )<br />
Szybsze opadanie charakterystyki (mniejsze ρ)<br />
wymaga krótszych przedziałów, wolniejsze dłuższych<br />
Odpowiedni dobór wartości m do szacowanej<br />
wartości ρ decyduje o efektywności kodu<br />
kompresja <strong>danych</strong> 26
Kod Golomba cd<br />
Słowo Golomba składa się z dwóch części:<br />
przedrostka będącego numerem przedziału<br />
symbolu zapisanego w kodzie unarnym, o<br />
potencjalnie nieograniczonej liczbie symboli<br />
przyrostka wskazującego odległość od początku<br />
przedziału wyrażoną słowem kodu dwójkowego<br />
prawie stałej długości<br />
Kod Golomba dla m=1 jest kodem unarnym<br />
kompresja <strong>danych</strong> 27
Kod Golomba - różne rzędy<br />
i<br />
m=1<br />
m=2<br />
m=3<br />
0<br />
0<br />
0|0<br />
0|0<br />
1<br />
10<br />
0|1<br />
0|10<br />
2<br />
110<br />
10|0<br />
0|11<br />
3<br />
1110<br />
10|1<br />
10|0<br />
4<br />
11110<br />
110|0<br />
10|10<br />
5<br />
111110<br />
110|1<br />
10|11<br />
6<br />
1111110<br />
1110|0<br />
110|0<br />
7<br />
11111110<br />
1110|1<br />
110|10<br />
8<br />
111111110<br />
11110|0<br />
110|11<br />
..<br />
...<br />
...<br />
...<br />
kompresja <strong>danych</strong> 28
Przykład tworzenia kodu Golomba<br />
Wyznaczymy słowo kodowe dla m=3<br />
oraz i=13<br />
[i/m]=[13/3]=4; U(4)=11110<br />
Przyrostek słowa zapisany w kodzie<br />
dwójkowym prawie stałej długości dla<br />
wartości d= (i mod m) =1; B’(1)=10<br />
Daje to słowo kodowe G(13)=1111010<br />
kompresja <strong>danych</strong> 29
Wyznaczanie rzędu kodu Golomba<br />
Rząd kodu Golomba powinien określać<br />
długość serii powtórzeń bardziej<br />
prawdopodobnych symboli źródła<br />
Warunek Golomba określa rząd jako:<br />
m<br />
⎡ log(1 + ρ)<br />
⎢ log ρ<br />
=<br />
−1<br />
⎤<br />
⎥<br />
kompresja <strong>danych</strong> 30
Kod Rice’a<br />
Szczególny przypadek kodu Golomba,<br />
dla m=2 k nazwany jest kodem Rice’a R k<br />
k mniej znaczących bitów zostaje<br />
zapisana jako przyrostek słowa<br />
kodowego<br />
bardziej znaczące bity po przesunięciu o<br />
k pozycji w prawo zostaje zapisane w<br />
kodzie unarnym<br />
kompresja <strong>danych</strong> 31
Kod Rice’a - różne rzędy<br />
i<br />
k=1<br />
k=2<br />
k=3<br />
0<br />
0|0<br />
0|00<br />
0|000<br />
1<br />
0|1<br />
0|01<br />
0|001<br />
2<br />
10|0<br />
0|10<br />
0|010<br />
3<br />
10|1<br />
0|11<br />
0|011<br />
4<br />
110|0<br />
10|00<br />
0|100<br />
5<br />
110|1<br />
10|01<br />
0|101<br />
6<br />
1110|0<br />
10|10<br />
0|110<br />
7<br />
1110|1<br />
10|11<br />
0|111<br />
8<br />
11110|0<br />
110|00<br />
10|000<br />
..<br />
...<br />
...<br />
...<br />
kompresja <strong>danych</strong> 32
Przykład kodowania Rice’a<br />
Słowo kodu R 2 dla i=6<br />
Dwójkową reprezentację i=110 dzielimy<br />
na dwie części 1|10<br />
Starszą część zapisujemy w postaci<br />
kodu unarnego U(1)=10<br />
Dołączamy przyrostek 10<br />
Otrzymujemy R 2 (6)=1010<br />
kompresja <strong>danych</strong> 33
Kod Rice’a realizacja<br />
Kody Rice’a definiowane są jako dynamiczne kody<br />
Goloba<br />
Źródłowy ciąg dzielony jest na bloki o stałych lub<br />
zmiennych rozmiarach. W każdym bloku ustalony<br />
zostaje najkorzystniejszy kod Rice’a<br />
Do każdego bloku trzeba dołączyć identyfikator<br />
określonej postaci kodu Rice’a<br />
Kod Rice’a z adaptacyjnie dobieraną wartością k dla<br />
każdej kodowanej wartości wykorzystano w<br />
standardzie JPEG-LS<br />
kompresja <strong>danych</strong> 34
Plan następnego wykładu<br />
Kodowanie arytmetyczne<br />
Kodowanie adaptacyjne<br />
Dla kodowania arytmetycznego<br />
Dla kodowania <strong>Huffmana</strong><br />
Porównanie różnych kodowań<br />
adaptacyjnych<br />
kompresja <strong>danych</strong> 35