Wyklad 5 (kodowanie słownikowe)
Wyklad 5 (kodowanie słownikowe)
Wyklad 5 (kodowanie słownikowe)
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Wstęp<br />
LZ77<br />
LZ78<br />
Kompresja danych<br />
Tomasz Jurdziński<br />
Wykład 5: <strong>kodowanie</strong> <strong>słownikowe</strong><br />
Jurdziński<br />
Kompresja danych
Motywacja<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Motywacje<br />
1<br />
zazwyczaj dane nie tworza˛<br />
ciagu ˛ wartości niezależnych, kolejny<br />
symbol jest zależny od poprzedzajacych ˛ go;<br />
2<br />
pewne sekwencje (słowa) często się powtarzaja.<br />
˛<br />
Słowniki statyczne:<br />
korzystamy z ustalonego słownika;<br />
tekst kodujemy jako ciag ˛ słów ze słownika, każde słowo<br />
kodowane przez jego pozycję w słowniku.<br />
Co z elementami, których brak w słowniku: można np. umieścić<br />
w nim pojedyncze litery.<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
Przykład: <strong>kodowanie</strong> digramowe<br />
Przykład: <strong>kodowanie</strong> digramowe<br />
słownik o ustalonej wielkości sklada się ze wszystkich liter i tylu<br />
par liter (digramów), ile się w nim zmieści (wybieramy najbardziej<br />
prawdopodobnepary).<br />
przykład: dla słownika o rozmiarze 256 i alfabetu zlożonego z<br />
drukowalnych znaków ASCII, których jest 95, w słowniku można<br />
umieścić161 par.<br />
Jurdziński<br />
Kompresja danych
Słowniki dynamiczne<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Dlaczego słowniki statyczne nieskuteczne<br />
Wrażliwe na zmianę charakteru danych.<br />
Na czym polega słownik dynamiczny<br />
dostosowany do charakteru danych;<br />
tworzony w trakcie kodowania;<br />
zmienia się w trakcie kodowania;<br />
dekoder może go odtworzyć w oparciu o odkodowana˛<br />
część<br />
danych (nie trzeba słownika dołaczać ˛ do danych);<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZ77 czyli nietypowy słownik<br />
LZ77<br />
Ziv i Lempel, 1977;<br />
Idea: słownikiem jest zakodowana/odkodowana część tekstu.<br />
Dokładniej:<br />
dla zakodowanej części x 1 ...x n i niezakodowanej x n+1 ...x m<br />
szukamy najdłuższego podsłowa x 1 ...x n , które jest prefiksem<br />
x n+1 ...x m , czyli dopasowania<br />
... i kodujemy ten prefiks poprzez wskazanie jego pozycji w x 1 ...x n .<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
Jak kodujemy dopasowanie<br />
Kodowanie dopasowania<br />
jako para (j,k), gdzie<br />
j to odległość między poczatkiem ˛ kodowanej części (pozycja<br />
n + 1) a poczatkiem ˛ dopasowania<br />
k to długość dopasowania.<br />
Przykład<br />
tekst: ABXAXABAXAXBBAB<br />
zakodowane: ABXAXABA, niezakodowane: XAXBBAB<br />
najdłuższe dopasowanie ABXAXABAXAXBBAB<br />
<strong>kodowanie</strong>: (6,3).<br />
Jurdziński<br />
Kompresja danych
Problem 1<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Co z brakiem dopasowania<br />
tekst: ABXAXABADAXBBAB<br />
zakodowane: ABXAXABA, niezakodowane: DAXBBAB<br />
najdłuższe dopasowanie: brak!<br />
rozwiazanie: ˛ (0,0,kod(D)).<br />
gdzie kod jest pewnym ustalonym kodem prefiksowym dla alfabetu<br />
wejściowego.<br />
Ogólnie<br />
Kodujemy dopasowanie przy pomocy trójki<br />
przesunięcie<br />
długość dopasowania<br />
kod symbolu występujacego ˛ za dopasowaniem w<br />
niezakodowanej części tekstu.<br />
Jurdziński<br />
Kompresja danych
Kodowanie: przykłady<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Sytuacja typowa<br />
tekst: ABXAXABAXAXBBAB<br />
zakodowane: ABXAXABA, niezakodowane: XAXBBAB<br />
najdłuższe dopasowanie ABXAXABAXAXBBAB<br />
<strong>kodowanie</strong>: (6,3,kod(B)).<br />
Sytuacja nietypowa<br />
tekst: ABXAXABADAXBBAB<br />
zakodowane: ABXAXABA, niezakodowane: DAXBBAB<br />
najdłuższe dopasowanie: brak!<br />
<strong>kodowanie</strong>: (0,0,kod(D)).<br />
Jurdziński<br />
Kompresja danych
Kodowanie: przykłady<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Sytuacja nietypowa<br />
Zaczynamy <strong>kodowanie</strong>, czyli część zakodowana jest pusta: pierwsza˛<br />
literę x 1 kodujemy jako<br />
(0,0,kod(x 1 ))<br />
czyli uznajemy, że brakuje dopasowania.<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
Kodowanie: sytuacje nietypowe<br />
Dopasowanie wybiega poza zakodowana˛<br />
część<br />
tekst: ADABRARRARRAD<br />
zakodowane: ADABRAR, niezakodowane: RARRAD<br />
najdłuższe dopasowanie “standardowo”: ADABRARRARRAD<br />
standardowe <strong>kodowanie</strong>: (3,3,kod(R))....<br />
można wydłużyć do 5 znaków: (3,5,kod(D))<br />
Jurdziński<br />
Kompresja danych
Kodowanie ogólnie<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Ogólnie<br />
dla zakodowanej części x 1 ...x n i niezakodowanej x n+1 ...x m<br />
szukamy najdłuższego podsłowa x 1 ...x m , które zaczyna się w<br />
części x 1 ...x n i jest prefiksem x n+1 ...x m<br />
... i kodujemy ten prefiks poprzez wskazanie przesunięcia,<br />
dopasowania i znaku za dopasowaniem:<br />
(p,d,kod(x n+1+d ))<br />
gdzie x n+1−p ...x n+1−p+d−1 = x n+1 ...x n+1+d−1 .<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
Problemy z <strong>kodowanie</strong>m<br />
Problemy z <strong>kodowanie</strong>m trójek<br />
Efekty<br />
wartości przesunięcia z potencjalnie nieskończonego zbioru;<br />
podobnie długości dopasowania.<br />
nie możemy stosować kodów o stałej długości;<br />
długi czas poszukiwania dopasowania!<br />
konieczność przechowywania (najlepiej) w pamięci operacyjnej<br />
całej zakodowanej już części tekstu.<br />
Jurdziński<br />
Kompresja danych
LZ 77<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Jak na prawdę wyglada ˛ LZ77<br />
bufor słownikowy: sufiks już zakodowanej części tekstu, o<br />
ustalonym rozmiarze s;<br />
bufor kodowania: prefiks jeszcze nie zakodowanej części tekstu,<br />
o ustalonym rozmiarze t;<br />
okno: bufor słownikowy + bufor kodowania; rozmiar okna s + t.<br />
LZ77: jak kodujemy<br />
dopasowań szukamy tylko w buforze słownikowym<br />
dopasowanie nie może wybiegać poza bufor kodowania<br />
(wcześniejszy tekst):<br />
(p,d,kod(x n+1+d ))<br />
gdzie x n+1−p ...x n+1−p+d−1 = x n+1 ...x n+1+d−1 oraz<br />
n + 1 − p + d − 1 ≤ n + 1 + t − 1 (t: rozmiar bufora kodowania).<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZ 77: długość reprezentacji trójek<br />
Kodujemy trójkę (p,d,kod(a))<br />
p ≤ s, a zatem można zapisać na ⌈logs⌉ bitach;<br />
d ≤ s + t, a zatem można zapisać na ⌈log(s + d)⌉ bitach;<br />
kod(a) zapisujemy na ⌈log|A|⌉ bitach, gdzie A to alfabet<br />
wejściowy.<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZ77: ostateczny algorytm kodowania<br />
Krok algorytmu LZ77<br />
Znajdź najdłuższe dopasowanie dla prefiksu bufora kodowania w<br />
buforze słownikowym: szukamy w buforze słownikowym od<br />
końca (zakładamy, że bardziej prawdopodobne sa˛<br />
powtórzenia w<br />
małej odległości).<br />
Zakoduj dopasowanie przy pomocy trójki: (p,d,C), gdzie:<br />
p to przesunięcie (odległość poczatku ˛ najlepszego dopasowania<br />
od bufora kodowania)<br />
d to długość dopasowania<br />
C to kod symbolu występujacego ˛ za dopasowanym prefiksem<br />
bufora kodowania<br />
Przesuń okno o d + 1 pozycji w prawo.<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZ77: przykład kodowania<br />
Przykład<br />
bufor słownikowy: s = 4;<br />
bufor kodowania: t = 4;<br />
kodowany tekst: aaaabababaaab$<br />
aaaa bababaaab$ 〈0,0,a〉<br />
aaaab ababaaab$ 〈1,3,b〉<br />
aaaababab aaab$ 〈2,5,a〉<br />
aaaabababaaab$ 〈4,2,$〉<br />
zielony: bufor kodowania, czerwony: bufor słownikowy.<br />
Jurdziński<br />
Kompresja danych
LZ77: de<strong>kodowanie</strong><br />
Wstęp<br />
LZ77<br />
LZ78<br />
De<strong>kodowanie</strong><br />
Dane: Ciag ˛ trójek (p 1 ,d 1 ,kod(c 1 ))...(p n ,d n ,kod(c n )).<br />
Odkodowany tekst x zainicjuj jako tekst pusty.<br />
Dla i = 1,2,...,n<br />
do odkodowanego tekstu x = x 1 ...x m dołacz ˛ fragment<br />
x m−pi +1 ...x m−pi +d i<br />
c i :<br />
x ← x 1 ...x m x m−pi +1 ...x m−pi +d i<br />
c i .<br />
Jurdziński<br />
Kompresja danych
LZ77: implementacja<br />
Wstęp<br />
LZ77<br />
LZ78<br />
De<strong>kodowanie</strong><br />
Nie ma potrzeby wyszukiwania dopasowania: de<strong>kodowanie</strong> dużo<br />
prostsze.<br />
Kodowanie<br />
jak szybko można szukać dopasowań?<br />
Jurdziński<br />
Kompresja danych
Szukanie dopasowań<br />
Wstęp<br />
LZ77<br />
LZ78<br />
ZIP i GZIP<br />
rozmiar okna: bufor słownikowy 32KB, bufor kodowania 258<br />
bajtów;<br />
reprezentacja “słownika” (czyli zawartości bufora <strong>słownikowe</strong>go):<br />
tablica hashujaca ˛ pozycji poczatkowych ˛ dla ciagów ˛ 3-literowych;<br />
elementy tablicy to listy, w których na przodzie najpóźniejsze wpisy<br />
(najbliższe dopasowania);<br />
wpisy spoza bufora <strong>słownikowe</strong>go usuwane (“leniwie”, po<br />
odwiedzeniu ich).<br />
krotki kodowane przy pomocy algorytmu Huffmana<br />
(adaptacyjnie, dla uniknięcia 2 przebiegów);<br />
<strong>kodowanie</strong> w blokach.<br />
Jurdziński<br />
Kompresja danych
Szukanie dopasowań<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Storer, Szymanski (w opisie LZSS)<br />
bufor kodowania w kolejce cyklicznej;<br />
wszystkie t-elementowe podsłowa bufora <strong>słownikowe</strong>go w<br />
drzewie binarnym: szczegóły na ćwiczeniach (t to rozmiar bufora<br />
kodowania).<br />
Jurdziński<br />
Kompresja danych
Modyfikacje LZ77<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Stopień kompresji<br />
LZSS: usuwamy trzeci element, dodajemy flagę bitowa˛<br />
informujac ˛ a˛<br />
do każdej trójki, czy było niezerowe dopasowanie:<br />
jeśli nie, kodujemy tylko jeden znak jego standardowym kodem,<br />
jeśli tak, kodujeym wartości przesunięcia i długości;<br />
kompresje powstajacych ˛ trójek (Huffman, <strong>kodowanie</strong><br />
arytmetyczne,...) lub trzeciego elementu trójki (np. w ZIP, ARJ),<br />
zmiana rozmiaru buforów w trakcie (de)kodowania.<br />
Jurdziński<br />
Kompresja danych
LZ77: podsumowanie<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Podsumowanie<br />
oparty na założeniu: powtórzenia występuja˛<br />
w niedużej<br />
odległości;<br />
wiele zastosowań: zip, gzip, PNG, PKzip, arj, rar, ...<br />
<strong>kodowanie</strong> bardziej kosztowne od dekodowania, możliwy<br />
kompromis między stopniem kompresji a szybkościa˛<br />
algorytmu.<br />
Jurdziński<br />
Kompresja danych
LZ78: idea<br />
Wstęp<br />
LZ77<br />
LZ78<br />
LZ78: idea<br />
Cel: odejść od założenia, że powtórzenia występuja˛<br />
w małej<br />
odległości.<br />
Słownik: poindeksowany zbiór słów.<br />
Zawartość słownika: tworzona w oparciu o<br />
zakodowana/odkodowan ˛<br />
a˛<br />
część tekstu.<br />
Kodowanie: ciag ˛ indeksów odowiadajacych ˛ słowom ze słownika.<br />
Jurdziński<br />
Kompresja danych
LZ78<br />
Wstęp<br />
LZ77<br />
LZ78<br />
LZ78: Algorytm 1<br />
Słownik ← zbiór pusty<br />
Aż do zakodowania całego tekstu:<br />
znajdź w- najdłuższy prefiks niezakodowanej części tekstu<br />
występujacy ˛ w słowniku,<br />
symbol występujacy ˛ w niezakodowanej części tekstu za w<br />
oznaczmy przez a, pozycję w w słowniku przez n,<br />
zakoduj 2a za pomoca˛<br />
pary (n,kod(a))<br />
UWAGA: jeśli pierwszy znak niezakodowanej części tekstu nie<br />
występuje w słowniku, to n = 0<br />
dodaj do słownika słowo wa.<br />
Jurdziński<br />
Kompresja danych
LZ78: przykład<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Tekst: T A T A T A T A T<br />
Zakodowane:<br />
Słownik: pusty<br />
Jurdziński<br />
Kompresja danych
LZ78: przykład<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Tekst: T A T A T A T A T<br />
Zakodowane: (0, T)<br />
Słownik: 1 T<br />
Jurdziński<br />
Kompresja danych
LZ78: przykład<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Tekst: T A T A T A T<br />
Zakodowane: (0, T) (0, A)<br />
1 T<br />
Słownik:<br />
2 A<br />
Jurdziński<br />
Kompresja danych
LZ78: przykład<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Tekst: T A T A T A T A T<br />
Zakodowane: (0, T) (0, A) (1,A)<br />
1 T<br />
Słownik: 2 A<br />
3 TA<br />
Jurdziński<br />
Kompresja danych
LZ78: przykład<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Tekst: T A T A T A T A T<br />
Zakodowane: (0, T) (0, A) (1,A) (3,T)<br />
1 T<br />
2 A<br />
Słownik:<br />
3 TA<br />
4 TAT<br />
Jurdziński<br />
Kompresja danych
LZ78: przykład<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Tekst: T A T A T A T A T A T<br />
Zakodowane: (0, T) (0, A) (1,A) (3,T) (2,T)<br />
1 T<br />
2 A<br />
Słownik: 3 TA<br />
4 TAT<br />
5 AT<br />
Jurdziński<br />
Kompresja danych
LZ78: de<strong>kodowanie</strong><br />
Wstęp<br />
LZ77<br />
LZ78<br />
LZ78: Algorytm dekodowania<br />
Słownik ← zbiór pusty<br />
Odkodowujemy pary na podstawie zawartości słownika:<br />
dla kolejnej pary (n,kod(a)) na koniec odkodowanej części tekstu<br />
dodajemy xa, gdzie x to element słownika na pozycji n;<br />
jeśli słownik nie jest pełen: po odkodowaniu xa (x - element<br />
słownika, a - znak za nim występujacy), ˛ dodajemy xa do słownika.<br />
LZ78: <strong>kodowanie</strong> a de<strong>kodowanie</strong><br />
<strong>kodowanie</strong>: szukamy najdłuższego dopasowania do pozycji w<br />
słowniku;<br />
de<strong>kodowanie</strong>: bez szukania dopasowań, kopiujemy odpowiednie<br />
fragmenty.<br />
Jurdziński<br />
Kompresja danych
LZ78: stary problem...<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Jak reprezentować pary<br />
pozycje w słowniku: jaki zakres? na ilu bitach?<br />
litery: ustalony kod stały.<br />
LZ78: standardowe rozwiazanie<br />
˛<br />
rozmiar słownika z góry ustalony;<br />
po wypełnieniu słownika, kodujemy kolejne dopasowania bez<br />
modyfikacji słownika.<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZ78: inny stary problem...<br />
Co z drugim elementem każdej pary<br />
potrzebny dla pierwszych wystapień ˛ liter w tekście; ALE<br />
zmniejsza stopień kompresji: część tekstu kodowana bez<br />
wykorzystania kontekstu!<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW, czyli optymalizujemy...<br />
LZW: idea<br />
zamiast pary (pozycja, litera), kodujemy tylko pozycję w,<br />
najdłuższego dopasowania, ALE<br />
na poczatku ˛ w słowniku umieszczamy wszystkie symbole<br />
alfabetu, bo ...<br />
w przeciwnym razie nie moglibyśmy zaczać ˛ kodowania i<br />
kontynuować w momencie napotkania symbolu, od którego nie<br />
zaczyna się żadna pozycja słownika.<br />
LZW: jak rozszerzamy słownik<br />
zgodnie z LZ78: do słownika dodajemy konkatenację zakodowanego<br />
elementu słownika w i występujacego ˛ za nim znaku a.<br />
Jurdziński<br />
Kompresja danych
LZW: <strong>kodowanie</strong><br />
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: algorytm kodowania<br />
Umieść w słowniku wszystkie możliwe ciagi ˛ jednoliterowe (czyli<br />
litery alfabetu).<br />
Dopóki niezakodowana część tekstu nie jest pusta:<br />
znajdź w najdłuższy prefiks niezakodowanej części tekstu, który<br />
występuje w słowniku;<br />
zakoduj w jako n, jego pozycję w słowniku;<br />
dodaj do słownika wa, gdzie a jest symbolem występujacym ˛ za<br />
prefiksem w w niezakodowanej części tekstu.<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane:<br />
1 T<br />
Słownik:<br />
2 A<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane: 1<br />
1 T<br />
Słownik: 2 A<br />
3 TA<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane: 1 2<br />
1 T<br />
2 A<br />
Słownik:<br />
3 TA<br />
4 AT<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane: 1 2 3<br />
1 T<br />
2 A<br />
Słownik: 3 TA<br />
4 AT<br />
5 TAT<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane: 1 2 3 5<br />
1 T<br />
2 A<br />
3 TA<br />
Słownik:<br />
4 AT<br />
5 TAT<br />
6 TATA<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
2 A<br />
3 TA<br />
Słownik:<br />
4 AT<br />
5 TAT<br />
6 TATA<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: problemy z de<strong>kodowanie</strong>m<br />
LZW: dekoder wie za mało?<br />
W jednym kroku:<br />
koder dodaje do słownika słowo wa i koduje w<br />
dekoder dekoduje w, ale nie zna jeszcze a !<br />
Rozwiazanie<br />
˛<br />
brakujac ˛ a˛<br />
literę odkodujemy w następnym kroku... jest nia˛<br />
pierwsza<br />
litera następnego odkodowanego fragmenty ... czyli pierwsza litera<br />
pozycji słownika, która˛<br />
odkodujemy jako następna.<br />
˛<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst:<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
Słownik:<br />
2 A<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
Słownik: 2 A<br />
3 T ?<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T A<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
2 A<br />
Słownik:<br />
3 T A<br />
4 A ?<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T A T A<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
2 A<br />
Słownik: 3 T A<br />
4 A T<br />
5 T A ?<br />
Problem:<br />
odkodowujemy pozycję 5, która nie jest do końca znana!<br />
ale zgodnie z reguła, ˛ ta pozycja jest równa pierwszej pozycji<br />
właśnie odkodowanej pozycji słownika, czyli T;<br />
zatem pozycja 5 jest równa T A T!<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T A T A T A T<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
2 A<br />
3 T A<br />
Słownik:<br />
4 A T<br />
5 T A T<br />
6 T A T ?<br />
Jurdziński<br />
Kompresja danych
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T A T A T A T A T<br />
Zakodowane: 1 2 3 5 4<br />
1 T<br />
2 A<br />
3 T A<br />
Słownik:<br />
4 A T<br />
5 T A T<br />
6 T A T A<br />
Jurdziński<br />
Kompresja danych
LZW: de<strong>kodowanie</strong><br />
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: algorytm dekodowania<br />
Dane: ciag ˛ liczb p 1 ,...,p n .<br />
Algorytm:<br />
Umieszczamy w słowniku S wszystkie możliwe ciagi<br />
˛<br />
jednoliterowe (czyli litery alfabetu).<br />
Dla i = 1,2,...,n,<br />
Jeśli w poprzednim kroku do słownika dodany był element w?, to<br />
zamień go na wS[p i ][1] (czyli pierwsza˛<br />
literę ze słowa o numerze<br />
p i )<br />
Do tekstu odkodowanego dołacz ˛ na koniec element słownika z<br />
pozycji p i , czyli S[p i ]<br />
do słownika dodaj element S[p i ]?.<br />
Jurdziński<br />
Kompresja danych
LZW: implementacja<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Jak przyspieszyć wyszukiwanie<br />
Wszystkie elementy słownika przechowujemy w strukturze trie.<br />
Jurdziński<br />
Kompresja danych
LZW: zastosowania<br />
Wstęp<br />
LZ77<br />
LZ78<br />
compress - Unix<br />
Modyfikacje LZW:<br />
rozmiar słownika zmienny (od 512 do 2 max , gdzie max ≤ 16),<br />
na poczatku ˛ rozmiar słownika to 512 (gdy słownik jest mniejszy,<br />
stosujemy krótsze słowa kodowe!)<br />
gdy słownik pełny i spada stopień kompresji - oczyszczanie<br />
słownika.<br />
Strategie oczyszczania słownika<br />
usunięcie wszystkiego i tworzenie od nowa;<br />
usuwanie najdawniej użytej pozycji;<br />
usuwanie pozycji najwcześniej wstawionej do słownika.<br />
Jurdziński<br />
Kompresja danych
LZW: zastosowania<br />
Wstęp<br />
LZ77<br />
LZ78<br />
GIF=Graphics Interchange Format<br />
Modyfikacje algorytmu LZW i format danych:<br />
poczatkowy ˛ rozmiar słownika to 2 b+1 , liczba 2 b oznacza kod<br />
oczyszczajacy ˛ (wystapienie ˛ go oznacza operację czyszczenia<br />
słownika)<br />
rozmiar słownika podwajany po wypełnieniu, do rozmiaru 4096<br />
pozycji (mało!); potem słownik statyczny<br />
Jurdziński<br />
Kompresja danych
LZW: zastosowania<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Kompresja danych przesyłanych przez modem - V.42 bis<br />
Modyfikacje LZW:<br />
rezygnacja z używania pozycji słownika, które nie jest znana w<br />
momencie dekodowania;<br />
słownik o dynamicznym rozmiarze (od 512 do 2048 lub więcej)<br />
kody sterujace ˛ umożliwiajace ˛ operacje: przejście do trybu<br />
przezroczystego (bez kompresji -np. dla danych<br />
skompresowanych, losowych); oczyszczenie słownika;<br />
zwiększenie rozmiaru słownika - oczyszczanie słownika<br />
stopniowe, zaczyna się od „najstarszych” wpisów.<br />
Jurdziński<br />
Kompresja danych