LZMW

LZMWalgorytm kompresji słownikowej będący modyfikacją algorytmu LZW, zaproponowany w 1985 roku przez V. Millera i M. Wegmana w artykule Variations on a theme by Ziv and Lempel.

Zmianie podlega jedynie koder, dekoder jest taki sam jak w metodzie LZW.

W LZW po wyszukaniu w słowniku najdłuższego prefiksu niezakodowanych danych, do słownika dodawane jest nowe słowo będące konkatenacją tego prefiksu i następującego po nim znaku. Innymi słowy do słownika trafia słowo o jeden znak dłuższe niż prefiks. Z kolei w metodzie LZMW pamięta się słowo dopasowane w poprzednim kroku i po dopasowaniu kolejnego, do słownika trafia konkatenacja obu słów. W ten sposób słowa są pojawiające się w słowniku szybko stają się coraz dłuższe.

Modyfikacją LZMW jest z kolei LZAP (James Storer, 1988), która dodaje do słownika konkatenację poprzedniego słowa z wszystkimi prefiksami bieżącego – to powoduje znaczący rozrost słownika, jednak pozwala ominąć niedogodności LZMW.

Algorytm kompresji (kodowania)

  1. Wyzeruj słownik
  2. i := 0 - bieżąca pozycja
  3. T := kodowany tekst
  4. P := "" - poprzednie słowo, inicjowane na puste
  5. Dopóki i < długość(T), wykonuj:
    • Znajdź najdłuższy prefiks niezakodowanych danych który znajduje się w słowniku - wynikiem jest bieżące słowo S o kodzie k i długości n znaków
    • Na wyjście wypisz kod k
    • Do słownika dodaj słowo jeśli jeszcze nie istnieje
    • i := i + n
    • P := S

Algorytm dekompresji

Algorytm dekompresji jest identyczny jak w metodzie LZW.

Przykład kompresji

Zostanie zakodowany ciąg składający się z 12 znaków: "aaaaabbbaaaa".

poprzedni ciąg (P)bieżący symbol (S)P + Sindeks (k)słownikkomentarz
1. a
2. b
3. c
inicjalizacja słownika alfabetem
aa1 - indeks 'a'nic nie jest dodawane do słownika, P := 'a'
aaaa1 - indeks 'a'4. aado słownika jest dodawany ciąg 'aa', P := 'a'
aaaaaa4 - indeks 'aa'5. aaado słownika jest dodawany ciąg 'aaa', P := 'aa'
aaaaaa1 - indeks 'a'nic nie jest dodawane do słownika, P := 'a'
abab2 - indeks 'b'6. abdo słownika jest dodawany ciąg 'ab', P := 'b'
bbbb2 - indeks 'b'7. bbdo słownika jest dodawany ciąg 'bb', P := 'b'
bbbb2 - indeks 'b'nic nie jest dodawane do słownika, P := 'b'
baaabaaa5 - indeks 'aaa'8. baaado słownika jest dodawany ciąg 'baaa', P := 'aaa'
aaaaaaaa1 - indeks 'a'9. aaaado słownika jest dodawany ciąg 'aaaa', P := 'a'

Zakodowane dane składają się z 9 indeksów: 1, 1, 4, 1, 2, 2, 2, 5, 1.

Jeśli przyjąć, że indeksy oraz symbole są zapisane na tej samej liczbie bitów, to współczynnik kompresji wyniesie ok. 25%.

Zobacz też