Upload
roscoe
View
65
Download
1
Embed Size (px)
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
Citation preview
Kompresja danych
Instytut Informatyki UWrStudia dzienneWykł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:
7 8 2 10 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:p bliskie jedynki
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!
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:
r Kod(r)
0 00
1 01
2 10
3 110
4 111
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)
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
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-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
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
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.
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)
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
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
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)
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 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!
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
input output
aaa 000
aab 001
aac 010
ab 011
ac 100
b 101
c 110
???????? 111
bloki wejściowe
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
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)
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: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.
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)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
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
blok_we słowo_kod P(blok_we)
b1 s1 p1
b2 s2 p2
... ... ...
bn 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!