|
LZSS jest nazwą słownikowej metody bezstratnej kompresji danych. LZSS jest to ulepszony wariant metody LZ77. Nazwa metody pochodzi od nazwisk: Lempel-Ziv-Storer-Szymanski, została opracowana przez J.A. Storera i T.G. Szymanskiego i opisana w 1982 roku w Journal of the ACM, w artykule pt. "Data compression via textual substitution" (str. 928-951). Algorytm LZSS jest używany między innymi w programach PKZIP i ARJ.
Algorytm kompresjiMetoda LZSS, tak samo jak LZ77, używa bufora, podzielonego na dwie części:
Wartości n i k są dobierane tak, aby były potęgami dwójki. Rozmiar słownika jest dużo większy niż bufora wejściowego, w praktyce ma kilka-kilkadziesiąt kilobajtów. W każdym kroku algorytmu w słowniku wyszukiwany jest najdłuższy podciąg równy początkowi bufora wejściowego, charakteryzowany parą ( Algorytm LZ77 wypisuje na wyjście trójki (P,C,S), nawet wtedy, gdy trójka ma większą długość niż opisywaną przez nią ciąg. Algorytm LZSS wypisuje na wyjście tylko pary (P,C), ale bierze przy tym pod uwagę fakt, czy para nie zajmuje więcej bitów niż opisywany przez nią ciąg symboli. Jeśli kodowany ciąg jest dłuższy niż para, wówczas opłaca się wypisać na wyjście parę, w przeciwnym razie na wyjście wypisywany jest tylko pierwszy symbol z bufora wejściowego S'. W celu odróżnienia symbolu od pary, poprzedza się je pojedynczym bitem:
Formalnie algorytm kompresji przebiega następująco:
Uwaga: ponieważ w przypadku wypisywania pary liczba C nigdy nie będzie miała wartości 0 ani 1, toteż można zmniejszyć liczbę bitów wymaganą do zapisania C poprzez przypisanie wartości binarnej 0 liczby 2, wartości binarnej 1 liczby 3, itd. Np. dla n = 4 do zapisania C należałoby przeznaczyć 3 bity, a przy takim przyporządkowaniu wystarczą 2 bity. Przykładowy krok algorytmu1. Wyszukanie najdłuższego podciągu równego początkowi bufora wejściowego (tutaj: aac).
słownik | bufor wejściowy | nieprzetworzone symbole
0 1 2 3 4 5 6 7 | 0 1 2 3 4 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----
| a | a | a | | | | a | b | | | | b | a | c | a | b | a | c | ...
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----
| okno |
2. Wynik wyszukiwania: P = 2 (pozycja w słowniku) C = 3 (długość podciągu) 3. Przyjmując, że para (P,C) zajmuje mniej niż ciąg aac - przesunięcie bufora o C pozycji, dopisanie do bufora wejściowego nieprzetworzonych symboli.
słownik | bufor wejściowy | nieprzetworzone symbole
0 1 2 3 4 5 6 7 | 0 1 2 3 4 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---------------------
| | | | a | b | | | | b | a | c | a | b | a | c | ...
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---------------------
4. Przyjmując, że para (P,C) zajmuje więcej bitów niż kodowany ciąg - przesunięcie bufora o 1 pozycję, wprowadzenie do bufora wejściowego jedengo symbolu.
słownik | bufor wejściowy | nieprzetworzone symbole
0 1 2 3 4 5 6 7 | 0 1 2 3 4 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----
| a | a | | | | a | b | | | | b | a | c | a | b | a | c | ...
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----
Algorytm dekompresjiDo dekompresji potrzebny jest bufor o dokładnie takim samym rozmiarze jak przy kompresji; jest on podzielony na słownik (k symboli) i bufor wyjściowy (n symboli).
Przykład kompresjiSłownik i bufor wejściowy będą miały rozmiar 4 (n = k = 4) a więc do zapisu liczby P i C wystarczą po 2 bity. Przyjmijmy także, że kodowane symbole to bajty (tak jest najczęściej). Wówczas:
Kompresji zostanie poddany 12-elementowy ciąg aabbcabbcabd.
Rozmiar danych przed kompresją: Rozmiar danych po kompresji:
W sumie 55 bitów, co daje współczynnik kompresji ok. 42%. Przykład dekompresjiZostaną zdekompresowane dane z poprzedniego przykładu.
Jak widać na wyjście zostały wypisane dokładnie te same symbole, które zostały uprzednio skompresowane. Bibliografia
Zobacz też |
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net