Teoria informacji

Transkrypt

Teoria informacji
Teoria informacji - zadania
Michał Kotowski
21 sierpnia 2010
Załóżmy, że chcemy zakodować za pomocą znaków 0 i 1 długi tekst złożony jakichś symboli, np. A, B,
. . . , Z, tak, aby zakodowany tekst był jak najkrótszy. Możemy też myśleć o kompresji pliku tekstowego każdy znak ASCII zajmuje 8 bitów, chcemy wymyślić kodowanie, które zmniejszy liczbę bitów potrzebną
do zapisania tego samego pliku. Intuicyjnie, symbolom najczęściej występującym opłaca się przydzielić jak
najkrótsze słowa kodowe.
Załóżmy, że S = {s1 , . . . , sn } jest skończonym zbiorem symboli i symbol si występuje z prawdopodobieństwem pi . Niech φ będzie dowolnym kodem dla zbioru S.
Definicja 1. Średnią długość kodu φ definiujemy jako:
Lφ (S) =
n
X
pi l(si )
i=1
gdzie l(si ) to długość słowa kodowego odpowiadającego si .
Przez H(S) będziemy oznaczać entropię rozkładu prawdopodobieństwa p1 , . . . , pn .
Zadanie 1. Dla rozkładów prawdopodobieństwa ( 21 , 14 , 14 ) oraz ( 13 , 13 , 13 ) obliczyć ich entropię oraz zaproponować kod o jak najmniejszej średniej długości.
Zadanie 2. Udowodnić, że dla dowolnego kodu zachodzi:
H(S) ¬ L(S)
przy czym równość zachodzi tylko wtedy, gdy kod ma najkrótszą możliwą średnią długość i prawdopodobieństwa
pi są odwrotnościami potęg dwójki.
Zadanie 3. Udowodnić, że zawsze istnieje kod, dla którego:
L(S) < H(S) + 1
Zadanie 4. Niech φ oznacza kod, w którym słowo kodowe odpowiadające si ma długość dlog
dowolny inny kod. Niech s będzie losowym symbolem z S. Udowodnić, że:
P (φ(s) ­ φ0 (s) + c) ¬
1
pi e,
a φ0 -
1
2c−1
Jak znaleźć kod, który zawsze będzie miał najmniejszą średnią długość? Konstrukcja takiego kodu jest
dość prosta i została po raz pierwszy podana przez Davida A. Huffmana.
Algorytm konstrukcji kodu Huffmana jest następujący:
1. Sortujemy prawdopodobieństwa od najmniejszego do największego, p1 ¬ p2 ¬ . . . ¬ pn
2. Bierzemy dwa symbole s1 i s2 o najmniejszych prawdopodobieństwach i tworzymy z nich wierzchołki
drzewa kodowego
1
3. Dołączamy do drzewa nowy wierzchołek, tak, że s1 i s2 są jego synami
4. Usuwamy ze zbioru symboli s1 i s2 , a zamiast nich wprowadzamy nowy symbol o prawdopodobieństwie
p1 + p2 , odpowiadający w drzewie ojcu z poprzedniego kroku
5. Powtarzamy kroki 1-4, dopóki nasz zbiór symboli jest niepusty
6. Z otrzymanego drzewa binarnego, którego lisciami są symbole s1 , . . . , sn , odczytujemy odpowiadające
im słowa kodowe
Zadanie 5. Udowodnić, że kod Huffmana jest optymalny, to znaczy dla dowolnego innego kodu φ zawsze
zachodzi LH (S) ¬ Lφ (S).
Zadanie 6. Załóżmy, że rzeczywisty rozkład prawdopodobieństwa symboli z S to (p1 , . . . , pn ), a my utworzyliśmy kod Huffmana dla rozkładu (q1 , . . . , qn ). O ile gorszy będzie (średnio) utworzony kod od kodu optymalnego?
Zadanie 7. Wskazać wady kodu Huffmana.
Załóżmy, że chcemy tak jak poprzednio skompresować długi tekst, ale zamiast kodować pojedyncze symbole dzielimy cały tekst na bloki długości n, każdy z takich bloków (jest ich |A|n ) traktujemy jako nowy
symbol i tworzymy kod dla tak powstałego zbioru symboli (oznaczmy go przez S n ). Załóżmy, że w oryginalnym tekście prawdopodobieństwo wystąpienia określonego następnego symbolu jest niezależne od żadnego z
poprzednich symboli, które wystąpiły.
Zadanie 8. Udowodnić, że przy powyższych założeniach dla kodu optymalnego zachodzi:
L(S n )
= H(S)
n→∞
n
lim
Zadanie 9. Aby móc rozkodować tekst zakodowany algorytmem Huffmana musimy znać słownik przyporządkowujący symbolom ich słowa kodowe. Zaproponować opis słownika zajmujący łącznie tyle bitów, ile suma
długości zapisów binarnych długości słów kodowych.
Zadanie 10. Rozpatrzmy zbiór symboli S = {a, b, c, d} z rozkładem prawdopodobieństwa ( 21 , 14 , 18 , 18 ) i kodowanie a → 0, b → 01, c → 110, d → 111. Losujemy kolejno symbole z S i kodujemy je, otrzymując nieskończony
ciąg bitów. Niech pN oznacza prawdopodobieństwo, że wybierając losowy bit spośród pierwszych N bitów
trafimy na jedynkę. Znaleźć lim pN .
N →∞
Lekarstwem na niektóre wady kodu Huffmana jest tzw. kodowanie arytmetyczne, powszechnie wykorzystywane w praktyce. Ogólna idea polega na tym, że wiadomość kodować jako rozwinięcie binarne pewnej
liczby rzeczywistej z przedziału [0, 1)].
Załóżmy, że chcemy zakodować wiadomość a1 a2 . . . aN , gdzie każde ai to pewien symbol ze zbioru S.
W pierwszym kroku dzielimy przedział [0, 1)] na przedziały [0, p1 ), [p1 , p1 + p2 ), . . . , [p1 + . . . + pn−1 , 1),
tak, że i-ty przedział odpowiada symbolowi si . Po przeczytaniu pierwszego symbolu a1 przechodzimy do
przedziału odpowiadającego temu symbolowi i powtarzamy procedurę, dzieląc ten przedział na podprzedziały
proporcjonalnie do prawdopodobieństw symboli. Po przeczytaniu całej wiadomości otrzymujemy pewien
przedział [A, B). Wybieramy dowolną liczbę z tego przedziału i zapisujemy jej rozwinięcie binarne - jest ono
szukanym kodem wyjściowej wiadomości.
Zadanie 11. Opisać procedurę dekodowania wiadomości w kodowaniu arytmetycznym. Udowodnić, że przy
N → ∞ liczba bitów przypadająca na jeden symbol dąży do H(S).
Zadanie 12. W jaki sposób można uogólnić kodowanie arytmetyczne na przypadek, gdy poszczególne wystąpienia symboli nie są niezależne? W jaki sposób można użyc kodowania arytmetycznego do generowania
ciągów losowych znaków z dowolnego rozkładu, jeśli umiemy generować bity losowe?
2
Wadą zarówno kodu Huffmana, jak i kodowania arytmetycznego, jest fakt, że musimy z góry znać rozkład
prawdopodobieństwa, z jakim pojawiają się kolejne symbole. W 1977 Abraham Lempel i Jacob Ziv opracowali
algorytm Lempela-Ziva, który umożliwia asymptotycznie optymalną kompresję bez żadnych założeń o
początkowym rozkładzie prawdopodobieństwa. Algorytm ten jest wykorzystywany np. w progamie gzip.
Opiera się on następującym pomyśle: w trakcie czytania ciągu bitów, który mamy zakodować, zapamiętujemy słowa, które nie pojawiły się nigdzie wcześniej, nadając im kolejne numery. Ponieważ każde takie nowe
słowo jest dłuższe o jeden bit o jakiegoś słowa, które już zapamiętaliśmy, wystarczy do jego zakodowania
podać numer zapamiętanego słowa (w zapisie binarnym) oraz wartość ostatniego bitu. Przykładowo, dla
ciągu 1011010100010 w słowniku pojawią się kolejno słowa ε (słowo puste), 1, 0, 11, 01, 010, 00, 10, które
kodujemy jako:
Słowo
Indeks
Zapis binarny indeksu
Kod słowa
ε
0
000
-
1
1
001
0001
0
2
010
0000
11
3
011
0011
01
4
100
0101
010
5
101
1000
00
6
110
0100
10
7
111
0010
Zadanie 13. Opisać sposób dekodowania wiadomości w algorytmie Lempela-Ziva.
Można udowodnić (jest to trochę trudniejsze niż w wypadku wcześniejsych metod kompresji), że przy
długości wiadomości n → ∞ algorytm ten jest optymalny (przy pewnych dość ogólnych założeniach co do
rozkładu prawdopodobieństwa symboli generowaych przez źródło).
3