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

Podobne dokumenty