Movatterモバイル変換


[0]ホーム

URL:


Przejdź do zawartości
Wikipediawolna encyklopedia
Szukaj

LZSS

Z Wikipedii, wolnej encyklopedii

LZSSsłownikowa metodabezstratnej kompresji danych. LZSS jest ulepszonym wariantem metodyLZ77.

Nazwa metody pochodzi od nazwisk: Lempel-Ziv-Storer-Szymanski, została opracowana przez Jamesa A. Storera i Thomasa G. Szymanskiego i opisana w 1982 roku wJournal of the ACM, w artykule pt.Data compression via textual substitution (s. 928–951).

Algorytm LZSS jest używany między innymi w programachPKZIP iARJ.

Algorytm kompresji

[edytuj |edytuj kod]

Metoda LZSS, tak samo jak LZ77, używabufora, podzielonego na dwie części:

Wartościn{\displaystyle n} ik{\displaystyle 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ątkilobajtó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ą (P[0k1],{\displaystyle P\in [0\ldots k-1],}C[2n]{\displaystyle C\in [2\ldots n]}), gdzieP{\displaystyle P} – indeks początku podciągu,C{\displaystyle C} – jego długość. Symbol w buforze następujący po dopasowanym ciągu oznaczmy jakoS.{\displaystyle S.}

Algorytm LZ77 wypisuje na wyjście trójki(P,C,S),{\displaystyle (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),{\displaystyle (P,C),} ale bierze przy tym pod uwagę fakt, czy para nie zajmuje więcejbitó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ściowegoS.{\displaystyle S'.} W celu odróżnienia symbolu od pary, poprzedza się jepojedynczym bitem:

Formalnie algorytm kompresji przebiega następująco:

  1. Wypełnij słownik pierwszym symbolem, wypisz ten symbol na wyjście; wypełnij bufor wejściowyn{\displaystyle n} pierwszymi symbolami wejściowymi.
  2. Dopóki w buforze wejściowym są dane:
    1. Wyszukaj w słowniku najdłuższy podciąg równy początkowi bufora wejściowego – wynikiem są liczbyP{\displaystyle P} iC.{\displaystyle C.}

Uwaga: ponieważ w przypadku wypisywania pary liczbaC{\displaystyle C} nigdy nie będzie miała wartości 0 ani 1, toteż można zmniejszyć liczbę bitów wymaganą do zapisaniaC{\displaystyle C} poprzez przypisanie wartości binarnej 0 liczby 2, wartości binarnej 1 liczby 3 itd. Np. dlan=4{\displaystyle n=4} do zapisaniaC{\displaystyle C} należałoby przeznaczyć 3 bity, a przy takim przyporządkowaniu wystarczą 2 bity.

Przykładowy krok algorytmu

[edytuj |edytuj kod]

1. 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 |a |c | a | b |a |a |c | 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ągaac – 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 |a |c | a | b |a |a |c | 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 jednego symbolu.

          słownik               |  bufor wejściowy  | nieprzetworzone symbole  0   1   2   3   4   5   6   7 | 0   1   2   3   4 |+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----| a | a |a |a |c | a | b |a |a |c | b | a | c | a | b | a | c | ...+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----

Algorytm dekompresji

[edytuj |edytuj kod]

Do dekompresji potrzebny jest bufor o dokładnie takim samym rozmiarze jak przy kompresji; jest on podzielony na słownik (k{\displaystyle k} symboli) i bufor wyjściowy (n{\displaystyle n} symboli).

  1. Wypełnij słownik pierwszym symbolem.
  2. Dla kolejnych danych (par i trójek) powtarzaj:
    1. Jeśli mamy do czynienia z trójką (0,P,{\displaystyle P,}C{\displaystyle C}) to skopiuj ze słownika na początek bufora wyjściowego symbole z zakresuPP+C1,{\displaystyle P\ldots P+C-1,} wypisz na wyjście skopiowane symbole i przesuń cały bufor oC{\displaystyle C} pozycji w lewo.
    2. Jeśli mamy do czynienia z dwójką (1,S{\displaystyle S}) to skopiuj symbolS{\displaystyle S} na początek bufora wyjściowego, wypisz na wyjście ten symbol i przesuń cały bufor o jedną pozycję w lewo.

Przykład kompresji

[edytuj |edytuj kod]

Słownik i bufor wejściowy będą miały rozmiar 4(n=k=4),{\displaystyle (n=k=4),} a więc do zapisu liczbyP{\displaystyle P} iC{\displaystyle C} wystarczą po 2 bity. Przyjmijmy także, że kodowane symbole tobajty (tak jest najczęściej). Wówczas:

  • rozmiar trójki (0,P,C) – 1+2+2 = 5 bitów;
  • rozmiar pary (1,S) – 1+8 = 9 bitów.

Kompresji zostanie poddany 12-elementowy ciągaabbcabbcabd.

#słownik/bufor wejściowywyjście koderakomentarz
1aaaa/aabbasłownik jest wypełniany pierwszym symbolem, bufor wejściowy pierwszymi czterema symbolami wejściowymi
2aaaa/aabb(0,0,2)w słowniku znajduje się 2-elementowy podciąg równy początkowi bufora wejściowego – jego rozmiar wynosi 16 bitów, a rozmiar trójki 5 bitów, zatem na wyjście wypisywana jest trójka, a bufor przesuwany o 2 pozycje
3aaaa/bbca(1,b)w słowniku nie ma ciągu rozpoczynającego się odb, zatem na wyjście wypisywana jest para, a bufor przesuwany o jedną pozycję
4aaab/bcab(0,3,1)w słowniku znajduje się 1-elementowy podciąg równy początkowi bufora wejściowego – jego rozmiar wynosi 8 bitów, a rozmiar trójki 5 bitów, zatem na wyjście wypisywana jest trójka, a bufor przesuwany o 1 pozycje
5aabb/cabb(1,c)w słowniku nie ma ciągu rozpoczynającego się odc, zatem na wyjście wypisywana jest para, a bufor przesuwany o jedną pozycję
6abbc/abbc(0,0,4)w słowniku znajduje się 4-elementowy podciąg równy początkowi bufora wejściowego – jego rozmiar wynosi 32 bity, a rozmiar trójki 5 bitów, zatem na wyjście wypisywana jest trójka, a bufor przesuwany o 4 pozycje
7abbc/abd(0,0,2)w słowniku (na jego początku) znajduje się 2-elementowy podciąg równy początkowi bufora wejściowego; na wyjście wypisywana jest trójka, a bufor przesuwany o 2 pozycje
8bcab/d(1,d)w słowniku nie ma ciągu rozpoczynającego się odd, zatem na wyjście wypisywana jest para, a bufor przesuwany o jedną pozycję

Rozmiar danych przed kompresją:128=96{\displaystyle 12\cdot 8=96} bitów.

Rozmiar danych po kompresji:

W sumie 55 bitów, co daje współczynnik kompresji ok. 42%.

Przykład dekompresji

[edytuj |edytuj kod]

Zostaną zdekompresowane dane z poprzedniego przykładu.

#wejście dekoderawyjście dekoderasłownikkomentarz
1aaaaawypełnienie słownika pierwszym symbolem
2(0,0,2)aaaaaaskopiowanie do bufora wyjściowego i na wyjście 2-elementowego ciągu; przesunięcie całego bufora o 2 pozycje w lewo
3(1,b)baaabdopisanie do bufora wyjściowego symbolu, wypisanie go na wyjście i przesunięcie całego bufora o jedną pozycję w lewo
4(0,3,1)baabbskopiowanie do bufora wyjściowego i na wyjście 1-elementowego ciągu; przesunięcie całego bufora o 1 pozycje w lewo
5(1,c)cabbcdopisanie do bufora wyjściowego symbolu, wypisanie go na wyjście i przesunięcie całego bufora o jedną pozycję w lewo
6(0,0,4)abbcabbcskopiowanie do bufora wyjściowego i na wyjście 4-elementowego ciągu; przesunięcie całego bufora o 4 pozycje w lewo
7(0,0,2)abbcabjw.
8(1,d)dcabddopisanie do bufora wyjściowego symbolu, wypisanie go na wyjście i przesunięcie całego bufora o jedną pozycję w lewo

Jak widać na wyjście zostały wypisane dokładnie te same symbole, które zostały uprzednio skompresowane.

Zobacz też

[edytuj |edytuj kod]

Bibliografia

[edytuj |edytuj kod]
  • Adam Drozdek: Wprowadzenie do kompresji danych. Warszawa: Wydawnictwa Naukowo-Techniczne, 1999.ISBN 83-204-2303-1.
Źródło: „https://pl.wikipedia.org/w/index.php?title=LZSS&oldid=74000358
Kategoria:
Ukryta kategoria:

[8]ページ先頭

©2009-2025 Movatter.jp