Kodowanie informacji
Kodowanie informacji Kodowanie informacji
Wstęp LZ77 LZ78 Kodowanie informacji Tomasz Jurdziński Wykład 4: kodowanie słownikowe Jurdziński Kodowanie informacji
- Page 2 and 3: Motywacja Wstęp LZ77 LZ78 Motywacj
- Page 4 and 5: Słowniki dynamiczne Wstęp LZ77 LZ
- Page 6 and 7: Wstęp LZ77 LZ78 Jak kodujemy dopas
- Page 8 and 9: Kodowanie: przykłady Wstęp LZ77 L
- Page 10 and 11: Wstęp LZ77 LZ78 Kodowanie: sytuacj
- Page 12 and 13: Wstęp LZ77 LZ78 Problemy z kodowan
- Page 14 and 15: Wstęp LZ77 LZ78 LZ 77: długość
- Page 16 and 17: Wstęp LZ77 LZ78 LZ77: przykład ko
- Page 18 and 19: LZ77: implementacja Wstęp LZ77 LZ7
- Page 20 and 21: Szukanie dopasowań Wstęp LZ77 LZ7
- Page 22 and 23: LZ77: podsumowanie Wstęp LZ77 LZ78
- Page 24 and 25: LZ78 Wstęp LZ77 LZ78 LZ78: Algoryt
- Page 26 and 27: LZ78: przykład Wstęp LZ77 LZ78 Te
- Page 28 and 29: LZ78: przykład Wstęp LZ77 LZ78 Te
- Page 30 and 31: LZ78: przykład Wstęp LZ77 LZ78 Te
- Page 32 and 33: LZ78: stary problem... Wstęp LZ77
- Page 34 and 35: Wstęp LZ77 LZ78 LZW, czyli optymal
- Page 36 and 37: Wstęp LZ77 LZ78 LZW: przykład kod
- Page 38 and 39: Wstęp LZ77 LZ78 LZW: przykład kod
- Page 40 and 41: Wstęp LZ77 LZ78 LZW: przykład kod
- Page 42 and 43: Wstęp LZ77 LZ78 LZW: przykład dek
- Page 44 and 45: Wstęp LZ77 LZ78 LZW: przykład dek
- Page 46 and 47: Wstęp LZ77 LZ78 LZW: przykład dek
- Page 48 and 49: LZW: implementacja Wstęp LZ77 LZ78
- Page 50 and 51: LZW: zastosowania Wstęp LZ77 LZ78
Wstęp<br />
LZ77<br />
LZ78<br />
<strong>Kodowanie</strong> <strong>informacji</strong><br />
Tomasz Jurdziński<br />
Wykład 4: kodowanie słownikowe<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
Motywacja<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Motywacje<br />
1<br />
kodowane dane nie tworza˛<br />
ciagu ˛ wartości niezależnych, rozkład<br />
prawdopodobieństwa zależy od symboli poprzedzajacych ˛ symbol<br />
kodowany;<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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
Przykład: kodowanie digramowe<br />
Przykład: kodowanie digramowe<br />
słownik o ustalonej wielkości składa się ze wszystkich liter i tylu<br />
par liter, ile się w nim zmieści (wybieramy najbardziej<br />
prawdopodobne pary).<br />
przykład: dla słownika o rozmiarze 256 i alfabetu złoż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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
Jak kodujemy dopasowanie<br />
<strong>Kodowanie</strong> 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 />
kodowanie: (6,3).<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
<strong>Kodowanie</strong>: 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 />
kodowanie: (6,3,kod(B)).<br />
Sytuacja nietypowa<br />
tekst: ABXAXABADAXBBAB<br />
zakodowane: ABXAXABA, niezakodowane: DAXBBAB<br />
najdłuższe dopasowanie: brak!<br />
kodowanie: (0,0,kod(D)).<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
<strong>Kodowanie</strong>: przykłady<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Sytuacja nietypowa<br />
Zaczynamy kodowanie, 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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
<strong>Kodowanie</strong>: 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 kodowanie: (3,3,kod(R))....<br />
można wydłużyć do 5 znaków: (3,5,kod(D))<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
<strong>Kodowanie</strong> 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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
Problemy z kodowaniem<br />
Problemy z kodowaniem 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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
LZ77: dekodowanie<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Dekodowanie<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 />
Przetwarzaj trójkę (p i ,d i ,kod(c i )):<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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
LZ77: implementacja<br />
Wstęp<br />
LZ77<br />
LZ78<br />
Dekodowanie<br />
Nie ma potrzeby wyszukiwania dopasowania: dekodowanie dużo<br />
prostsze.<br />
<strong>Kodowanie</strong><br />
jak szybko można szukać dopasowań?<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 słownikowego):<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 słownikowego usuwane (“leniwie”, po<br />
odwiedzeniu ich).<br />
krotki kodowane przy pomocy algorytmu Huffmana<br />
(adaptacyjnie, dla uniknięcia 2 przebiegów);<br />
kodowanie w blokach.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 słownikowego w<br />
drzewie binarnym: szczegóły na ćwiczeniach.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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, kodowanie<br />
arytmetyczne,...) lub trzeciego elementu trójki (np. w ZIP, ARJ),<br />
zmiana rozmiaru buforów w trakcie (de)kodowania.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
kodowanie bardziej kosztowne od dekodowania, możliwy<br />
kompromis między stopniem kompresji a szybkościa˛<br />
algorytmu.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong>: ciag ˛ indeksów odowiadajacych ˛ słowom ze słownika.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 wa 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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
LZ78: dekodowanie<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: kodowanie a dekodowanie<br />
kodowanie: szukamy najdłuższego dopasowania do pozycji w<br />
słowniku;<br />
dekodowanie: bez szukania dopasowań, kopiujemy odpowiednie<br />
fragmenty.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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;<br />
zmniejsza stopień kompresji: część tekstu kodowana bez<br />
wykorzystania kontekstu!<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW, czyli optymalizujemy...<br />
LZW: idea<br />
zamiast pary (pozycja, litera), kodujemy tylko pozycję w słowniku<br />
znalezionego w nim prefiksu niezakodowanej części tekstu w,<br />
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
LZW: kodowanie<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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: 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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład kodowania<br />
Tekst: T A T A T A T<br />
Zakodowane: 1 2 3 5<br />
1 T<br />
2 A<br />
Słownik: 3 TA<br />
4 AT<br />
5 TAT<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: problemy z dekodowaniem<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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst:<br />
Zakodowane: 1 2 3 5<br />
1 T<br />
Słownik:<br />
2 A<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T<br />
Zakodowane: 1 2 3 5<br />
1 T<br />
Słownik: 2 A<br />
3 T ?<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T A<br />
Zakodowane: 1 2 3 5<br />
1 T<br />
2 A<br />
Słownik:<br />
3 T A<br />
4 A ?<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
Wstęp<br />
LZ77<br />
LZ78<br />
LZW: przykład dekodowania<br />
Tekst: T A T A<br />
Zakodowane: 1 2 3 5<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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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<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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
LZW: dekodowanie<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 pi [1] (czyli pierwsza˛<br />
literę ze słowa o numerze p i )<br />
Do tekstu odkodowanego dołacz ˛ na koniec element słownika z<br />
pozycji p i , czyli S pi<br />
do słownika dodaj element S pi ?.<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>
LZW: zastosowania<br />
Wstęp<br />
LZ77<br />
LZ78<br />
GIF=Graphics Interchange Format<br />
Modyfikacje algorytmu LZW i format danych:<br />
pierwszy bajt pliku określa b, minimalna˛<br />
liczbę bitów na piksel (w<br />
postaci zakodowanej)<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 />
organizacja danych: podział na bloki znaków (o długości co<br />
najwyżej 255), blok zakończony kodem końca bloku,<br />
poprzedzony informacja˛<br />
o jego długości (możliwość pomijania<br />
fragmentów, korekcja błędów).<br />
Jurdziński<br />
<strong>Kodowanie</strong> <strong>informacji</strong>
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 />
<strong>Kodowanie</strong> <strong>informacji</strong>