|
Lempel-Ziv 77, skracane zwykle do LZ77 (algorytm LZ77) - metoda strumieniowej bezstratnej kompresji słownikowej. Została opracowana w 1977 przez Abrahama Lempela i Jacoba Ziv i opisana w artykule "A universal algorithm for sequential data compression" opublikowanym w IEEE Transactions on Information Theory (str. 8-19). Na LZ77 opiera się m.in. algorytm deflate, używany jest również w programach zip, gzip, ARJ, RAR, PKZIP, a także w formacie PNG. Algorytm LZ77 jest wolny od wszelkich patentów co w dużej mierze przyczyniło się do jego popularności i szerokiego rozpowszechnienia.
Zasada działaniaObrazowo patrząc, metoda LZ77 wykorzystuje fakt, iż poszczególne słowa, albo przynajmniej ich części powtarzają się w danym tekście: zapamiętywana jest w słowniku pewna liczba ostatnio kodowanych danych - przeciętnie kilka, kilkadziesiąt kilobajtów - i jeśli jakiś ciąg powtórzy się, to zostanie zastąpiony przez liczby określające jego pozycję w słowniku oraz długość ciągu; do zapamiętania tych dwóch liczb trzeba przeznaczyć zazwyczaj o wiele mniej bitów, niż do zapamiętania zastępowanego ciągu. Metoda LZ77 zakłada, że ciągi powtarzają się w miarę często, tzn. na tyle często, żeby wcześniejsze wystąpienia można było zlokalizować w słowniku - ciągi powtarzające się zbyt rzadko nie są brane pod uwagę. Wady tej pozbawiona jest metoda LZ78 (również opracowana przez autorów LZ77), w której - przynajmniej teoretycznie - słownik rozszerza się w nieskończoność. Bardzo dużą zaletą kodowania LZ77 (a także innych metod słownikowych z rodziny LZ, tj. LZSS, LZ78, LZW itp.) jest to, że słownika nie trzeba zapamiętywać i przesyłać wraz z komunikatem - zawartość słownika będzie na bieżąco odtwarzana przez dekoder. Algorytm kompresji jest bardziej złożony i trudniejszy w realizacji, niż algorytm dekompresji. W metodzie LZ77 można - regulując parametry kodera (rozmiar słownika i bufora kodowania) - wpływać na prędkość kompresji oraz zapotrzebowania pamięciowe. Algorytm kompresjiMetoda LZ77 korzysta z bufora (okna), które logicznie podzielone jest na dwie części:
Bufor słownikowy obejmuje indeksy Rozmiary n i k mogą być dowolne, w praktyce dobiera się je tak, aby były całkowitą potęgą dwójki, dzięki czemu w pełni wykorzystywane są słowa bitowe przeznaczone do ich zapamiętania. Rozmiar bufora słownikowego wynosi w praktyce kilka-kilkadziesiąt kilobajtów, bufor kodowania jest dużo mniejszy. Na przykład w programie gzip słownik ma 32kB, bufor kodowania natomiast 258 bajtów. Algorytm przebiega następująco:
Prędkość kompresji natomiast jest uzależniona głównie od efektywności procedury wyszukującej najdłuższy prefiks. Używane są tutaj różne rozwiązania. Np. w programie gzip używa się tablicy haszującej adresowanej pierwszymi trzema literami z bufora kodowania. Stosowane są również zwykłe tablice, a do lokalizacji prefiksu używa się algorytmów wyszukiwania wzorca, np. algorytmu Karpa-Rabina. Jeśli słownik jest realizowany jako tablica, to aby uniknąć fizycznego, czasochłonnego przesuwania danych w oknie (punkt 3. algorytmu), używa się buforów cyklicznych. 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 | | | | c | a | b | | | | | a | c | a | b | a | c | ...
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----
| okno |
2. Wynik wyszukiwania:
P = 2 (pozycja w słowniku)
C = 3 (długość podciągu)
S = (symbol z bufora wejściowego następujący po dopasowanym podciągu)
3. Przesunięcie bufora o C + 1 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 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---------------------
| | c | a | b | | | | | a | c | a | b | a | c | ...
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---------------------
Algorytm dekompresjiDekompresja danych w metodzie LZ77 jest o wiele prostsza i szybsza niż kompresja. Do zdekodowania wymagane jest istnienie bufora (okna) o dokładnie takich samych parametrach jak przy kodowaniu - bufor podzielony jest na część słownikową obejmującą k pierwszych pozycji i bufor wyjściowy zajmujący n kolejnych pozycji. Dekodowanie przebiega następująco:
Ad 1) Jeśli przy kompresji podciąg obejmował także bufor wejściowy, to należy bufor słownikowy tymczasowo "przedłużyć" i wypełnić brakującymi symbolami. Tego specjalnego przypadku można uniknąć na etapie kompresji, biorąc pod uwagę tylko te podciągi, które w całości znajdują się w słowniku - przy dużych rozmiarach słownika i niewielkich bufora wejściowego praktycznie nie rzutuje to na stopień kompresji i jest to rozwiązanie stosowane w rzeczywistych zastosowaniach. Podciągi takie mają strukturę xXxXx, gdzie x to pojedynczy symbol, a X ciąg znajdujący się już w buforze słownikowym. Uzupełnienie polega na cyklicznym kopiowaniu końcówki bufora słownikowego (którą obejmuje początek podciągu). Np. jeśli podciąg ma długość 8 i tylko 3 symbole bca znajdują się w słowniku, to odtworzony ciąg ma postać: bcabcabc. W praktyce nie ma potrzeby fizycznego rozszerzania słownika i kopiowania danych - wystarczy, że indeksy będą odpowiednio przeliczane. Przykład kompresjiNiech długość słownika i bufora wejściowego będą równe 4, tzn. n = k = 4. Do zapisu pozycji w słowniku (P) jak i długości ciągu (C) wystarczą 2 bity. Kodowany komunikat składa się z trzynastu symboli: aabbcabbcdddc.
Zakodowane zostało 13 symboli; symbole to przeważnie bajty, tak więc każdy zajmie 8 bitów, a cały komunikat 104 bity. Dane wyjściowe kodera to: 1) początkowy symbol (8 bitów), 2) pięć trójek; każda trójka zajmuje 12 bitów (2 bity na indeks podciągu, 2 na jego długość i 8 bitów na symbol). Ostatecznie rozmiar skompresowanych danych to 68 bitów; współczynnik kompresji wynosi ok. 34%. Przykład dekompresjiDekompresji zostaną poddane dane otrzymane we wcześniejszym przykładzie:
Ostatecznie zdekodowany komunikat ma postać: aabbcabbcdddc. Linki zewnętrzne
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