370 likes | 512 Views
Kompresja danych. Instytut Informatyki UWr Studia dzienne Wykład nr 3: kody Golomba, kody Tunstalla. Kodowanie długości serii (RLE=run length encoding). Przykłady ciągów binarnych z dużą przewagą zer: faksy (tekst drukowany) grafika (monochromatyczna, nie tylko) Kodowanie długości serii:
E N D
Kompresja danych Instytut Informatyki UWr Studia dzienne Wykład nr 3: kody Golomba, kody Tunstalla
Kodowanie długości serii (RLE=run length encoding) • Przykłady ciągów binarnych z dużą przewagą zer: • faksy (tekst drukowany) • grafika (monochromatyczna, nie tylko) • Kodowanie długości serii: Dla danych postaci 0000000100000000100100000000001000... kodujemy długości kolejnych ciągów zer: 78210 17...
Kodowanie długości serii c.d. Problemy: • jak kodować liczby oznaczające długości serii aby uzyskać maksymalną kompresję? • Jaki rozkład prawdopodobieństwa? • alfabet wejściowy potencjalnie nieskończony (dowolnie długie ciągi zer...)
RLE: rozkład prawdopodobieństwa Ciąg wartości niezależnych: • P(0)=p • P(1)=1-p Wtedy: P( 0n1 ) = pn ( 1-p ) Kiedy długie serie: pbliskie jedynki
Kod Golomba rzędu m Kodowanie liczbyn: • Niech n = q m + r dla 0 r m. (inaczej: q to wyni, a r reszta z dzielenia n przez m) • Kod liczby n składa się z 2 części: • unarnego kodowania q: 1q0 • Kody stałe liczby r o długościach log m i logm, symetrycznie odbite kody stałe w dynamicznym kodowaniu Huffmana (kod prefiksowy!) UWAGA: nieskończony zbiór słów kodowych!
Kod Golomba: własności: • nieskończony zbiór słów kodowych! • kod prefiksowy (p n): • i = n / m p / m = j : 1i0 1j0 • n / m p / m : różne reszty z dzielenia (resztom odpowiada kod prefiksowy)
Kod Golomba: przykład Niech m = 5, wtedy reszty r kodujemy wg tabeli:
Kod Golomba: przykład Dla danych postaci 0000000100000000100100000000001000... kodujemy długości kolejnych ciągów zer: 78210 12... (razem 8 + 9 + 3 + 11+ 18 = 49 bitów): 10 1010 110 0 10 110 00110 10 ( 4 + 5 + 3 +5 + 5 = 22 bity)
Kod Golomba: przykład c.d. Zakodujmy teraz dane 78210 12... (49 bitów) używając kodu rzędu 10: 0 11010 1110 0 010 10 00010 010 ( 5 + 5 + 4 +5 + 5 = 24 bity) Ale dla m=256 mielibyśmy (co najm.): 9 + 9 + 9 + 9 + 9 = 45 bitów
Kod Golomba: parametry W ciągu wartości niezależnych (P(0)=p) mamy: P( 0n1 ) = pn(1 - p) Czyli w ciągu liczb odpowiadających długościom serii: P( n ) = pn(1 - p) Pytania: • Czy kod Golomba może być przy takim rozkładzie optymalny? • Jeśli tak: jak dobrać wartość m?
Kod Golomba: optymalność Warunek konieczny optymalności: • Wierzchołki o większych wagach (prawdopodobieństwach) wyżej niż te o mniejszych wagach Dla uproszczenia, niech m=2k dla naturalnej k: • kody odpowiadające liczbom qm, qm+1,…,qm+m-1 to liście na poziomie (q+1) + log m
Kod Golomba: optymalność c.d. Rozważmy liście położone najwyżej (1+log m): • Prawdopodobieństwa: (1-p), (1-p)p1,…, (1-p)pm-1 • Suma wag 2 liści xm-1, xm o najmniejszych wagach powinna być większa od wagi liścia x1 o największej wadze: (1-p) pm-1+ (1-p) pm-2 (1-p) pm-1+ pm-2 1
Kod Golomba: optymalność c.d. Chcemy podpinać liście jak najwyżej: • Prawdopodobieństwa liści na poziomie 2+logn: (1-p)pm, (1-p) pm+1,…, (1-p)p2m-1 • Aby nie było możliwe umieszczenie ich wyżej, suma wag 2 liści xm, xm-1o największych wagach powinna być mniejsza od wagi liścia x1 o największej wadze (na poziomie 1+logn): (1-p) pm+ (1-p) pm+1< (1-p) pm+ pm+1 < 1
Kod Golomba: optymalność c.d. Warunki konieczne optymalności: pm+ pm+1< 1 pm-1+ pm-2 Po przekształceniach: pm < 1/(1+p) pm-2 m - log(1+p) / log p > m-2 w przybliżeniu m - 1 / log p > m-2
Kod Golomba: optymalność c.d. Okazuje się, że powyższe warunki konieczne dobrze przybliżają warunki wystarczające... Tw. [Gallager, van Voorhis 75] Kod Golomba rzędu m jest optymalnym kodem prefiksowym dla ciągów losowych liczb naturalnych o rozkładzie P(i)=(1-p)pi-1, gdy m = - log(1+p) / log p w przybliżeniu (dla p bliskiego 1): m = - 1 / log p
Kod Golomba: inna interpretacja Możemy kod Golomba potraktować jako kod przekształcający ciągi o różnych długościach w ciągi o różnych długościach: gdzie K(i) to kod stały i dla reszt z dzielenia przez m.
Inna interpretacja: przykład m=5 Kodujemy 00000001 000000001 001 00000000001000... jako 1 0101 01100101 1 000
Kod Golomba: jak liczyć śr. długość (bps) Teraz kodujemy ciągi zer i jedynek (nie liczby oznaczające ich długości!). Liczba bitów przypadająca na jeden symbol danych wejściowych: S(K) = sr(output) / sr(input) gdzie • sr(output) i sr(output) to średnia długość ciągu wejściowego / wyjściowego (ważona wg prawdopodobieństw) ta definicja jednak ma sens!!!
Kod Golomba: średnia długość (bps) Przykład: m=5 sr(input)= 6 * p1 + 5 * p2 + 4 * p3 + 3 * p4 + 2 * p5 + 1 * p6 sr(output)= 1 * p1 + 4 * p2 + 4 * p3 + 3 * p4 + 3 * p5 + 3 * p6
Kod Golomba w praktyce • kodujemy bloki postaci 0p1, czyli kodowany „tekst” musi kończyć się jedynką • wydajne dla p bliskich 1 (wtedy szansa na długie bloki) • stopień kompresji zależy nie tylko od częstości wystąpień symboli ale też od ich „ustawienia” (porównaj z kodami kodującymi bloki ustalonej długości) • przydatny nie tylko przy rozkładzie geometryczn. • jak dobrać parametr m dla danych o nieznanym rozkładzie? wersja dynamiczna?
Kod Golomba: podsumowanie Własności: • nieskończony zbiór słów kodowych, prosta i skończona reprezentacja LUB • kod ze zmienną długością części kodowanej i kodującej • tylko dla ciągów binarnych (lub ciągu liczb) • optymalny dla rozkładu P(i) = pi(1-p), gdy m odpowiednio dobrane • zastosowania: • obrazy binarne (p. kody Rice’a) • faksy
Kody Tunstalla: motywacja Dotychczas: • kody o stałej długości: k symboli wejściowych na p symboli wyjściowych (zazwyczaj k=1), k,p ustalone • kody o zmiennej długości: k symboli wejściowych (k ustalone) na ... zmienną liczbę symboli wyjściowych • kody o zmiennej długości wejścia i wyjścia: p. kod Golomba Wady: • kody o stałej długości: brak kompresji • kody o zmiennej długości: wrażliwość na błędy
Kody Tunstalla Nowe podejście: • długość słowa kodowego stała • liczba znaków tekstu wejściowego kodowana przez jedno słowo kodowe: zmienna Cel: kompresja przy niskich kosztach błędów zapisu/transmisji (typu „przekłamanie bitu”) Porównaj: alfabet Braile’a
Kody Tunstalla: definicja Dane: • alfabet a1,...,aN i prawdopodobieństwa p1,...,pN. • n : długość słowa kodowego (taka, że liczba słów kodowych, 2n, jest większa od N).
Kody Tunstalla: definicja Tworzenie kodu. • Przyporządkowanie symbolom alfabetu N różnych słów kodowych (o długości n). • Dopóki liczba niewykorzystanych słów kodowych większa od N-1: • wybierz słowo kodowe e odpowiadające ciągowi o największym prawdopodobieństwie • usuń e z kodu • dodaj do kodu elementy ea1,ea2,..., eaN o prawdopodobieństwach P(e)P(a1), , P(e)P(aN) UWAGA: zostawiamy (co najmniej) jedno niewykorzystane słowo kodowe!
Kody Tunstalla: przykład • alfabet a,b, c i prawdopodobieństwa (N = 3) P(a) = 0.6, P(b) = 0.3, P(c )=0.1 • n = 3 : kod ma 8 słów kodowych. Etapy tworzenia kodu: • a 0.6, b 0.3, c 0.1 • aa 0.36, ab 0.18, ac 0.06, b 0.3, c 0.1 • aaa 0.216, aab 0.108, aac 0.036, ab 0.18,ac0.06, b 0.3, c 0.1
Kody Tunstalla: przykład bloki wejściowe
Kody Tunstalla: po co wolne słowo kodowe? Zakodujmy tekst: abcaabbaa Mamy: 011110001101?? Wniosek: • na końcu kodowanego tekstu może pojawić się fragment o długości nie większej od najdłuższego bloku kodowanego jednym słowem, któremu brak słowa kodowego!
Kody Tunstalla: po co wolne słowo c.d. Rozwiązanie: • wolne słowo kodowe koduje informację o wystąpieniu „ogona” nie mającego słowa kodowego • „ogon” kodujemy przy pomocy ustalonych kodów stałych dla wszystkich liter alfabetu wejściowego abcaabbaa kodujemy 011110001101111 kod(a) kod(a)
Kody Tunstalla: własności • własność prefiksowa: żadne słowo wejściowe odpowiadające słowu kodowemu nie jest prefiksem innego słowa wejściowego (nie mylić z kodem prefiksowym!) • słowo rozszerzane usuwamy z kodu • zachowanie tej zasady oznacza, że niektóre słowa kodowe zostaną niewykorzystane • metoda zachłanna: minimalizacja liczby bitów przypadających na jeden symbol wejściowy
Kody Tunstalla: średnia długość (bps) Ogólnie: liczba bitów przypadająca na jeden symbol danych wejściowych: S(K) = sr(output) / sr(input) ale • sr(output) = n : każde słowo kodowe ma tę samą długość • sr(input) : średnia ważona wg prawdopodobieństw długości bloków wejściowych odpowiadających słowom kodowym czyli S(K) = n / sr(input)
Kody Tunstalla: optymalność Rozważmy optymalność wśród kodów: • o stałej długości słów kodowych • o zmiennej długości bloków wejściowych • własności prefiksowej: żaden blok wejściowy nie jest prefiksem innego bloku wejściowego • każdy tekst można zakodować za wyjątkiem „ogona”, który jest prefiksem jakiegoś bloku wejściowego Kod optymalny: o najmniejszej średniej długości, czyli o największej średniej długości bloku wejściowego.
Kody Tunstalla: optymalność c.d. • zbudujmy drzewo bloków wejściowych • wtedy każdy wierzchołek wewnętrzny ma N potomków odpowiadających wszystkim literom alfabetu (wynika z warunku 4) Korzystając z powyższej: Tw. Kod Tunstalla jest optymalny wśród kodów spełniających warunki 1-4 Metoda dowodu: indukcja ze względu na liczbę słów kodowych
Kody Tunstalla: bps (przykład) sr(input) = 0.216 * 3 + 0.108 * 3 + 0.036 + 0.18 * 2 + 0.06 * 2 + 0.3 * 1 + 0.1 * 1
Kody Tunstalla: podsumowanie • zmienna długość bloków wejściowych, stała wyjściowych: kompresja i odporność na błędy • jednoznacznośćkodowania: własność prefiksowa bloków wejściowych • jednoznaczność dekodowania: wynika ze stałej długości słów kodowych • optymalność...
Średnia długość: przypomnienie i uogóln. W ogólnym przypadku możemy mieć kod K o zmiennej długości bloków wejściowych i słów kodowych: S(K)=sr(output) / sr(input) sr(input) = |b1| * p1 + ... + |bn| * pn sr(output) = |s1| * p1 + ... + |sn| * pn
Jeszcze inne podejście... • najlepszą kompresję da rozszerzony kod Huffmana dla rozszerzenia Pk, gdzie k to długość tekstu • ale z tym wiąże się gigantyczny czas i pamięć ... można temu zaradzić, stosując kody arytmetyczne • w których słowo kodowe odpowiada całemu tekstowi!