1 / 37

Kompresja danych

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:

roscoe
Download Presentation

Kompresja danych

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Kompresja danych Instytut Informatyki UWr Studia dzienne Wykład nr 3: kody Golomba, kody Tunstalla

  2. 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...

  3. 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...)

  4. 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

  5. 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!

  6. 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)

  7. Kod Golomba: przykład Niech m = 5, wtedy reszty r kodujemy wg tabeli:

  8. 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)

  9. 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

  10. 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?

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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 

  16. 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.

  17. Inna interpretacja: przykład m=5 Kodujemy 00000001 000000001 001 00000000001000... jako 1 0101 01100101 1 000

  18. 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!!!

  19. 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

  20. 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?

  21. 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

  22. 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

  23. 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

  24. 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).

  25. 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!

  26. 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,ac0.06, b  0.3, c  0.1

  27. Kody Tunstalla: przykład bloki wejściowe

  28. 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!

  29. 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)

  30. 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

  31. 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)

  32. 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.

  33. 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

  34. 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

  35. 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ść...

  36. Ś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

  37. 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!

More Related