380 likes | 528 Views
Data Compression using Antidictionaries. Seminarium: Kompresja danych Marta Cylkowska. Plan seminarium. Przedstawienie metody Dane: tekst T o o długości N Wynik: < M, b 1 b 2 …b n , N > Wyszukiwanie wzorca Dane: wzorzec P o długości m ; wynik kompresji
E N D
Data Compression using Antidictionaries Seminarium: Kompresja danych Marta Cylkowska
Plan seminarium • Przedstawienie metody • Dane: tekst To o długości N • Wynik: <M, b1b2…bn, N> • Wyszukiwanie wzorca • Dane: wzorzec P o długości m; wynik kompresji • Wynik: wszystkie wystąpienia wzorca P w To
Założenia • Alfabet 2-literowy Σ = {0, 1} • Antysłownik – zbiór słów, których nie ma w To • Przykład • Antysłownik: {0101, 111, 1100} • Zakodowana postać: 1110 1 1 011 0 1
Antysłownik • Definicja Słowo zabronione – nie występuje w To Minimalne słowo zabronione – nie zawiera zabronionego podsłowa Antysłownik – zbiór minimalnych słów zabronionych • ||M|| - suma długości wszystkich słów z M
Przykłady antysłowników • Tekst To: 11010001 • M = {0000, 111, 011, 0101, 1100} brak 1001 • M = {111} • Negatywne przykłady: • M = {1110} • M = {001, 000}
Kolejny przykład dekodowania • Co jest potrzebne do dekodowania? • M = {00, 010, 111} • T = 10 (tekst zakodowany) 1 0 110110110… Jaki jest tekst oryginalny?? • Potrzebna jest długość To
Kodowanie • Wyznaczenie antysłownika • Czas O(||M||) • ||M|| < 2N – 1 • Budowa automatu skończonego • Czas O(||M||) • Przejście przez automat • Czas O(N) • Wynik: <M, b1b2…bn,N>
0,1 0 4 0,1 1 7 0,1 1 8 0,1 0 12 1 0,1 13 Automat • M = {0000, 111, 011, 0101, 1100} 0 0 0 2 0 1 3 1 1 1 0 5 6 0 0 1 1 11 9 1 10 0
Budowa automatu (ogólnie) • Umieść kolejno słowa z M w automacie • Ustal funkcję przejścia • δ(u, a) = najdłuższy sufiks ua, który jest prefiksem słowa z M (gdy u nie jest z M) • Automat jako drzewo. • ~ Przechodząc wszerz ustalamy funkcję przejścia na podstawie obliczonych już funkcji dla przodków • Ustal typ wierzchołków: Q0, Q1,Q2 • Czas: O||M|| • Rozmiar automatu: O||M||
Przejście przez automat • Niech a będzie kolejną literą tekstu • u – aktualny stan automatu • M = {0000, 111, 011, 0101, 1100} • Przykład: To = 1 1 0 1 0 0 0 1 1 1 εεεε0 ε = 110
Dekodowanie • Korzysta z tego samego automatu • Gdy stan Q1 to wykonujemy ε-ruchy • Oznaczenia: • Terminal(p) – stan po wykonaniu wszystkich ε-ruchów • Sequence(p) – słowo powstałe na ścieżce od p do Terminal(p) • Gdy automat ma pętle: • Terminal(p) = ┴ • Sequence(p) nieskończone
0/0 1/100 0/0100 1/100 0/0 0/0 1/1 1/10100 Automat bez ε-ruchów • Reprezentacja bez ε-ruchów: • δG(u, a) = Terminal(δ(u, a)) (przejście) • λG(u, a) = a∙Sequence(δ(u, a)) (słowo) 0 2 1 9
Słowa nieskończone • Definicja automatu • δG(u, a) = Terminal(p) = ┴ • λG(u, a) = a∙Sequence(p) = a∙uvvv…= a∙uv* • Gdy dekoder jest w takim stanie, to… • Znaczy, że przeczytał wszystko co miał na wejściu • Teraz doczyta tyle liter z Sequence(p), aby tekst miał długośćN
0 0 0 2 0 1 3 1 1 1 0 5 6 0 0 1 1 11 9 1 10 0 0/0 1/100 0/0100 1/100 0 0/0 2 1 0/0 1/1 1/10100 9 Automat oryginalny A(M) Automat zmodyfikowany G(M)
Dekodowanie – algorytm • Dane: <M, b1b2…bn, N> • Algorytm: • l := 0 długość odkodowanego już tekstu • q := ε aktualny stan • for i:=1 to n – 1 czytamy do przedostatniej litery! • u := λG(q, bi) odczytanie słowa • wypisz u • q := δG(u, bi) przejście do kolejnego stanu • l := l + |u| aktualizacja długości • u := λG(q, bn) odczytanie słowa dla ostatniej litery • wypisz prefiks u o długości N – l
Definicja problemu • Dane: • <M, b1b2…bn, N> - skompresowana postać To • P – wzorzec nieskompresowany, |P| = m • Wynik • Occurences(P, To) – zbiór wystąpień (pozycji końcowych)
Możliwe rozwiązania i złożoność • Przypomnienie oznaczeń: • N – długość tekstu przed kompresją • C – długość skompresowanego tekstu, całości • m – długość wzorca, postać jawna • Odkodować tekst i wyszukać w nim wzorzec • Złożoność: • O(N) Algorytm efektywny • O(C∙logm+m) Algorytm prawie optymalny • O(C+m) Algorytm optymalny
Algorytm wyszukiwania wzorca • Preprocessing: O(||M||+m2) • Skanowanie tekstu O(n) • Tekst po kompresji C = ||M||+n+logN • Czas algorytmu: O(C+m2)
Pomocniczy automat • Automat KMP dla wzorca P • Dla słowa u wyznacza najdłuższy jego sufiks będący prefiksem wzorca P • Trochę inny automat, można przerobić do zwykłego niedopasowanie 0 1 1 0 0 1 2 3 4 niedopasowanie niedopasowanie niedopasowanie Σ
P u j 1 w Pomocniczy zbiór AKMP = Occurences(P, w)
Skanowanie tekstu • l := 0 długość skanowanego tekstu gdyby był odkodowany • q := εaktualny stan • state := 0 stan w automacie KMP • for i:=1 to n – 1 czytamy do przedostatniej litery! • u := λG(q, bi) odczytanie słowa • q := δG(u, bi) przejście do kolejnego stanu • dla każdego p z AKMP(state, u) jest wystąpienie na pozycji l + p • q := δKMP(state, u) przejście do kolejnego stanu w automacie KMP • l := l + |u| aktualizacja długości • u := λG(q, bn) odczytanie słowa dla ostatniej litery • dla każdego p z AKMP(state, u) że l + p < N + 1 jest wystąpienie na pozycji l + p • Skanowanie ma zająć czas O(n + r) • Wszystkie funkcje muszą być obliczane w czasie stałym (preprocessing)
Preprocessing • Czas: O(||M||+m2) • λG(q, bi) O(||M||) • δG(u, bi) O(||M||) • δKMP(state, u) O(||M||+m2) • AKMP(state, u) O(||M||+m2) • Suffix TRIE dla P, PR O(m2) • Automat KMP dla P, PR O(m) • Automat A(M) O(||M||) • Graf ścieżek predykcyjnych O(||M||)
0 1 1 0 0 0/0 1/100 0/0100 1/100 0 0/0 2 1 1 0/0 1/1 1/10100 1 0 9 Automaty przypomnienie Automat zmodyfikowany G(M) Funkcja przejścia: δG(u, b) Słowa na krawędziach: λG(q, b) 0 0 0 2 1 3 Automat oryginalny A(M) Funkcja przejścia: δ(u, b) 1 5 6 0 1 11 9 10
Graf ścieżek predykcyjnych • Zawiera krawędzie wychodzące z wierzchołków z Q1 • Wierzchołki pomocnicze <u;b>, takie że δG(u, b) jest w Q1 2;1 1 0 2;0 10 1 0 1 0 1 0 10 5 9;1 11 6 2 1 1;1
Wyznaczanie automatu G(M) • Obliczenie fukcji δG(u,b) na podstawie δ(u,b) • δG(u,b) = δ(u,b), gdy • dla pozostałych wierzchołków (pomocnicze tylko) obliczymy przechodząc drzewo • wierzchołek q – korzeń • δG(u,b) =q • Co gdy nie ma korzenia?
k P u j 1 1 n P Wyznaczanie δKMP(j, u) • N1(j, u) – maksymalne k, że P[j – k + 1 … j]∙u jest prefiksem P • N1(j, u) = null gdy nie istnieje takie k
Wyznaczanie δKMP(0, u) • Gdy |u| = 1 to nie ma problemu • Wpp należy przejść graf ścieżek predykcyjnych od końca • δKMP(0, u)=max sufiksu, będący prefiksemP • δKMP(0, u)=max prefiksuR, będący sufiksemP • Przejść drzewo sufiksowe wg słowa uR
Wyznaczanie λG(q, b) = u • Wynik – wierzchołek TRIE dla P • Warunek: λG(q, b) jest podsłowem P • Jak poprzednio przejść graf otrzymując uR • W TRIE dla PR sprawdzić czy uR jest podsłowem PR (u jest podsłowem P) • Znaleźć odpowiedniość między TRIE dla P a PR • Wystarczy naiwnie w czasie O(m2)
Wyznaczanie N1(j, u) • Ma sens gdy u jest podsłowem P • Gdy u jest dane jako wierzchołek w TRIE, to można wyznaczyć N1(j, u) w czasie O(||M||+m2) • Wyznaczane na podstawie poprzedniej funkcji
Co osiągnęliśmy już? • Umiemy obliczać δKMP(j, u) • λG(q, b) • δG(u, b) • Brakuje tylko preprocessingu dla zbioru
Wyznaczanie zbioru AKMP(j, u) • Zawiera nowe wystąpienia wzorca po przeczytaniu nowego słowa u • Podzielmy wystąpienia na 2 rozłączne zbiory: • X(u) – wystąpienia zawarte w u (|P|..|u|) • Y(j, u) – wystąpienia nie zawarte w u (1..|P-1|)
0 0 0 0 0 0 Wyznaczanie zbioru X(u) • Przechodzimy graf ścieżek predykcyjnych • Automat KMP dla PRwyznaczy wystąpienia PR w uR • Wystąpienia jako pozycje początkowe w u • Zaznacz wierzchołki na ścieżce predykcji, gdzie były wystąpienia • Dla każdego zaznaczonego wierzchołka utwórz wskaźnik do najbliższego zaznaczonego poprzednika • Czas preprocessingu: O(||M|| + m) • Czas wyznaczenia zbioru X(u) dla danego u – O(|X(u)|)
Wyznaczanie zbioru Y(j, u) • Y(j, u) = Y(j, u*) • u* - najdłuższy prefiks u, bedący właściwym sufiksem P • Y(j, u*) = wystąpienia P w słowie P[1 … j] ∙ P[m–|u*|+1 … m] • Y(j, k) można wyznaczyć w czasie O(||M||+m2) • Y(j, k) można reprezentować w stałej pamięci
Wyznaczanie u* • u* - największy prefiks u, bedący właściwym sufiksem P • u* - największy sufiks uR, bedący właściwym prefiksem PR • Automat KMP dla PR • Jeszcze przypadek nieskończonego słowa • (xv*)R≈(vR)*x • Przeczytać k razy, k min, że k∙|v| > P
Algorytm • Preprocessing • l := 0; q := ε; state := 0 • for i:=1 to n – 1 • u := λG(q, bi) • q := δG(u, bi) • dla każdego p z AKMP(state, u) jest wystąpienie na pozycji l + p • q := δKMP(state, u) • l := l + |u| • u := λG(q, bn) • foreach p z AKMP(state, u) takiego że l + p < N + 1 jest wystąpienie na pozycji l + p