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