Algorytmy kodowania entropijnego
Transkrypt
Algorytmy kodowania entropijnego
Algorytmy kodowania entropijnego 1. Kodowanie Shannona-Fano 2. Kodowanie Huffmana Kodowanie entropijne Sformułowanie problemu: Źródło S generuje symbole (litery) ai z alfabetu A Zadany jest model probabilistyczny określający prawdopodobieństwa P(ai) i entropię H źródła Znaleźć kod prefiksowy minimalizujący redundancję R = ∑ l P (a ) − H i i i Historycznie pierwszy taki algorytm – Shannon (Bell Labs), Fano (MIT), 1949 Kodowanie Shannona - Fano 1. 2. 3. 4. 5. Tworzymy listę liter Sortujemy ją wg. malejących częstości wystąpienia (prawdopodobieństw) Dzielimy listę na dwie podlisty, tak by sumy częstości na obu były jak najbliŜsze Wszystkim literom na górnej liście przypisujemy 0, na dolnej 1 Stosujemy rekursywnie krok 3 i 4 dopóki kaŜdy z symboli stanie się liściem w drzewie Przykład: Alfabet {a, b, c, d, e} opisany częstościami: a b c d e 15 7 6 6 5 Kodowanie Shannona-Fano – c.d. {a,b,c,d,c;39} {a,b;22} 15 0 0 a 7 1 b {c,d,e;17} 1 6 0 c {d,e;11} 1 6 0 d Litera Częst. P(ai) H(ai) c (ai) li*p(ai) a 15 0.385 0.530 00 0.770 b 7 0.179 0.444 01 0.358 c 6 0.154 0.416 10 0.308 d 6 0.154 0.416 110 0.462 e 5 0.128 0.380 111 0.384 39 1.000 2.186 2.282 5 1 e R=0.096 = 4.4%H Kody Shannona-Fano – własności Łatwy do zaprogramowania, dość efektywny algorytm Z konstrukcji – kod prefiksowy Kod typu „od góry – do dołu” (od korzenia do liści). Czy jest to kod optymalny (czy dla danego modelu probabilistycznego minimalizuje średnią długość)? Odpowiedź – niekoniecznie!!! Kodowanie Huffmana – algorytm Przepis na konstrukcję drzewa binarnego kodu: 1. 2. 3. 4. 5. Utwórz listę symboli; posortuj wg prawdopodobieństw Utwórz wierzchołki zewn. (liście) odpowiadające wyjściowym symbolom Weź dwa węzły odpowiadające symbolom o najmniejszym prawdopodobieństwie. Przypisz im odpowiednio 0 i 1. Utwórz węzeł reprezentujący ich sumę (z prawdopodobieństwem równym sumie) Dodaj nowo utworzony węzeł do listy węzłów. Usuń z tej listy jego węzły macierzyste Powtarzaj całą procedurę dopóki nie pozostanie tylko jeden węzeł (utoŜsamiony z korzeniem drzewa) Kodowanie Huffmana – przykład 1 0 24 0 13 a,15 0 b,7 1 11 1 c,6 0 d,6 Litera Częst. P(ai) H(ai) c (ai) li*p(ai) a 15 0.385 0.530 1 0.385 b 7 0.179 0.444 000 0.537 c 6 0.154 0.416 001 0.462 d 6 0.154 0.416 010 0.462 e 5 0.128 0.380 011 0.384 39 1.000 2.186 2.230 1 e,5 R=0.044 = 2.0 % H Kody Huffmana – własności Łatwy do zaprogramowania Z konstrukcji – kod prefiksowy Kod typu „od dołu – do góry” (od liści do korzenia) Jest to kod optymalny (dla danego modelu probabilistycznego) Ograniczenia na średnią długość kodu: H(S) ≤ l ≤ H(s) + e gdy pmax > 0.5 e = pmax e = pmax + 0.086 gdy pmax ≤ 0.5 Kodowanie dynamiczne Omawiane wyŜej modele wymagają znajomości modelu probabilistycznego – na ogół nie jest on znany. MoŜliwe wyjście – procedura dwuprzebiegowa. Nawet gdy model znany, to jego przekazanie (zwłaszcza w przypadku modelu wyŜszego rzędu) stanowi dodatkowe obciąŜenie. Wyjście pozbawione powyŜszych wad – kodowanie dynamiczne (adaptacyjne). Kodowanie dynamiczne – zasada Ogólny schemat kodowania dynamicznego: KODER DEKODER Inicjalizuj_model(); Inicjalizuj_model(); while ((a=getchar(input)) != eof) while ((a=dekoduj(input)) != eof) { } { koduj(a,output); putc(a,output); update_model(a); update_model(a); } Koder i dekoder uŜywają tych samych procedur inicjalizuj_model i update_model – to powoduje, Ŝe model ewoluuje tak samo dla nadawcy (kodera) i odbiorcy (dekodera). Kody Huffmana - zastosowania Zwykle w połączeniu z innymi metodami (jako część procedury; np. LZ, JPEG) Kompresja tekstu – typowy stopień kompresji 1 : 1.65 Słabiej nadaje się do bezstratnej kompresji obrazu i dźwięku – osiągany stopień kompresji 1 : 1.7 (gdy kodujemy róŜnice między pikselami lub kolejnymi próbkami dźwięku Kompresja obrazów – kody Huffman Obraz Huffman Huffman róŜnice Dyn. Huff. róŜnice 1_ch 57 504 32 968 32 261 2_ch 61 430 38 541 37 896 Ziemia 40 543 33 880 39 501 Miasto 58 374 52 643 52 321