LZP: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja nieprzejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
m dt.
m dred.
Linia 66: Linia 66:
#* Jeśli to litera, wypisz ją na wyjście i dopisz na koniec bufora
#* Jeśli to litera, wypisz ją na wyjście i dopisz na koniec bufora
#* Jeśli to liczba ('''k'''), pobierz pozycję ostatniego wystąpienia kontekstu '''P''', skopiuj na wyjście podciąg '''bufor'''['''P''', '''P'''+'''k'''], i ten sam ciąg dopisz na koniec bufora, zaktualizuj tablicę '''L'''
#* Jeśli to liczba ('''k'''), pobierz pozycję ostatniego wystąpienia kontekstu '''P''', skopiuj na wyjście podciąg '''bufor'''['''P''', '''P'''+'''k'''], i ten sam ciąg dopisz na koniec bufora, zaktualizuj tablicę '''L'''

==Zobacz też==
* [[PPM]]


==Linki zewnętrzne==
==Linki zewnętrzne==
* [http://www.cbloom.com/papers/lzp.html Strona z publikacjami Charlesa Blooma nt LZP]
* [http://www.cbloom.com/papers/lzp.html Strona z publikacjami Charlesa Blooma nt LZP]

==Zobacz też==
* [[PPM]]


[[Kategoria:Algorytmy kompresji]]
[[Kategoria:Algorytmy kompresji]]

Wersja z 21:26, 30 sie 2008

LZP (P - predykacja) - metoda kompresji opracowana w 1996 roku przez Charlesa Blooma, będąca modyfikacją algorytmu LZ77, wykorzystująca kontekstowość danych - pewne ciągi występują z większym prawdopodobieństwem w sąsiedztwie innych. Mówiąc obrazowo, jeśli wcześniej po ciągu abc wystąpił ciąg def, i znów pojawił się ciąg abc, to jest szansa, że następnym ciągiem będzie def.

Różnica w stosunku do LZ77 przedstawia się następująco: w LZ77 w słowniku wyszukiwany jest najdłuższy prefiks niezakodowanych jeszcze danych, w LZP również wyszukiwany jest najdłuższy prefiks, ale wyłącznie od pozycji ostatniego wystąpienia kontekstu.

Kontekst to ciąg określonej długości poprzedzający kodowane dane; Bloom proponuje stosować konteksty kilkuznakowe, w przykładowych implementacjach wykorzystuje 3 do 5. Do zapamiętywania ostatniego wystąpienia kontekstu używana jest tablica mieszająca (problem kolizji nie jest rozwiązywany!) - jest to podyktowane względami wydajnościowymi.

Algorytm kompresji

Tak samo jak w LZ77 jest bufor (albo okno), podzielone na słownik, tj. już zakodowane dane, oraz bufor kodowania, tj. dane mające właśnie zostać zakodowane. Kontekst poprzedza bufor kodowania, jest sufiksem słownika.

Koder wypisuje dwa rodzaje kodów:

  1. litera - niezakodowana litera (np. znak ASCII)
  2. liczba - długość prefiksu

Algorytm przebiega następująco:

  1. N := długość kontekstu
  2. s := kodowany tekst
  3. i := 0 - bieżąca pozycja
  4. Wyzeruj tablicę L przechowującą ostatnie wystąpienia kontekstu
  5. Wypisz N pierwszych liter
  6. i := N - przesuń okno o N pozycji w lewo
  7. Dopóki są dane (i < długość(s)) powtarzaj:
    • P := L[kontekst] - pobierz pozycję ostatniego wystąpienia kontekstu
    • L[kontekst] := i - zapamiętaj bieżącą pozycję
    • Jeśli P nie istnieje (nie było jeszcze takiego kontekstu) wypisz na wyjście pierwszy niezakodwany znak i przesuń okno w lewo o jedną pozycję; i := i + 1.
    • Jeśli P istnieje znajdź najdłuższy podciąg, tzn. s[P, P + k] = s[i, i + k], gdzie k to długość dopasowania:
      • Jeśli k = 0 (brak dopasowania), wypisz literę s[i], przesuń okno w lewo o jedną pozycję; i := i + 1;
      • Jeśli k > 0 (dopasowanie istnieje), wypisz liczbę k, przesuń okno o tyle pozycji w lewo; i := i + k;

Przykładowy krok kompresji - przypadek znalezienie prefiksu

Długość kontekstu N = 3.

|                 słownik                         | bufor kodowania   | dane niezakodowane
+---+---+---+---+---+---+---+---+-----+---+---+---+---+---+---+---+---+---------------------
| a | b | c | a | b | b | a | c | ... | c | a | b | b | a | a | a | b |         ... 
+---+---+---+---+---+---+---+---+-----+---+---+---+---+---+---+---+---+---------------------
        | poprzedni |                 | kontekst  |
          kontekst       <-- P --       bieżący

Koder wypisze na wyjście liczbę 2, długość ciągu bc.

Przykładowy krok kompresji - niepowodzenie

Długość kontekstu N = 3.

|                 słownik                         | bufor kodowania   | dane niezakodowane
+---+---+---+---+---+---+---+---+-----+---+---+---+---+---+---+---+---+---------------------
| a | b | c | a | b | c | c | c | ... | c | a | b | b | a | a | a | b |         ... 
+---+---+---+---+---+---+---+---+-----+---+---+---+---+---+---+---+---+---------------------
        | poprzedni |                 | kontekst  |
          kontekst       <-- P --       bieżący

Po poprzednim wystąpieniu kontekstu nie występuje prefiks bufora kodowania - na wyjście wypisywana jest pierwsza litera z bufora kodowania, b.

Algorytm dekompresji

Parametry są dokładnie takie same jak przy kompresji.

Algorytm:

  1. N := długość kontekstu
  2. i := 0 - bieżąca pozycja
  3. Wczytaj N pierwszy liter, pierwszy kontekst
  4. Dopóki są dane:
    • Wczytaj daną
    • Jeśli to litera, wypisz ją na wyjście i dopisz na koniec bufora
    • Jeśli to liczba (k), pobierz pozycję ostatniego wystąpienia kontekstu P, skopiuj na wyjście podciąg bufor[P, P+k], i ten sam ciąg dopisz na koniec bufora, zaktualizuj tablicę L

Linki zewnętrzne

Zobacz też