Algorytmy kodowania słownikowego - Instytut...
Transcript of Algorytmy kodowania słownikowego - Instytut...
Algorytmy kodowania słownikowego
1. Kodowanie ze słownikiem statycznym2. Kodowanie ze słownikiem dynamicznym
(LZ77, LZ78, LZSS, LZW)3. Zastosowania
Algorytmy entropijne i słownikowe
� Do tej pory – algorytmy entropijne� U�ywaj� modeli probabilistycznych do optymalnego zakodowanie
pojedynczych symboli� Kody poszczególnych symboli ró�nej długo�ci – dobrane tak, by w �redniej uzyska� kompresj�
� Nie bior� pod uwag� korelacji pomi�dzy symbolami – to mo�e by� istotne �ródło redundancji
� Algorytmy słownikowe� Nie koduj� pojedynczych symboli kodami o zmiennej długo�ci
tylko ci�gi znaków o zmiennej długo�ci poprzez zapisy o stałej długo�ci
� Zapisy te tworz� indeksy do słowników fraz� Je�eli zapisy (indeksy) krótsze ni� frazy – kompresja
Kodowanie słownikowe - zasada
Chcemy zakodowa� zdanie angielskie:
A good example of how dictionary based compression works
Słownik: Longman Dictionary of Contemporary EnglishKodowanie: wska�nik do słowa to x/y, x – nr strony, y – nr
słowa na stronie. Wynik:
1/1 489/7 377/19 755/36 548/13 303/7 73/3 223/1 1270/25
Liczba stron w słowniku: 1280 – x kodujemy przez 11 bitówLiczba słów na stronie < 128 – y kodujemy przez 7 bitówWska�nik x/y – 18 bitów. Całkowita ilo�� bitów: 9*18 = 162Normalne kodowanie ASCII – 48 bajtów, czyli 384 bityStopie� kompresji – 2.37 : 1
Słownik statyczny
� Słownik statyczny – ustalony i niezmienny w trakcie kodowania
� Zastosowanie – gdy mamy wcze�niejsz� wiedz� o kodowanych danych (słownik zawiera najcz��ciej stosowane frazy)
� Słownik bardzo zale�ny od zastosowania� Bardziej uniwersalna metoda kodowania ze słownikiem
statycznym – kodowanie digramowe. Słownik – zawiera wszystkie litery alfabetu oraz tak� ilo�� par liter (digramów) ile si� zmie�ciPrzykład: słownik 256 znaków, alfabet – drukowalne znaki ASCII -95 znaków. Mo�emy wi�c mie� 161 digramy
Kodowanie digramowe
Przykład:� Alfabet {a, b, d, k, r}� Ci�g do zakodowania: abrakadabra� Do zakodowania wszystkich liter potrzeba 3 bitów –
słownik o rozmiarze 23
111ad011k
110ak010d
101ab001b
100r000a
Wynik kodowania: 101|100|110|111|101|101|000
Słownik dynamiczny
� Wi�ksze znaczenie – metody ze słownikiem dynamicznym� Bardziej uniwersalne ni� oparte na słowniku statycznym� Przełomowe znaczenie – prace Jacoba Ziva i Abrahama
Lempela z ko�ca lat siedemdziesi�tych� Słownik budowany dynamicznie na podstawie
przetworzonej cz��ci danych – równy fragmentowi przetworzonej cz��ci danych lub wytworzony ze wszystkich fraz przetworzonych do tej pory
� Najwa�niejsze algorytmy: LZ77, LZ78, LZW
Algorytm LZ77
� Słownik – fragment wcze�niej zakodowanej cz��ci danych� Przegl�damy dane przez przesuwaj�ce si� okno o
rozmiarze W� Okno dzieli si� na:
� bufor słownikowy – zawiera ostatnio zakodowany fragment ci�gu danych
� bufor kodowania – zawiera fragment ci�gu, który wła�nie mamy kodowa�
� Praktyczne implementacje – rozmiar bufora słownikowego: 8 – 16 kB, rozmiar bufora kodowania ~ 100 bajtów
Algorytm LZ77 – c.d.
� Zasada działania:� Umieszczamy wska�nik przeszukiwania na ko�cu bufora
słownikowego� Przesuwamy wska�nik w lewo (liczba miejsc – o) a� do
napotkania symbolu równego pierwszemu symbolowi w buforze kodowania
� Sprawdzamy, czy nast�pne symbole w obu buforach nie s� sobie równe. Liczba równych sobie symboli – długo�� dopasowania l
� Przegl�damy w ten sposób cały bufor słownikowy tak, by zmaksymalizowa� dopasowanie
� Optymalne dopasowanie kodujemy jako (o, l, c), gdzie c – kod symbolu w buforze kodowania wyst�puj�cy jako pierwszy niedopasowany symbol
dakarbak arrarba
7 4
(7, 4, C(r))
Algorytm LZ77 – c.d.
� Ostatni element trójki – na wypadek zerowego dopasowania � Po wysłaniu kodu (o, l , c) przesuwamy okno o l + 1 w prawo i
powtarzamy procedur�
� Długo�� zapisu koduj�cego dla kodowania o stałej długo�ci� niech rozmiar okna = W, rozmiar bufora słownikowego = S,
rozmiar alfabetu = A� wtedy długo�� zapisu = log2 S + log2 W + log2 A
� Uwaga: dopasowanie mo�e przekroczy� rozmiar bufora słownikowego
Algorytm LZ77 – kodowanie
Kodujemy ci�g:
.darrarrarbadakarbak.
Zakładamy, �e podci�g k a b r a k a jest ju� zakodowany.
Parametry okna: W=13, S=7
Kolejne kroki kodowania:
akarbak rarbad
rarbada
dakarba rrarba
darrar
(0,0,C(d))
(7,4,C(r))
(3,5,C(d))
Algorytm LZ77 – dekodowanie� Startujemy z odkowowanego podci�gu k a b r a k a� Odkodowujemy (0,0,C(d)) – czyli C(d)
akarbak d
a
r
� Odkodowujemy (7,4,C(r))
akarbak d
Przesuni�cie o 7
akarbak d
Kopiowanie 1 znaku
akarbak d a b
Kopiowanie 2 znaku
akarbak d a b r
Kopiowanie 3 znaku
akarbak d a b r a
Kopiowanie 4 znaku
akarbak d a b r a
Odkodowanie C(r)
Algorytm LZ77 – dekodowanie – c.d.
� Odkodowanie (3,5,C(d))
rarbaba rarbaba
o 3 pozycje
r
1 znak
r a
2 znak
rarbaba r a rrarbaba
3 znak
r a r r rarbaba
4 znak
r a r r ararbaba
5 znak
r a r r ararbaba d
Odkodowanie C(d)
Algorytm LZ77 – własno�ci
� Prosta metoda adaptacyjna, nie wymaga wcze�niejszej wiedzy o charakterze �ródła
� Kodowanie mo�e by� czasochłonne (du�o porówna�); dekodowanie proste i szybkie
� Niedu�e wymagania dotycz�ce pami�ci� Asymptotycznie – wyniki najlepsze jakie mo�na uzyska�
przy pełnej cz�sto�ci pojawiania si� znaków i korelacji mi�dzy nimi
� Mo�na zastosowa� ró�ne modyfikacje algorytmu poprawiaj�ce jego efektywno��
Odmiany LZ77
� Algorytm LZSS – unika konieczno�ci wysyłania (o,l,c)� Redundancja – albo nie trzeba pointera (bo jest zerowy), albo kodu
znaku (mo�e by� przekazany w nast�pnym wej�ciu)� Działanie:
• Znajd� dopasowanie (o,l)• Je�eli l �MIN_LENGTH to wysyłamy (o, l ) i przesuwamy okno o l• Je�eli l < MIN_LENGTH to wysyłamy kod pierwszego znaku z
bufora kodowania i przesuwamy okno o 1• Aby rozró�ni� oba przypadki ich zapisy poprzedzamy odpowiednimi
flagami bitowymi
� Inne modyfikacje – poprawa efektywno�ci kodowania –kodowanie trójek (lub dwójek liczb) kodowaniem o zmiennej długo�ci – pakiety Pkzip, Zip, gzip, ARJ, LHarc
� Zastosowanie efektywnych struktur danych do reprezentacji zawarto�ci bufora słownikowego (TRIE)
Algorytm LZ78
� Wada algorytmu LZ77 – sko�czony czas, w jakim wzorzec jest pami�tany – wzorce odległe o bardziej ni� szeroko�� bufora słownikowego nie „czuj�” swej obecno�ci
gfedcbaihgfedcbaihgfedcba i a b
� LZ78 – zast�pienie bufora słownikowego słownikiem tworzonym explicite – dynamicznie w trakcie kodowania i dekodowania
� Słowniki – tabela zawieraj�ca indeks i odpowiadaj�cy mu wzorzec. Na pocz�tku kodowania (dekodowania) – słownik pusty. Potem – ostatnio dopasowany wzorze + niedopas. znak
� Kodowanie – para (i,c), gdzie i – indeks, c – kod pierwszego niedopasowanego znaku
LZ78 – przykładCi�g do zakodowania: aa_bbb_cccc_ddddd_e
e12
dd_11
dd10
d9
c_8
cc7
c6
_5
bb4
b3
a_2
a1
^0
WzorzecNrSłownik: Kodowanie:
(0,a)(1,_)(0,b)(3,b)(0,_)(0,c)(6,c)(6,_)(0,d)(9,d)(10,_) (0,e)
Do słownika wstawiane s� coraz dłu�sze wzorce. Je�eli jaka� fraza si� powtarza, to wkrótce znajdzie si� w cało�ci w słowniku.
Odkodowanie – bardzo proste.
Własno�ci algorytmu LZ78
� Szybsze kodowanie ni� dla LZ77 (znacznie mniej porówna� stringów)
� Łatwe dekodowanie (cho� wolniejsze ni� dla LZ77 –konieczno�� odbudowy słownika)
� Wzorce s� stale dodawane do słownika (1 wzorzec na jeden proces kodowania) i nie zapominane –niebezpiecze�stwo przepełnienia pami�ci
� Jest punktem wyj�cia dla algorytmów pochodnych –najbardziej znany algorytm LZW.
Algorytm LZW
� Zaproponowany w 1984 przez Terry’ego Welcha� Główna modyfikacja – koder nie wysyła kodu pierwszego
niedopasowanego znaku (a tylko indeks słownika)� Aby to było mo�liwe – słownik na starcie zawiera
wszystkie litery wyj�ciowego alfabetu� Procedura kodowania:
� Próbujemy dopasowa� kawałek ła�cucha wej�ciowego � Niech s – maksymalny podła�cuch który ma wzorzec w słowniku
(indeks j) o długo�ci d, c – pierwszy niedopasowany znak� Na wyj�cie: j (indeks wzorca zgodnego z s)� Do słownika dodajemy s+c� Przesuwamy znacznik pozycji o d
Algorytm LZW – kodowanie
• Przykład: kodujemy ci�g a b c a b b c a b b a
a w D, ab – nie, ab do D4, wyj�cie 1
b w D, bc – nie, bc do D5, wyj�cie 2
c w D, ca – nie, ca do D6, wyj�cie 3
ab w D, abb – nie, abb do D7, wyj�cie 4
bc w D, bca – nie, bca do D8, wyj�cie 5
abb w D, abba – nie, abba do D9, wyj�cie 7
a w D, wyj�cie 1
Wynik:
1 2 3 4 5 7 1abba9
bca8
abb7
ca6
bc5
ab4
c3
b2
a1
WzorzecIndeks
Algorytm LZW – dekodowanie
Odkodujemy ci�g 1 2 3 4 5 7 1 ze słownikiem pocz�tkowym {a, b, c}
1 ==> wyj�cie a ==> a w D2 ==> wyj�cie b ==> ab nie w D, ab do D43 ==> wyj�cie c ==> bc nie w D, bc do D54 ==> wyj�cie ab ==> ca nie w D, ca do D65 ==> wyj�cie bc ==> abb nie w D, abb do D77 ==> wyj�cie abb ==> bca nie w D, bca do D81 ==> wyj�cie a ==> abba nie w D, abba do D9
Algorytm LZW – problem
• Niekiedy w odkodowywaniu LZW problem – konieczno�� u�ycia wzorca, który jest w trakcie formowania.
• Przykład: zakodowa� ci�g a b a b a b a b• Standardowe post�powanie daje kod: 1 2 3 5 2• Odkodowanie: 1 ==> wyj�cie a ==> a w D
2 ==> wyj�cie b ==> ab nie w D, ab do D3
3 ==> wyj�cie ab ==> ba nie w D, ba do D4
5 ==> ale pozycja 5 w słowniku jeszcze niegotowa !!!
Wiemy, �e D5 musi si� zaczyna� od ab – abx.
Czyli D5 to prefiks ababx którego jeszcze nie ma w D – czyli aba
5 ==> wyj�cie aba ==> aba do D5
2 ==> wyj�cie b ==> abab do D6
ab..5
ba4
ab3
b2
a1
WzorzecIndeks
Zastosowanie LZW
� Polecenie compress� Rozmiar słownika (i długo�� kodów indeksów) zmienia si�
dynamicznie� Zaczynamy od słownika o rozmiarze 512 (słowo kodowe 9-
bitowe). Gdy słownik si� zapełnia, podwajamy rozmiar� Rozmiar maksymalny = 2b, gdzie b – pomi�dzy 9 a 16 (default
równy 16). � Gdy rozmiar maksymalny osi�gni�ty – słownik si� nie zmienia� Algorytm analizuje stopie� kompresji; gdy zbyt niski, słownik jest
czyszczony i budowany od nowa
Zastosowanie LZW – c.d.
� Format GIF� Podstawa – b = ilo�� pikseli na bit.� Zaczynamy od słownika o rozmiarze 2b+1. Po wypełnieniu –
zwi�kszamy o czynnik 2. � Maksymalny rozmiar – 4096. Po jego osi�gni�ciu – słownik jest
zamro�ony.
� Kompresja danych wysyłanych przez modem (V.42 bis)� Mo�e pracowa� w trybie prze�roczystym i trybie kompresji� Tryb kompresji – algorytm LZW ze słownikiem o zmiennej
długo�ci� Standard pozwala na okresowe czyszczenie słownika z napisów,
które pojawiły si� w przeszło�ci, lecz nie były u�ywane ostatnio