LZP

LZP (P od 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.

Metoda LZP nie została opatentowana.

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, koder wypisuje parę (pozycja prefiksu, jego długość);
  • w LZP również wyszukiwany jest najdłuższy prefiks, ale wyłącznie od pozycji ostatniego wystąpienia kontekstu, koder wypisuje jedynie długość prefiksu.

Kontekst to ciąg określonej długości poprzedzający dane mające zostać zakodowane; Bloom proponuje stosować konteksty kilkuznakowe, w przykładowych implementacjach wykorzystywał 3 do 5 znaków. Do zapamiętywania ostatniego wystąpienia kontekstu używana jest tablica mieszająca, w której 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. Inicjalizacja:
    • N := długość kontekstu
    • s := kodowany tekst
    • i := 0 - bieżąca pozycja
    • Wyzeruj tablicę L przechowującą ostatnie wystąpienia kontekstu
  2. Wypisz N pierwszych liter
  3. i := N - przesuń okno o N pozycji w lewo
  4. 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 niezakodowany 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:
      1. Jeśli k = 0 (brak dopasowania), wypisz literę s[i], przesuń okno w lewo o jedną pozycję; i := i + 1;
      2. 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.

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

Przykładowy krok kompresji - niepowodzenie

Długość kontekstu N = 3.

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 pierwszych 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

Zobacz też

Linki zewnętrzne

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.