wstep˛ lz77 lz78 - ii.uni.wroc.pltju/komprdz06/komprdz06-wyklad05.pdf · wstep˛ lz77 lz78 lz78...

53
Wst ˛ ep LZ77 LZ78 Kompresja danych Tomasz Jurdzi´ nski Wyklad 5: kodowanie slownikowe Jurdzi ´ nski Kompresja danych

Upload: nguyennhu

Post on 27-Feb-2019

250 views

Category:

Documents


0 download

TRANSCRIPT

WstepLZ77LZ78

Kompresja danych

Tomasz Jurdzinski

Wykład 5: kodowanie słownikowe

Jurdzinski Kompresja danych

WstepLZ77LZ78

Motywacja

Motywacje1 zazwyczaj dane nie tworza ciagu wartosci niezaleznych, kolejny

symbol jest zalezny od poprzedzajacych go;2 pewne sekwencje (słowa) czesto sie powtarzaja.

Słowniki statyczne:

korzystamy z ustalonego słownika;tekst kodujemy jako ciag słów ze słownika, kazde słowokodowane przez jego pozycje w słowniku.Co z elementami, których brak w słowniku: mozna np. umiescicw nim pojedyncze litery.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Przykład: kodowanie digramowe

Przykład: kodowanie digramowe

słownik o ustalonej wielkosci sklada sie ze wszystkich liter i tylupar liter (digramów), ile sie w nim zmiesci (wybieramy najbardziejprawdopodobnepary).przykład: dla słownika o rozmiarze 256 i alfabetu zlozonego zdrukowalnych znaków ASCII, których jest 95, w słowniku moznaumiescic161 par.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Słowniki dynamiczne

Dlaczego słowniki statyczne nieskuteczne

Wrazliwe na zmiane charakteru danych.

Na czym polega słownik dynamiczny

dostosowany do charakteru danych;tworzony w trakcie kodowania;zmienia sie w trakcie kodowania;dekoder moze go odtworzyc w oparciu o odkodowana czescdanych (nie trzeba słownika dołaczac do danych);

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ77 czyli nietypowy słownik

LZ77Ziv i Lempel, 1977;Idea: słownikiem jest zakodowana/odkodowana czesc tekstu.Dokładniej:

dla zakodowanej czesci x1 . . .xn i niezakodowanej xn+1 . . .xmszukamy najdłuzszego podsłowa x1 . . .xn, które jest prefiksemxn+1 . . .xm, czyli dopasowania... i kodujemy ten prefiks poprzez wskazanie jego pozycji w x1 . . .xn.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Jak kodujemy dopasowanie

Kodowanie dopasowania

jako para (j ,k), gdziej to odległosc miedzy poczatkiem kodowanej czesci (pozycjan +1) a poczatkiem dopasowaniak to długosc dopasowania.

Przykład

tekst: ABXAXABAXAXBBABzakodowane: ABXAXABA, niezakodowane: XAXBBABnajdłuzsze dopasowanie ABXAXABAXAXBBABkodowanie: (6,3).

Jurdzinski Kompresja danych

WstepLZ77LZ78

Problem 1

Co z brakiem dopasowania

tekst: ABXAXABADAXBBABzakodowane: ABXAXABA, niezakodowane: DAXBBABnajdłuzsze dopasowanie: brak!rozwiazanie: (0,0,kod(D)).

gdzie kod jest pewnym ustalonym kodem prefiksowym dla alfabetuwejsciowego.

Ogólnie

Kodujemy dopasowanie przy pomocy trójkiprzesunieciedługosc dopasowaniakod symbolu wystepujacego za dopasowaniem wniezakodowanej czesci tekstu.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Kodowanie: przykłady

Sytuacja typowa

tekst: ABXAXABAXAXBBABzakodowane: ABXAXABA, niezakodowane: XAXBBABnajdłuzsze dopasowanie ABXAXABAXAXBBABkodowanie: (6,3,kod(B)).

Sytuacja nietypowa

tekst: ABXAXABADAXBBABzakodowane: ABXAXABA, niezakodowane: DAXBBABnajdłuzsze dopasowanie: brak!kodowanie: (0,0,kod(D)).

Jurdzinski Kompresja danych

WstepLZ77LZ78

Kodowanie: przykłady

Sytuacja nietypowa

Zaczynamy kodowanie, czyli czesc zakodowana jest pusta: pierwszalitere x1 kodujemy jako

(0,0,kod(x1))

czyli uznajemy, ze brakuje dopasowania.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Kodowanie: sytuacje nietypowe

Dopasowanie wybiega poza zakodowana czesc

tekst: ADABRARRARRADzakodowane: ADABRAR, niezakodowane: RARRADnajdłuzsze dopasowanie “standardowo”: ADABRARRARRADstandardowe kodowanie: (3,3,kod(R))....mozna wydłuzyc do 5 znaków: (3,5,kod(D))

Jurdzinski Kompresja danych

WstepLZ77LZ78

Kodowanie ogólnie

Ogólnie

dla zakodowanej czesci x1 . . .xn i niezakodowanej xn+1 . . .xm

szukamy najdłuzszego podsłowa x1 . . .xm, które zaczyna sie wczesci x1 . . .xn i jest prefiksem xn+1 . . .xm

... i kodujemy ten prefiks poprzez wskazanie przesuniecia,dopasowania i znaku za dopasowaniem:

(p,d ,kod(xn+1+d ))

gdzie xn+1−p . . .xn+1−p+d−1 = xn+1 . . .xn+1+d−1.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Problemy z kodowaniem

Problemy z kodowaniem trójek

wartosci przesuniecia z potencjalnie nieskonczonego zbioru;podobnie długosci dopasowania.

Efekty

nie mozemy stosowac kodów o stałej długosci;długi czas poszukiwania dopasowania!koniecznosc przechowywania (najlepiej) w pamieci operacyjnejcałej zakodowanej juz czesci tekstu.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ 77

Jak na prawde wyglada LZ77

bufor słownikowy: sufiks juz zakodowanej czesci tekstu, oustalonym rozmiarze s;bufor kodowania: prefiks jeszcze nie zakodowanej czesci tekstu,o ustalonym rozmiarze t ;okno: bufor słownikowy + bufor kodowania; rozmiar okna s + t .

LZ77: jak kodujemy

dopasowan szukamy tylko w buforze słownikowymdopasowanie nie moze wybiegac poza bufor kodowania(wczesniejszy tekst):

(p,d ,kod(xn+1+d ))

gdzie xn+1−p . . .xn+1−p+d−1 = xn+1 . . .xn+1+d−1 orazn +1−p +d −1≤ n +1+ t−1 (t : rozmiar bufora kodowania).

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ 77: długosc reprezentacji trójek

Kodujemy trójke (p,d ,kod(a))

p ≤ s, a zatem mozna zapisac na dlogse bitach;d ≤ s + t , a zatem mozna zapisac na dlog(s +d)e bitach;kod(a) zapisujemy na dlog |A|e bitach, gdzie A to alfabetwejsciowy.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ77: ostateczny algorytm kodowania

Krok algorytmu LZ77

Znajdz najdłuzsze dopasowanie dla prefiksu bufora kodowania wbuforze słownikowym: szukamy w buforze słownikowym odkonca (zakładamy, ze bardziej prawdopodobne sa powtórzenia wmałej odległosci).Zakoduj dopasowanie przy pomocy trójki: (p,d ,C), gdzie:

p to przesuniecie (odległosc poczatku najlepszego dopasowaniaod bufora kodowania)d to długosc dopasowaniaC to kod symbolu wystepujacego za dopasowanym prefiksembufora kodowania

Przesun okno o d +1 pozycji w prawo.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ77: przykład kodowania

Przykład

bufor słownikowy: s = 4;bufor kodowania: t = 4;kodowany tekst: aaaabababaaab$

aaaabababaaab$ 〈0,0,a〉aaaabababaaab$ 〈1,3,b〉aaaabababaaab$ 〈2,5,a〉aaaabababaaab$ 〈4,2,$〉

zielony: bufor kodowania, czerwony: bufor słownikowy.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ77: dekodowanie

Dekodowanie

Dane: Ciag trójek (p1,d1,kod(c1)) . . .(pn,dn,kod(cn)).Odkodowany tekst x zainicjuj jako tekst pusty.Dla i = 1,2, . . . ,n

do odkodowanego tekstu x = x1 . . .xm dołacz fragmentxm−pi+1 . . .xm−pi+di ci :

x ← x1 . . .xm xm−pi+1 . . .xm−pi+di ci .

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ77: implementacja

DekodowanieNie ma potrzeby wyszukiwania dopasowania: dekodowanie duzoprostsze.

Kodowanie

jak szybko mozna szukac dopasowan?

Jurdzinski Kompresja danych

WstepLZ77LZ78

Szukanie dopasowan

ZIP i GZIProzmiar okna: bufor słownikowy 32KB, bufor kodowania 258bajtów;reprezentacja “słownika” (czyli zawartosci bufora słownikowego):

tablica hashujaca pozycji poczatkowych dla ciagów 3-literowych;elementy tablicy to listy, w których na przodzie najpózniejsze wpisy(najblizsze dopasowania);wpisy spoza bufora słownikowego usuwane (“leniwie”, poodwiedzeniu ich).

krotki kodowane przy pomocy algorytmu Huffmana(adaptacyjnie, dla unikniecia 2 przebiegów);kodowanie w blokach.

Jurdzinski Kompresja danych

WstepLZ77LZ78

Szukanie dopasowan

Storer, Szymanski (w opisie LZSS)

bufor kodowania w kolejce cyklicznej;wszystkie t-elementowe podsłowa bufora słownikowego wdrzewie binarnym: szczegóły na cwiczeniach (t to rozmiar buforakodowania).

Jurdzinski Kompresja danych

WstepLZ77LZ78

Modyfikacje LZ77

Stopien kompresji

LZSS: usuwamy trzeci element, dodajemy flage bitowainformujaca do kazdej trójki, czy było niezerowe dopasowanie:

jesli nie, kodujemy tylko jeden znak jego standardowym kodem,jesli tak, kodujeym wartosci przesuniecia i długosci;

kompresje powstajacych trójek (Huffman, kodowaniearytmetyczne,...) lub trzeciego elementu trójki (np. w ZIP, ARJ),zmiana rozmiaru buforów w trakcie (de)kodowania.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ77: podsumowanie

Podsumowanieoparty na załozeniu: powtórzenia wystepuja w nieduzejodległosci;wiele zastosowan: zip, gzip, PNG, PKzip, arj, rar, ...kodowanie bardziej kosztowne od dekodowania, mozliwykompromis miedzy stopniem kompresji a szybkoscia algorytmu.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: idea

LZ78: idea

Cel: odejsc od załozenia, ze powtórzenia wystepuja w małejodległosci.Słownik: poindeksowany zbiór słów.Zawartosc słownika: tworzona w oparciu ozakodowana/odkodowana czesc tekstu.Kodowanie: ciag indeksów odowiadajacych słowom ze słownika.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78

LZ78: Algorytm 1

Słownik← zbiór pustyAz do zakodowania całego tekstu:

znajdz w- najdłuzszy prefiks niezakodowanej czesci tekstuwystepujacy w słowniku,symbol wystepujacy w niezakodowanej czesci tekstu za woznaczmy przez a, pozycje w w słowniku przez n,zakoduj 2a za pomoca pary (n,kod(a))UWAGA: jesli pierwszy znak niezakodowanej czesci tekstu niewystepuje w słowniku, to n = 0dodaj do słownika słowo wa.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: przykład

Tekst: T A T A T A T A TZakodowane:Słownik: pusty

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: przykład

Tekst: T A T A T A T A TZakodowane: (0, T)

Słownik: 1 T

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: przykład

Tekst: T A T A T A TZakodowane: (0, T) (0, A)

Słownik: 1 T2 A

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: przykład

Tekst: T A T A T A T A TZakodowane: (0, T) (0, A) (1,A)

Słownik:1 T2 A3 TA

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: przykład

Tekst: T A T A T A T A TZakodowane: (0, T) (0, A) (1,A) (3,T)

Słownik:

1 T2 A3 TA4 TAT

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: przykład

Tekst: T A T A T A T A T A TZakodowane: (0, T) (0, A) (1,A) (3,T) (2,T)

Słownik:

1 T2 A3 TA4 TAT5 AT

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: dekodowanie

LZ78: Algorytm dekodowania

Słownik← zbiór pustyOdkodowujemy pary na podstawie zawartosci słownika:

dla kolejnej pary (n,kod(a)) na koniec odkodowanej czesci tekstudodajemy xa, gdzie x to element słownika na pozycji n;jesli słownik nie jest pełen: po odkodowaniu xa (x - elementsłownika, a - znak za nim wystepujacy), dodajemy xa do słownika.

LZ78: kodowanie a dekodowaniekodowanie: szukamy najdłuzszego dopasowania do pozycji wsłowniku;dekodowanie: bez szukania dopasowan, kopiujemy odpowiedniefragmenty.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: stary problem...

Jak reprezentowac pary

pozycje w słowniku: jaki zakres? na ilu bitach?litery: ustalony kod stały.

LZ78: standardowe rozwiazanie

rozmiar słownika z góry ustalony;po wypełnieniu słownika, kodujemy kolejne dopasowania bezmodyfikacji słownika.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZ78: inny stary problem...

Co z drugim elementem kazdej pary

potrzebny dla pierwszych wystapien liter w tekscie; ALEzmniejsza stopien kompresji: czesc tekstu kodowana bezwykorzystania kontekstu!

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW, czyli optymalizujemy...

LZW: ideazamiast pary (pozycja, litera), kodujemy tylko pozycje w ,najdłuzszego dopasowania, ALEna poczatku w słowniku umieszczamy wszystkie symbolealfabetu, bo ...w przeciwnym razie nie moglibysmy zaczac kodowania ikontynuowac w momencie napotkania symbolu, od którego niezaczyna sie zadna pozycja słownika.

LZW: jak rozszerzamy słownik

zgodnie z LZ78: do słownika dodajemy konkatenacje zakodowanegoelementu słownika w i wystepujacego za nim znaku a.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: kodowanie

LZW: algorytm kodowania

Umiesc w słowniku wszystkie mozliwe ciagi jednoliterowe (czylilitery alfabetu).Dopóki niezakodowana czesc tekstu nie jest pusta:

znajdz w najdłuzszy prefiks niezakodowanej czesci tekstu, którywystepuje w słowniku;zakoduj w jako n, jego pozycje w słowniku;dodaj do słownika wa, gdzie a jest symbolem wystepujacym zaprefiksem w w niezakodowanej czesci tekstu.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład kodowania

Tekst: T A T A T A T A TZakodowane:

Słownik: 1 T2 A

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład kodowania

Tekst: T A T A T A T A TZakodowane: 1

Słownik:1 T2 A3 TA

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład kodowania

Tekst: T A T A T A T A TZakodowane: 1 2

Słownik:

1 T2 A3 TA4 AT

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład kodowania

Tekst: T A T A T A T A TZakodowane: 1 2 3

Słownik:

1 T2 A3 TA4 AT5 TAT

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład kodowania

Tekst: T A T A T A T A TZakodowane: 1 2 3 5

Słownik:

1 T2 A3 TA4 AT5 TAT6 TATA

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład kodowania

Tekst: T A T A T A T A TZakodowane: 1 2 3 5 4

Słownik:

1 T2 A3 TA4 AT5 TAT6 TATA

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: problemy z dekodowaniem

LZW: dekoder wie za mało?W jednym kroku:

koder dodaje do słownika słowo wa i koduje wdekoder dekoduje w , ale nie zna jeszcze a !

Rozwiazanie

brakujaca litere odkodujemy w nastepnym kroku... jest nia pierwszalitera nastepnego odkodowanego fragmenty ... czyli pierwsza literapozycji słownika, która odkodujemy jako nastepna.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład dekodowania

Tekst:Zakodowane: 1 2 3 5 4

Słownik: 1 T2 A

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład dekodowania

Tekst: TZakodowane: 1 2 3 5 4

Słownik:1 T2 A3 T ?

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład dekodowania

Tekst: T AZakodowane: 1 2 3 5 4

Słownik:

1 T2 A3 T A4 A ?

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład dekodowania

Tekst: T A T AZakodowane: 1 2 3 5 4

Słownik:

1 T2 A3 T A4 A T5 T A ?

Problem:odkodowujemy pozycje 5, która nie jest do konca znana!ale zgodnie z reguła, ta pozycja jest równa pierwszej pozycjiwłasnie odkodowanej pozycji słownika, czyli T;zatem pozycja 5 jest równa T A T!

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład dekodowania

Tekst: T A T A T A TZakodowane: 1 2 3 5 4

Słownik:

1 T2 A3 T A4 A T5 T A T6 T A T ?

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: przykład dekodowania

Tekst: T A T A T A T A TZakodowane: 1 2 3 5 4

Słownik:

1 T2 A3 T A4 A T5 T A T6 T A T A

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: dekodowanie

LZW: algorytm dekodowania

Dane: ciag liczb p1, . . . ,pn.Algorytm:

Umieszczamy w słowniku S wszystkie mozliwe ciagijednoliterowe (czyli litery alfabetu).Dla i = 1,2, . . . ,n,

Jesli w poprzednim kroku do słownika dodany był element w?, tozamien go na wS[pi ][1] (czyli pierwsza litere ze słowa o numerzepi )Do tekstu odkodowanego dołacz na koniec element słownika zpozycji pi , czyli S[pi ]do słownika dodaj element S[pi ]?.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: implementacja

Jak przyspieszyc wyszukiwanie

Wszystkie elementy słownika przechowujemy w strukturze trie.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: zastosowania

compress - Unix

Modyfikacje LZW:rozmiar słownika zmienny (od 512 do 2max, gdzie max≤ 16),na poczatku rozmiar słownika to 512 (gdy słownik jest mniejszy,stosujemy krótsze słowa kodowe!)gdy słownik pełny i spada stopien kompresji - oczyszczaniesłownika.

Strategie oczyszczania słownika

usuniecie wszystkiego i tworzenie od nowa;usuwanie najdawniej uzytej pozycji;usuwanie pozycji najwczesniej wstawionej do słownika.

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: zastosowania

GIF=Graphics Interchange Format

Modyfikacje algorytmu LZW i format danych:poczatkowy rozmiar słownika to 2b+1, liczba 2b oznacza kodoczyszczajacy (wystapienie go oznacza operacje czyszczeniasłownika)rozmiar słownika podwajany po wypełnieniu, do rozmiaru 4096pozycji (mało!); potem słownik statyczny

Jurdzinski Kompresja danych

WstepLZ77LZ78

LZW: zastosowania

Kompresja danych przesyłanych przez modem - V.42 bis

Modyfikacje LZW:rezygnacja z uzywania pozycji słownika, które nie jest znana wmomencie dekodowania;słownik o dynamicznym rozmiarze (od 512 do 2048 lub wiecej)kody sterujace umozliwiajace operacje: przejscie do trybuprzezroczystego (bez kompresji -np. dla danychskompresowanych, losowych); oczyszczenie słownika;zwiekszenie rozmiaru słownika - oczyszczanie słownikastopniowe, zaczyna sie od „najstarszych” wpisów.

Jurdzinski Kompresja danych