Kompresja danych

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

description

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: - PowerPoint PPT Presentation

Transcript of Kompresja danych

Page 1: Kompresja danych

Kompresja danych

Instytut Informatyki UWrStudia dzienneWykład nr 3: kody Golomba, kody Tunstalla

Page 2: Kompresja danych

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:

7 8 2 10 17...

Page 3: Kompresja danych

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

Page 4: Kompresja danych

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:p bliskie jedynki

Page 5: Kompresja danych

Kod Golomba rzędu m

Kodowanie liczby n: 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!

Page 6: Kompresja danych

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)

Page 7: Kompresja danych

Kod Golomba: przykład

Niech m = 5, wtedy reszty r kodujemy wg tabeli:

r Kod(r)

0 00

1 01

2 10

3 110

4 111

Page 8: Kompresja danych

Kod Golomba: przykład

Dla danych postaci0000000100000000100100000000001000...

kodujemy długości kolejnych ciągów zer:

7 8 2 10 12...

(razem 8 + 9 + 3 + 11+ 18 = 49 bitów):

10 10 10 110 0 10 110 00 110 10( 4 + 5 + 3 +5 + 5 = 22 bity)

Page 9: Kompresja danych

Kod Golomba: przykład c.d.

Zakodujmy teraz dane7 8 2 10 12...

(49 bitów) używając kodu rzędu 10:

0 1101 0 1110 0 010 10 000 10 010( 5 + 5 + 4 +5 + 5 = 24 bity)

Ale dla m=256 mielibyśmy (co najm.):9 + 9 + 9 + 9 + 9 = 45 bitów

q Kod(q)

0 000

1 001

2 010

3 011

4 100

5 101

6 1100

7 1101

8 1110

9 1111

Page 10: Kompresja danych

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?

Page 11: Kompresja danych

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

Page 12: Kompresja danych

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

Page 13: Kompresja danych

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-1 o 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

Page 14: Kompresja danych

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-2w przybliżeniu

m - 1 / log p > m-2

Page 15: Kompresja danych

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

Page 16: Kompresja danych

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.

input output

0m 1

0m-1 1 0 K(m-1)

0m-2 1 0 K(m-2)

... ...

01 0 K(1)

1 0 K(0)

Page 17: Kompresja danych

Inna interpretacja: przykład m=5

Kodujemy00000001 000000001 001 00000 000001000...

jako1 010 1 0110 010 1 1 000

input output

00000 1

00001 0 111

0001 0 110

001 0 10

01 0 01

1 0 00

Page 18: Kompresja danych

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

Page 19: Kompresja danych

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

input output P(input)

00000 1 p1 = p5

00001 0 111 p2 = p4(1-p)

0001 0 110 p3 = p3(1-p)

001 0 10 p4 = p2(1-p)

01 0 01 p5 = p(1-p)

1 0 00 p6 = (1-p)

Page 20: Kompresja danych

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?

Page 21: Kompresja danych

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

Page 22: Kompresja danych

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

Page 23: Kompresja danych

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

Page 24: Kompresja danych

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

Page 25: Kompresja danych

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 e a1, e a2,..., e aN o prawdopodobieństwach P(e)P(a1), , P(e)P(aN)

UWAGA: zostawiamy (co najmniej) jedno niewykorzystane słowo kodowe!

Page 26: Kompresja danych

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

Page 27: Kompresja danych

Kody Tunstalla: przykład

input output

aaa 000

aab 001

aac 010

ab 011

ac 100

b 101

c 110

???????? 111

bloki wejściowe

Page 28: Kompresja danych

Kody Tunstalla: po co wolne słowo kodowe?

Zakodujmy tekst:ab c aab b aa

Mamy:

011 110 001 101 ??

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!

input output

aaa 000

aab 001

aac 010

ab 011

ac 100

b 101

c 110

???????? 111

Page 29: Kompresja danych

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

ab c aab b aa

kodujemy

011 110 001 101 111 kod(a) kod(a)

Page 30: Kompresja danych

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

Page 31: Kompresja danych

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)

Page 32: Kompresja danych

Kody Tunstalla: optymalnośćRozważmy optymalność wśród kodów:1. o stałej długości słów kodowych2. o zmiennej długości bloków wejściowych3. własności prefiksowej: żaden blok wejściowy

nie jest prefiksem innego bloku wejściowego4. 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.

Page 33: Kompresja danych

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

Page 34: Kompresja danych

Kody Tunstalla: bps (przykład)input output P( input )

aaa 000 0.216

aab 001 0.108

aac 010 0.036

ab 011 0.18

ac 100 0.06

b 101 0.3

c 110 0.1

???????? 111

sr(input) = 0.216 * 3 + 0.108 * 3 + 0.036 + 0.18 * 2 + 0.06 * 2 + 0.3 * 1 + 0.1 * 1

Page 35: Kompresja danych

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

Page 36: Kompresja danych

Ś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

blok_we słowo_kod P(blok_we)

b1 s1 p1

b2 s2 p2

... ... ...

bn sn pn

Page 37: Kompresja danych

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!