LZW

bezeztrátový kompresní algoritmus

LZW84 (Lempel-Ziv-Welch 84) je bezeztrátový kompresní algoritmus vyvinutý Abrahamem Lempelem, Jacobem Zivem a Terry Welchem. Byl publikován v roce 1984 jako vylepšení algoritmů LZ77 a LZ78 publikovaných v letech 1977 a 1978. Je relativně jednoduchý a rychlý, ale nedosahuje zdaleka tak dobré komprese jako náročnější algoritmy jako LZMA, je většinou horší než Deflate a neprovádí analýzu dat. Data prošlá algoritmem LZW84 jsou dále nekomprimovatelná, toto je rozdíl oproti algoritmu LZ77, po kterém lze data dále komprimovat pomocí algoritmu Huffman nebo podobného. Algoritmus byl až do roku 2004 zatížený patentem, dnes je patent prošlý, ale algoritmus byl mezitím překonán. Byl využíván (a je částečně dodnes) v archívech ARC a ZOO, starých verzích ZIPu (PKZIP 0.x a 1.x), unixovém komprimačním programu compress (soubory s příponou „Z“), grafickém formátu GIF a dokumentech PDF.

Popis algoritmu

editovat

Algoritmus nepotřebuje žádný slovník. Při kompresi a dekompresi si pouze vytváří pomocný seznam frází. Jedinou další informaci, kterou potřebuje znát, je seznam znaků, ze kterých si má vytvořit jednoznakový seznam frází (typicky 256 znaků ASCII). Algoritmus se tak hodí především pro síťové účely, kde ještě není znám konec přijímaných dat, ale jejich začátek už se může dekomprimovat.

Komprese

editovat

Nejdříve se do nalezených frází zapíší všechny znaky abecedy. Pro demonstraci budeme předpokládat, že má abeceda pouze znaky a, b, c a d. Poté se opakují následující kroky, dokud je na vstupu text.

  1. Na vstupu se najde nejdelší fráze, která je už zapsaná v nových frázích, a její index se zapíše na výstup.
  2. Nalezená fráze se pak ze vstupu odstraní.
  3. Jako nová fráze se pak zapíše nalezená fráze + první znak ze vstupu.
Řetězec abacdacacadaad
krok text vstupu nalezená fráze výstup nová fráze index nové fráze
a 0
b 1
c 2
d 3
1 abacdacacadaad a 0 ab 4
2 bacdacacadaad b 1 ba 5
3 acdacacadaad a 0 ac 6
4 cdacacadaad c 2 cd 7
5 dacacadaad d 3 da 8
6 acacadaad ac 6 aca 9
7 acadaad aca 9 acad 10
8 daad da 8 daa 11
9 ad a 0 ad 12
10 d d 3

Výstupem je pak řetězec 0102369803.

Dekomprese

editovat

Opět je nejprve potřeba zapsat do nových frází všechny znaky abecedy. My budeme vycházet opět z abecedy obsahující znaky a, b, c a d. Poté se opakují následující kroky, dokud je na vstupu číslo.

  1. Ze vstupu se odstraní číslo a na výstup se přidá odpovídající fráze (podle seznamu frází, které už jsou).
  2. Jako nová fráze se doplní ta z minulého kroku + první znak fráze z tohoto kroku.
Vstup 0102369803
krok vstup výstup nová fráze index nové fráze
a 0
b 1
c 2
d 3
1 0 a
2 1 b ab 4
3 0 a ba 5
4 2 c ac 6
5 3 d cd 7
6 6 ac da 8
7 9 aca aca 9
8 8 da acad 10
9 0 a daa 11
10 3 d ad 12

Výstupem je pak řetězec abacdacacadaad.

Tento postup má však jednu výjimku. Pokud je na vstupu větší číslo, než je index poslední nalezené fráze, vloží se znovu na výstup poslední výstup + jeho první znak. To samé se přidá také do nových frází...

Reference

editovat

V tomto článku byl použit překlad textu z článku Lempel–Ziv–Welch na anglické Wikipedii.

Související články

editovat

Externí odkazy

editovat