Kodowanie i kompresja 1 Entropia a kody Huffmana: powtórka.
Transkrypt
Kodowanie i kompresja 1 Entropia a kody Huffmana: powtórka.
Kodowanie i kompresja Streszczenie Studia dzienne Wykład 8, 07.04.2005 1 Entropia a kody Huffmana: powtórka. Definicja 1 Entropia źródła danych S o prawdopodobieństwach wyst˛epowania symboli p1 , . . . , pn jest równa H(S) = H(p1 , . . . , pn ) = − n X pi log pi . i=1 Twierdzenie 1 (nierówność Krafta/McMillana) Każdy binarny kod prefiksowy o długościach słów kodowych d1 , . . . , dn spełnia warunek n X 2−di ≤ 1. i=1 Co wi˛ecej, dla każdych dodatnich d1 , . . . , dn spełniajacych ˛ powyższy warunek istnieje kod prefiksowy o długościach słów kodowych d1 , . . . , dn . Twierdzenie 2 Dla każdego kodu jednoznacznego K, średnia długość tego kodu jest nie mniejsza od entropii. Twierdzenie 3 Minimalna entropia źródła danych jest równa 0. Maksymalna entropia źródła danych złożonego z n symboli wynosi log n. Twierdzenie 4 Kody Huffmana daja˛ minimalna˛ średnia˛ długość kodu wśród kodów prefiksowych. Twierdzenie 5 (Shannona) Dla każdego źródła informacji S istnieje kod prefiksowy K spełniajacy ˛ warunek: H(S) ≤ L(K) ≤ H(S) + 1, gdzie L(K) to średnia długość tego kodu dla źródła S. Twierdzenie 6 Niech S (k) b˛edzie źródłem informacji złożonym z k-elementowych cia˛ (k) gów źródła informacji S, gdzie P (b1 . . . bk ) = P (b1 )P (b2 )..P (bk ). Wówczas H(S ) = k · H(S). Wniosek 1 Dla źródła danych S istnieje kod prefiksowy K dla źródła danych S (k) taki, ˛ na symbol alfabetu źródła S jest ≤ H(S) + 1/k. że średnia liczba bitów przypadajaca W szczególności, kodem takim jest kod Huffmana dla alfabetu złożonego z ciagów ˛ kliterowych alfabetu oryginalnego. Przykład 1 Porównanie liczby bitów przypadajacych ˛ na 1 symbol kodu Huffmana dla prawdopodobieństw 0.75 i 0.25. 1 2 Dynamiczne kody Huffmana Rozważamy sytuacj˛e, w której prawdopodobieństwa wyst˛epowania symboli nie sa˛ znane. Wówczas, prawododpodobieństwa wyst˛epowania symboli szacować b˛edziemy na podstawie zakodowanej już cz˛eści tekstu. W efekcie, zmieniać si˛e b˛eda˛ też słowa kodowe. Szacowanie prawodpodobieństw: po przeczytaniu ciagu ˛ o długości n z p wystapieniami ˛ symbolu a, za P (a) przyjmujemy p/n. Podejście naiwne: po przeczytaniu każdego symbolu tworzymy kod Huffmana od nowa. Podejście w kodzie dynamicznym: Zamiast tworzenia kodu od nowa po każdym symbolu tekstu, tworzymy kod na poczatku ˛ i b˛edziemy go modyfikować po każdej przeczytanej literze. Struktura danych reprezentujaca ˛ kod: drzewo kodu z wagami wierzchołków, zdefiniowanymi w nast˛epujacy ˛ sposób: • waga liścia odpowiadajacego ˛ symbolowi a równa jest liczbie wystapień ˛ a; • waga wierzchołka wewn˛etrznego: suma wag liści zawartych w poddrzewie, którego korzeniem jest ten wierzchołek. Wprowadzamy numeracj˛e wierzchołków l(v), która ma spełniać warunki: • jeśli l(u) < l(v), to w(u) < w(v), gdzie w(x) oznacza wag˛e wierzchołka x; • wierzchołki 2j − 1 i 2j maja˛ wspólnego rodzica o numerze wi˛ekszym of 2j. Struktury danych i słowa kodowe na poczatku ˛ działania algorytmu, dla alfabetu rozmiaru a1 , . . . , am : 1. drzewo kodu: złożone z jednego wierzchołka NP (od nieprzesłany) o wadze 0 i numerze 2m − 1; 2. Niech e i r takie, że m = 2e + r i 0 ≤ r < 2e . Literze ai przyporzadkowujemy ˛ kod stały równy: • (e + 1)-bitowej reprezentacji liczby i − 1 gdy 1 ≤ i ≤ 2r • e-bitowej reprezentacji liczby i − r − 1 w przeciwnym przypadku. Blokiem nazywać b˛edziemy zbiór wierzchołków o tej samej wadze. Celem algorytmu jest zachowywanie nast˛epujacych ˛ własności drzewa kodu: • najwi˛ekszy numer ma korzeń, najmniejszy numer ma wierzchołek NP; • pozostałe wierzchołki numerujemy od niższych poziomów do wyżsych, od lewej do prawej. 2 Aktualizacja kodu. Po każdym przeczytanym symbolu s tekstu źródłowego uaktualniane jest drzewo kodu: • Jeśli s pojawił si˛e w tekście po raz pierwszy, wierzchołek NP (o wadze 0 i numerze p) staje si˛e wierzchołkiem wewn˛etrznym, dodajemy dwoje jego potomków: lewy to nowy wierzchołek NP (o wadze 0 i numerze p − 2), prawy, v, etykietowany przez s (waga 0 i numer p − 1). • Dopóki v różny od korzenia drzewa: – Jeśli numer v nie jest najwi˛ekszy w bloku do którego v należy: zamień v z wierzchołkiem w o najwi˛ekszym numerze w bloku (o ile w nie jest rodzicem v). Uwaga: zamieniamy całe poddrzewa. – Zwi˛eksz wag˛e v o 1 – za v przyjmij rodzica v. Kodowanie. Dla kolejnego symbolu s tekstu źródłowego: • jeśli drzewo kodu zawiera słowo kodowe dla s - używamy tego słowa kodowego, • jeśli drzewo kodu nie zawiera słowa kodowego dla s - kod s powstaje jako kod NP i kod stały s. • wykonaj aktualizacj˛e kodu Dekodowanie. 1. Utwórz drzewo kodu złożone z wierzchołka NP 2. Dla kolejnego ciagu ˛ bitów odpowiadajacego ˛ liściowi drzewa kodu: • jeśli liść jest wierzchołkiem NP - odczytaj kolejne e lub e + 1 bitów jako kod stały kodowanego symbolu. • jeśli liść nie jest wierzchołkiem NP - odkodowany symbolo to etykieta liścia. 3. Wykonaj aktualizacj˛e kodu. Efektywność kodów Huffmana: bezstratna kompresja obrazów (średnio 1.5 - lepsze wyniki przy kodowaniu różnic mi˛edzy pikselami); kompresja tekstu (stopień kompresji do 2); kompresja dźwi˛eku (średnio 1.5 - przy kodowaniu różnic). Twierdzenie 7 Kody symboli w każdym kroku dynamicznego kodowania Huffmana odpowiadaja˛ statycznym kodom Huffmana, przy założeniu, że prawdopodobieństwa odpowiadaja˛ wagom podzielonym przez liczb˛e przeczytanych symboli. 3 3 Kody Shannona-Fano 3.1 Kodowanie Shannona P i−1 Niech p1 ≥ . . . ≥ pn to prawdopodobieństwa symboli a1 , . . . , an . Niech Fi = j=1 pj . Kod tworzymy poprzez przyporzadkowanie ˛ symbolowi ai pierwszych li = dlog(1/pi )e bitów (“po przecinku”) w binarnej reprezentacji liczby Fi . Twierdzenie 8 Kod Shannona jest kodem prefiksowym. Średnia długość kodu Shannona jest nie wi˛eksza niż H(p1 , . . . , pn ) + 1. Uzasadnienie: Fi+1 − Fi = pi ≥ 1/(2li ) oraz li+1 ≥ li gwarantuje, że słowa kodowe coraz dłuższe a różnica mi˛edzy kodem ai i kodem aj dla j > i musi wystapić ˛ wśród pierwszych li pozycji. 3.2 Kodowanie Shannona-Fano Niech p1 ≥ . . . ≥ pn to prawdopodobieństwa symboli a1 , . . . , an . Algorytm ShannonFano(p1 , . . . , pn ) • Jeśli n = 1, to kod(a1 ) = 0. Jeśli n = 2, to kod(a1 ) = 0, kod(a2 ) = 1. • Jeśli n > 2: – podziel ciag ˛ {p1 , . . . pn } na dwa podciagi ˛ R = {p1 , . . . , pn1 } i S = {pn1 +1 , . . . , pn } takie, że różnica | n1 X i=1 pi − n X pi | i=n1 +1 jest minimalna. – Rekurencyjnie, znajdź kody ShannonFano dla prawdopodobieństw p1 , . . . , pn1 i pn1 +1 , . . . , pn i odpowiadajacym ˛ im symboli. – Poprzedź kody symboli z S bitem 0, kody symboli z R, bitem 1. Twierdzenie 9 Kod Shannona-Fano jest kodem prefiksowym. 4