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