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