Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
WstepLZ77LZ78
Kodowanie informacji
Tomasz Jurdzinski
Wykład 4: kodowanie słownikowe
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
Motywacja
Motywacje1 kodowane dane nie tworza ciagu wartosci niezaleznych, rozkład
prawdopodobienstwa zalezy od symboli poprzedzajacych symbolkodowany;
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 Kodowanie informacji
WstepLZ77LZ78
Przykład: kodowanie digramowe
Przykład: kodowanie digramowe
słownik o ustalonej wielkosci składa sie ze wszystkich liter i tylupar liter, ile sie w nim zmiesci (wybieramy najbardziejprawdopodobne pary).przykład: dla słownika o rozmiarze 256 i alfabetu złozonego zdrukowalnych znaków ASCII, których jest 95, w słowniku moznaumiescic161 par.
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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;
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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
Przetwarzaj trójke (pi ,di ,kod(ci)):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 Kodowanie informacji
WstepLZ77LZ78
LZ77: implementacja
DekodowanieNie ma potrzeby wyszukiwania dopasowania: dekodowanie duzoprostsze.
Kodowanie
jak szybko mozna szukac dopasowan?
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
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.
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 wa 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 Kodowanie informacji
WstepLZ77LZ78
LZ78: przykład
Tekst: T A T A T A T A TZakodowane:Słownik: pusty
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZ78: przykład
Tekst: T A T A T A T A TZakodowane: (0, T)
Słownik: 1 T
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZ78: przykład
Tekst: T A T A T A TZakodowane: (0, T) (0, A)
Słownik: 1 T2 A
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
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 Kodowanie informacji
WstepLZ77LZ78
LZ78: inny stary problem...
Co z drugim elementem kazdej pary
potrzebny dla pierwszych wystapien liter w tekscie;zmniejsza stopien kompresji: czesc tekstu kodowana bezwykorzystania kontekstu!
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW, czyli optymalizujemy...
LZW: ideazamiast pary (pozycja, litera), kodujemy tylko pozycje w słownikuznalezionego w nim prefiksu niezakodowanej czesci tekstu w ,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 Kodowanie informacji
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 Kodowanie informacji
WstepLZ77LZ78
LZW: przykład kodowania
Tekst: T A T A T A T A TZakodowane:
Słownik: 1 T2 A
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW: przykład kodowania
Tekst: T A T A T A T A TZakodowane: 1
Słownik:1 T2 A3 TA
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
WstepLZ77LZ78
LZW: przykład kodowania
Tekst: T A T A T A TZakodowane: 1 2 3
Słownik:
1 T2 A3 TA4 AT5 TAT
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW: przykład kodowania
Tekst: T A T A T A TZakodowane: 1 2 3 5
Słownik:
1 T2 A3 TA4 AT5 TAT
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
WstepLZ77LZ78
LZW: przykład dekodowania
Tekst:Zakodowane: 1 2 3 5
Słownik: 1 T2 A
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW: przykład dekodowania
Tekst: TZakodowane: 1 2 3 5
Słownik:1 T2 A3 T ?
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW: przykład dekodowania
Tekst: T AZakodowane: 1 2 3 5
Słownik:
1 T2 A3 T A4 A ?
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW: przykład dekodowania
Tekst: T A T AZakodowane: 1 2 3 5
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 Kodowanie informacji
WstepLZ77LZ78
LZW: przykład dekodowania
Tekst: T A T A T A TZakodowane: 1 2 3 5
Słownik:
1 T2 A3 T A4 A T5 T A T6 T A T ?
Jurdzinski Kodowanie informacji
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 wSpi [1] (czyli pierwsza litere ze słowa o numerze pi )Do tekstu odkodowanego dołacz na koniec element słownika zpozycji pi , czyli Spi
do słownika dodaj element Spi ?.
Jurdzinski Kodowanie informacji
WstepLZ77LZ78
LZW: implementacja
Jak przyspieszyc wyszukiwanie
Wszystkie elementy słownika przechowujemy w strukturze trie.
Jurdzinski Kodowanie informacji
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 Kodowanie informacji
WstepLZ77LZ78
LZW: zastosowania
GIF=Graphics Interchange Format
Modyfikacje algorytmu LZW i format danych:pierwszy bajt pliku okresla b, minimalna liczbe bitów na piksel (wpostaci zakodowanej)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 statycznyorganizacja danych: podział na bloki znaków (o długosci conajwyzej 255), blok zakonczony kodem konca bloku,poprzedzony informacja o jego długosci (mozliwosc pomijaniafragmentów, korekcja błedów).
Jurdzinski Kodowanie informacji
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 Kodowanie informacji