24.01.2014 Views

Wyklad 5 (kodowanie słownikowe)

Wyklad 5 (kodowanie słownikowe)

Wyklad 5 (kodowanie słownikowe)

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!