Kompresja bezstratna. Entropia. Kod Huffmana Kodowanie i bezpieczeństwo informacji - Wykład 10 29 kwietnia 2013
Teoria informacji Jeśli P(A) jest prawdopodobieństwem wystapienia informacji A to niech i(a) = log 1 P(A) będzie miara tej informacji. = log P(A)
Teoria informacji Jeśli P(A) jest prawdopodobieństwem wystapienia informacji A to niech i(a) = log 1 P(A) będzie miara tej informacji. Jeśli A i B sa niezależne, to i(ab) = log = log P(A) 1 P(AB) = log 1 P(A)P(B) = = log 1 P(A) + log 1 P(B) = i(a) + i(b)
Teoria informacji Jeśli P(A) jest prawdopodobieństwem wystapienia informacji A to niech i(a) = log 1 P(A) będzie miara tej informacji. Jeśli A i B sa niezależne, to i(ab) = log = log P(A) 1 P(AB) = log 1 P(A)P(B) = = log 1 P(A) + log 1 P(B) = i(a) + i(b) Podstawa logarytmu jest 2 a jednostka informacji bit.
Teoria informacji Załóżmy, że mamy zbiór wiadomości A 1,..., A n, które pojawiaja się z prawdopodobieństwami P(A 1 ),..., P(A n ) ( n i=1 P(A i) = 1).
Teoria informacji Załóżmy, że mamy zbiór wiadomości A 1,..., A n, które pojawiaja się z prawdopodobieństwami P(A 1 ),..., P(A n ) ( n i=1 P(A i) = 1). Średnia informacja w tym zbiorze jest określona wzorem n H = P(A i )i(a i ) i=1 Wielkość tę nazywamy entropia.
Teoria informacji Załóżmy, że mamy zbiór wiadomości A 1,..., A n, które pojawiaja się z prawdopodobieństwami P(A 1 ),..., P(A n ) ( n i=1 P(A i) = 1). Średnia informacja w tym zbiorze jest określona wzorem n H = P(A i )i(a i ) i=1 Wielkość tę nazywamy entropia. Kody jednoznacznie dekodowalne w modelu z niezależnymi wystapieniami symboli musza mieć średnia długość co najmniej równa entropii.
Przykład Weźmy ciag 1 2 3 2 3 4 5 4 5 6 7 8 9 8 9 10
Przykład Weźmy ciag 1 2 3 2 3 4 5 4 5 6 7 8 9 8 9 10 P(1) = P(6) = P(7) = P(10) = 1 16, P(2) = P(3) = P(4) = P(5) = P(8) = P(9) = 2 16
Przykład Weźmy ciag 1 2 3 2 3 4 5 4 5 6 7 8 9 8 9 10 P(1) = P(6) = P(7) = P(10) = 1, 16 P(2) = P(3) = P(4) = P(5) = P(8) = P(9) = 2 16 H = 10 i=1 P(i) log P(i) = 3, 25
Przykład Weźmy ciag 1 2 3 2 3 4 5 4 5 6 7 8 9 8 9 10 P(1) = P(6) = P(7) = P(10) = 1, 16 P(2) = P(3) = P(4) = P(5) = P(8) = P(9) = 2 16 H = 10 i=1 P(i) log P(i) = 3, 25 Najlepszy schemat kodujacy ten ciag wymaga 3,25 bitu na znak.
Przykład Weźmy ciag 1 2 3 2 3 4 5 4 5 6 7 8 9 8 9 10 P(1) = P(6) = P(7) = P(10) = 1, 16 P(2) = P(3) = P(4) = P(5) = P(8) = P(9) = 2 16 H = 10 i=1 P(i) log P(i) = 3, 25 Najlepszy schemat kodujacy ten ciag wymaga 3,25 bitu na znak. Jeśli jednak założymy, że elementy ciagu nie sa niezależne i zastapimy ciag różnicami to otrzymamy 1 1 1-1 1 1 1-1 1 1 1 1 1-1 1 1
Przykład Weźmy ciag 1 2 1 2 3 3 3 3 1 2 3 3 3 3 1 2 3 3 1 2
Przykład Weźmy ciag 1 2 1 2 3 3 3 3 1 2 3 3 3 3 1 2 3 3 1 2 Prawdopodobieństwa wynosza: P(1) = P(2) = 1 4 i P(3) = 1. 2
Przykład Weźmy ciag 1 2 1 2 3 3 3 3 1 2 3 3 3 3 1 2 3 3 1 2 Prawdopodobieństwa wynosza: P(1) = P(2) = 1 4 i P(3) = 1. 2 Entropia jest równa 1,5 bitu na znak.
Przykład Weźmy ciag 1 2 1 2 3 3 3 3 1 2 3 3 3 3 1 2 3 3 1 2 Prawdopodobieństwa wynosza: P(1) = P(2) = 1 4 i P(3) = 1. 2 Entropia jest równa 1,5 bitu na znak. Jeśli jednak weźmiemy bloki złożone z dwóch znaków to P(12) = 1 i P(33) = 1 czyli entropia jest 2 2 równa 1 bit na parę (0,5 bitu na znak).
Test na jednoznaczna dekodowalność Kod a jest prefiksem kodu b jeśli b jest postaci ax. x nazywamy sufiksem b względem a.
Test na jednoznaczna dekodowalność Kod a jest prefiksem kodu b jeśli b jest postaci ax. x nazywamy sufiksem b względem a. Algorytm Tworzymy listę słów kodowych. Dla każdej pary sprawdzamy czy jedno słowo jest prefiksem drugiego, jeśli tak to do listy dodajemy sufiks drugiego słowa (chyba, że już dodaliśmy taki sufiks). Powtarzamy powyższa procedurę aż do momentu kiedy znajdziemy na liście sufiks równy słowu kodowemu (kod nie jest jednoznaczny) albo nie można znaleźć nowych sufiksów (kod jest jednoznaczny).
Przykład Weźmy kod {0, 01, 11}.
Przykład Weźmy kod {0, 01, 11}. Kod 0 jest prefiksem 01. Innych par nie ma więc nowa lista ma postać {0, 01, 11, 1}.
Przykład Weźmy kod {0, 01, 11}. Kod 0 jest prefiksem 01. Innych par nie ma więc nowa lista ma postać {0, 01, 11, 1}. Teraz dla tej listy mamy 0 jako prefiks 01 i 1 jako prefiks 11, ale sufiks 1 już dopisaliśmy do listy więc lista się nie zmienia.
Przykład Weźmy kod {0, 01, 11}. Kod 0 jest prefiksem 01. Innych par nie ma więc nowa lista ma postać {0, 01, 11, 1}. Teraz dla tej listy mamy 0 jako prefiks 01 i 1 jako prefiks 11, ale sufiks 1 już dopisaliśmy do listy więc lista się nie zmienia. Kod jest więc jednoznacznie dekodowalny.
Przykład Weźmy kod {0, 01, 10}.
Przykład Weźmy kod {0, 01, 10}. Kod 0 jest prefiksem 01. Innych par nie ma więc nowa lista ma postać {0, 01, 10, 1}.
Przykład Weźmy kod {0, 01, 10}. Kod 0 jest prefiksem 01. Innych par nie ma więc nowa lista ma postać {0, 01, 10, 1}. Teraz dla tej listy mamy 0 jako prefiks 01 ale on już jest na liście oraz 1 jako prefiks 10 ale sufiks 0 jest równy kodowi 0.
Przykład Weźmy kod {0, 01, 10}. Kod 0 jest prefiksem 01. Innych par nie ma więc nowa lista ma postać {0, 01, 10, 1}. Teraz dla tej listy mamy 0 jako prefiks 01 ale on już jest na liście oraz 1 jako prefiks 10 ale sufiks 0 jest równy kodowi 0. Kod nie jest więc jednoznacznie dekodowalny.
Kody prefiksowe Kod w którym żadne słowo kodowe nie jest prefiksem innego słowa kodowego.
Kody prefiksowe Kod w którym żadne słowo kodowe nie jest prefiksem innego słowa kodowego. Łatwo zauważyć, że kod prefiksowy jest jednoznacznie dekodowalny.
Nierówność Krafta-McMillana Niech C będzie kodem składajacym się z N słów o długościach l 1, l 2,..., l N. Jeżeli C jest jednoznacznie dekodowalny to K (C) = N 1 2 l i i=1 1.
Kody Shannon-Fano Niech symbole a i występuja odpowiednio z prawdopodobieństwami p i.
Kody Shannon-Fano Niech symbole a i występuja odpowiednio z prawdopodobieństwami p i. Weźmy długości kodów l i = log p i.
Kody Shannon-Fano Niech symbole a i występuja odpowiednio z prawdopodobieństwami p i. Weźmy długości kodów l i = log p i. Długości l i spełniaja nierówność Krafta-McMillana. N 1 2 l i i=1 N 1 2 log p i i=1 = N p i = 1 i=1
Kody Shannon-Fano Niech symbole a i występuja odpowiednio z prawdopodobieństwami p i. Weźmy długości kodów l i = log p i. Długości l i spełniaja nierówność Krafta-McMillana. N 1 2 l i i=1 N 1 2 log p i i=1 = N p i = 1 i=1 Istnieje więc kod prefiksowy o takich długościach.
Kody Shannon-Fano Niech symbole a i występuja odpowiednio z prawdopodobieństwami p i. Weźmy długości kodów l i = log p i. Długości l i spełniaja nierówność Krafta-McMillana. N 1 2 l i i=1 N 1 2 log p i i=1 = N p i = 1 i=1 Istnieje więc kod prefiksowy o takich długościach. Łatwo zauważyć, że średnia długość tego kodu jest nie większa niż entropia plus 1.
Konstrukcja kodu o podanych długościach Niech l 1 l 2... l N.
Konstrukcja kodu o podanych długościach Niech l 1 l 2... l N. Definiujemy pomocnicze w 1, w 2,..., w N jako j 1 w 1 = 0 w j = i=1 2 l j l i
Konstrukcja kodu o podanych długościach Niech l 1 l 2... l N. Definiujemy pomocnicze w 1, w 2,..., w N jako j 1 w 1 = 0 w j = i=1 2 l j l i Binarna reprezentacja w j dla j > 1 zajmuje log w j bitów.
Konstrukcja kodu o podanych długościach Niech l 1 l 2... l N. Definiujemy pomocnicze w 1, w 2,..., w N jako j 1 w 1 = 0 w j = i=1 2 l j l i Binarna reprezentacja w j dla j > 1 zajmuje log w j bitów. Liczba bitów w j jest mniejsza lub równa l j. Dla w 1 to oczywiste. [ j 1 ] [ ] j 1 log w j = log 2 l j l i = log 2 l j 2 l i = = l j + log i=1 [ j 1 2 l i i=1 ] l j i=1
Konstrukcja kodu o podanych długościach Kodowanie wyglada następujaco: Jeżeli log w j = l j to j-te słowo kodowe jest binarna reprezentacja w j. Jeżeli jest mniejsze to reprezentację w j uzupełniamy odpowiednia liczba zer z lewej strony.
Konstrukcja kodu o podanych długościach Czy to jest kod prefiksowy? Załóżmy, że c j jest prefiksem c k i j < k. Wtedy l j pierwszych bitów c k tworzy c j czyli w j = w k 2 l k l j
Konstrukcja kodu o podanych długościach Czy to jest kod prefiksowy? Załóżmy, że c j jest prefiksem c k i j < k. Wtedy l j pierwszych bitów c k tworzy c j czyli w j = Ale w k = k 1 i=1 2l k l i. w k 2 l k l j
Konstrukcja kodu o podanych długościach Czy to jest kod prefiksowy? Załóżmy, że c j jest prefiksem c k i j < k. Wtedy l j pierwszych bitów c k tworzy c j czyli w j = Ale w k = k 1 i=1 2l k l i. Czyli w k 2 l k l j = w k 2 l k l j k 1 k 1 2 l j l i = w j + 2 l j l i = i=1 = w j + 2 0 + k 1 i=j+1 i=j 2 l j l i w j + 1
Konstrukcja kodu o podanych długościach Czy to jest kod prefiksowy? Załóżmy, że c j jest prefiksem c k i j < k. Wtedy l j pierwszych bitów c k tworzy c j czyli w j = Ale w k = k 1 i=1 2l k l i. Czyli w k 2 l k l j = w k 2 l k l j k 1 k 1 2 l j l i = w j + 2 l j l i = i=1 = w j + 2 0 + k 1 i=j+1 i=j 2 l j l i w j + 1 Sprzeczne z założeniem, że c j jest prefiksem c k.
Przykład Weźmy a, b, c, d z prawdopodobieństwami 1 3, 1 4, 1 4, 1 6.
Przykład Weźmy a, b, c, d z prawdopodobieństwami 1 3, 1 4, 1 4, 1 6. Odpowiednio długości kodów Shannon-Fano wynosza 2, 2, 2, 3.
Przykład Weźmy a, b, c, d z prawdopodobieństwami 1 3, 1 4, 1 4, 1 6. Odpowiednio długości kodów Shannon-Fano wynosza 2, 2, 2, 3. Wyliczamy w a = 0, w b = 1, w c = 2, w d = 6.
Przykład Weźmy a, b, c, d z prawdopodobieństwami 1 3, 1 4, 1 4, 1 6. Odpowiednio długości kodów Shannon-Fano wynosza 2, 2, 2, 3. Wyliczamy w a = 0, w b = 1, w c = 2, w d = 6. Kody to odpowiednio kod(a) = 00, kod(b) = 01, kod(c) = 10, kod(d) = 110.
Własności optymalnych kodów prefiksowych Symbolom występujacym częściej odpowiadaja krótsze słowa kodowe.
Własności optymalnych kodów prefiksowych Symbolom występujacym częściej odpowiadaja krótsze słowa kodowe. Dwa najrzadziej występujace symbole maja w kodzie optymalnym słowa kodowe tej samej długości.
Konstruowanie kodów Huffmana Kody dwóch najrzadziej występujacych symboli różnia się tylko na ostatniej pozycji.
Konstruowanie kodów Huffmana Kody dwóch najrzadziej występujacych symboli różnia się tylko na ostatniej pozycji. Algorytm rekurencyjny: rozważ dwa najrzadziej występujace symbole rozróżniajac je na końcu przez 0 i 1. Połacz oba w jeden symbol pomocniczy i rozważ teraz rekurencyjnie mniejszy alfabet. Powtarzaj aż zostanie tylko jeden symbol.
Własności kodów Huffmana Kod Huffmana jako drzewo - tworzenie takiego drzewa jako algorytm tworzenia kodów Huffmana.
Własności kodów Huffmana Kod Huffmana jako drzewo - tworzenie takiego drzewa jako algorytm tworzenia kodów Huffmana. Niejednoznaczność tworzenia kodów - istnieje często wiele kodów dla jednego źródła danych (ale wszystkie maja ta sama średnia długość kodu).
Optymalność kodów Huffmana Optymalny kod powinien spełniać następujace warunki: Dla każdych dwóch liter a i b takich, że P(a) P(b) zachodzi l b l a.
Optymalność kodów Huffmana Optymalny kod powinien spełniać następujace warunki: Dla każdych dwóch liter a i b takich, że P(a) P(b) zachodzi l b l a. Dwie litery o najmniejszych prawdopodobieństwach maja słowa kodowe o tej samej, maksymalnej długości.
Optymalność kodów Huffmana Optymalny kod powinien spełniać następujace warunki: Dla każdych dwóch liter a i b takich, że P(a) P(b) zachodzi l b l a. Dwie litery o najmniejszych prawdopodobieństwach maja słowa kodowe o tej samej, maksymalnej długości. Z każdego wierzchołka wewnętrznego drzewa odpowiadajacego kodowi optymalnemu powinny wychodzić oba poddrzewa.
Optymalność kodów Huffmana Optymalny kod powinien spełniać następujace warunki: Dla każdych dwóch liter a i b takich, że P(a) P(b) zachodzi l b l a. Dwie litery o najmniejszych prawdopodobieństwach maja słowa kodowe o tej samej, maksymalnej długości. Z każdego wierzchołka wewnętrznego drzewa odpowiadajacego kodowi optymalnemu powinny wychodzić oba poddrzewa. Jeśli połaczymy dwa liście majace wspólnego ojca i ten wierzchołek wewnętrzny potraktujemy jako liść to uzyskane drzewo jest kodem optymalnym dla nowego alfabetu jeśli pierwotne drzewo było optymalne.
Długość kodów Huffmana Dla źródła S spełniona jest nierówność H(S) l H(S) + 1 gdzie l - średnia długość kodu Huffmana dla źródła S.
Dynamiczne kody Huffmana Aby wykonać kodowanie Huffmana musimy znać prawdopodobieństwa (częstość występowania) liter.
Dynamiczne kody Huffmana Aby wykonać kodowanie Huffmana musimy znać prawdopodobieństwa (częstość występowania) liter. Co zrobić gdy dane napływaja na bieżaco i nie znamy statystyk?
Dynamiczne kody Huffmana Aby wykonać kodowanie Huffmana musimy znać prawdopodobieństwa (częstość występowania) liter. Co zrobić gdy dane napływaja na bieżaco i nie znamy statystyk? Kodować k + 1 symbol na podstawie statystyk k symboli.
Przygotowania Dla alfabetu wejściowego mamy kodowanie stałej długości (pomocnicze).
Przygotowania Dla alfabetu wejściowego mamy kodowanie stałej długości (pomocnicze). Dla kodu Huffmana tworzymy na bieżaco jego drzewo o następujacych własnościach:
Przygotowania Dla alfabetu wejściowego mamy kodowanie stałej długości (pomocnicze). Dla kodu Huffmana tworzymy na bieżaco jego drzewo o następujacych własnościach: Każdy liść odpowiada symbolowi i zawiera wagę - ilość dotychczasowych wystapień.
Przygotowania Dla alfabetu wejściowego mamy kodowanie stałej długości (pomocnicze). Dla kodu Huffmana tworzymy na bieżaco jego drzewo o następujacych własnościach: Każdy liść odpowiada symbolowi i zawiera wagę - ilość dotychczasowych wystapień. Wierzchołki wewnętrzne maja wagę będac a suma wag liści z poddrzew.
Przygotowania Dla alfabetu wejściowego mamy kodowanie stałej długości (pomocnicze). Dla kodu Huffmana tworzymy na bieżaco jego drzewo o następujacych własnościach: Każdy liść odpowiada symbolowi i zawiera wagę - ilość dotychczasowych wystapień. Wierzchołki wewnętrzne maja wagę będac a suma wag liści z poddrzew. Każdy wierzchołek drzewa ma unikalny numer x i. Numery te tworza porzadek zgodny z wagami wierzchołków (większa waga to większy numer wierzchołka). Dodatkowo rodzeństwo ma zawsze dwa kolejne numery.
Przygotowania Dla alfabetu wejściowego mamy kodowanie stałej długości (pomocnicze). Dla kodu Huffmana tworzymy na bieżaco jego drzewo o następujacych własnościach: Każdy liść odpowiada symbolowi i zawiera wagę - ilość dotychczasowych wystapień. Wierzchołki wewnętrzne maja wagę będac a suma wag liści z poddrzew. Każdy wierzchołek drzewa ma unikalny numer x i. Numery te tworza porzadek zgodny z wagami wierzchołków (większa waga to większy numer wierzchołka). Dodatkowo rodzeństwo ma zawsze dwa kolejne numery. Na poczatku drzewo zawiera jeden wierzchołek o wadze 0 i etykiecie NYT oznaczajacej że symbol nie był jeszcze przesyłany.
Opis algorytmu Pierwsze wystapienie symbolu a Wyślij kod NYT i kod stałej długości dla nowego symbolu.
Opis algorytmu Pierwsze wystapienie symbolu a Wyślij kod NYT i kod stałej długości dla nowego symbolu. Stary NYT podziel na dwa wierzchołki potomne - nowy NYT i liść a, nadaj a wagę 1. Nadaj im odpowiednie numery.
Opis algorytmu Pierwsze wystapienie symbolu a Wyślij kod NYT i kod stałej długości dla nowego symbolu. Stary NYT podziel na dwa wierzchołki potomne - nowy NYT i liść a, nadaj a wagę 1. Nadaj im odpowiednie numery. Zmodyfikuj drzewo dodajac 1 do wierzchołków wewnętrznych na ścieżce od a do korzenia i przebudowujac drzewo tak aby było zgodne z warunkami z poprzedniego slajdu.
Opis algorytmu Kolejne wystapienie symbolu a Znajdź liść a i wyślij odpowiadajacy mu kod.
Opis algorytmu Kolejne wystapienie symbolu a Znajdź liść a i wyślij odpowiadajacy mu kod. Zwiększ wagę a o 1.
Opis algorytmu Kolejne wystapienie symbolu a Znajdź liść a i wyślij odpowiadajacy mu kod. Zwiększ wagę a o 1. Zmodyfikuj drzewo dodajac 1 do wierzchołków wewnętrznych na ścieżce od a do korzenia i przebudowujac drzewo tak aby było zgodne z warunkami z poprzedniego slajdu.
Modyfikacja drzewa Zbiór wierzchołków o tej samej wadze nazywamy blokiem.
Modyfikacja drzewa Zbiór wierzchołków o tej samej wadze nazywamy blokiem. Jeśli pierwszy wierzchołek od dołu nie ma największego numeru w swoim bloku to zamieniamy go z tym o największym numerze odpowiednio przebudowujac drzewo z zachowaniem własności. Następnie aktualizujemy wagę i patrzymy dalej rekurencyjnie.
Modyfikacja drzewa Zbiór wierzchołków o tej samej wadze nazywamy blokiem. Jeśli pierwszy wierzchołek od dołu nie ma największego numeru w swoim bloku to zamieniamy go z tym o największym numerze odpowiednio przebudowujac drzewo z zachowaniem własności. Następnie aktualizujemy wagę i patrzymy dalej rekurencyjnie. Kończymy jak dojdziemy do korzenia.
Przykład http://mgc.im.pwr.wroc.pl/dypl/tol/
Przykład http://mgc.im.pwr.wroc.pl/dypl/tol/ Mamy cztery litery z 26. (W drzewie maksymalnie 51 wierzchołków.) a d r v 00001 00100 10010 10110
Przykład http://mgc.im.pwr.wroc.pl/dypl/tol/ Mamy cztery litery z 26. (W drzewie maksymalnie 51 wierzchołków.) a d r v 00001 00100 10010 10110 Drzewo poczatkowo wyglada tak
Przykład Pojawia się litera a.
Przykład Pojawia się litera a. Wysyłamy kod NYT (ε) i stały kod a: 00001.
Przykład Pojawia się litera a. Wysyłamy kod NYT (ε) i stały kod a: 00001. Modyfikujemy drzewo:
Przykład Pojawia się druga litera a.
Przykład Pojawia się druga litera a. Wysyłamy kod a: 1 (z drzewa lewe krawędzie to 0 a prawe to 1).
Przykład Pojawia się druga litera a. Wysyłamy kod a: 1 (z drzewa lewe krawędzie to 0 a prawe to 1). Modyfikujemy drzewo:
Przykład Pojawia się litera r.
Przykład Pojawia się litera r. Wysyłamy kod NYT (0) i stały kod r: 010010.
Przykład Pojawia się litera r. Wysyłamy kod NYT (0) i stały kod r: 010010. Modyfikujemy drzewo:
Przykład Pojawia się litera d.
Przykład Pojawia się litera d. Wysyłamy kod NYT (00) i stały kod d: 0000100.
Przykład Pojawia się litera d. Wysyłamy kod NYT (00) i stały kod d: 0000100. Modyfikujemy drzewo:
Przykład Pojawia się litera v.
Przykład Pojawia się litera v. Wysyłamy kod NYT (000) i stały kod v: 0010110.
Przykład Modyfikujemy drzewo:
Przykład Modyfikujemy drzewo:
Podsumowanie - własności Optymalność wśród kodów prefiksowych.
Podsumowanie - własności Optymalność wśród kodów prefiksowych. Kodowanie i dekodowanie w czasie liniowym (szybkie).
Podsumowanie - własności Optymalność wśród kodów prefiksowych. Kodowanie i dekodowanie w czasie liniowym (szybkie). Kody rozszerzone - kompromis między optymalnościa a wielkościa systemu.
Podsumowanie - własności Optymalność wśród kodów prefiksowych. Kodowanie i dekodowanie w czasie liniowym (szybkie). Kody rozszerzone - kompromis między optymalnościa a wielkościa systemu. Możliwość implementacji dynamicznej.
Podsumowanie - własności Optymalność wśród kodów prefiksowych. Kodowanie i dekodowanie w czasie liniowym (szybkie). Kody rozszerzone - kompromis między optymalnościa a wielkościa systemu. Możliwość implementacji dynamicznej. Zastosowanie: pkzip, lha, gzip, zoo, arj, fragmenty formatów JPEG i MPEG.