LZ77
LZ 77 (Lempel-Ziv 77) je bezeztrátový kompresní algoritmus publikovaný Abrahamem Lempelem a Jacobem Zivem v roce 1977. LZ 77 patří mezi takzvané slovníkové algoritmy.
Princip
Algoritmus prochází data postupně od začátku do konce. V případě, že narazí na skupinu znaků, která se již v předchozích datech objevila, nahradí tuto skupinu znaků odkazem na předchozí výskyt. Odkaz je zakódován jako vzdálenost od současné pozice a délka skupiny znaků. Pokud je tento odkaz zakódován formou kratší než je reprezentace skupiny znaků, dochází k úspoře místa v komprimované zprávě.
Komprimovaná data se pak skládají ze znaků, pro které nebyla nalezena žádná reference (tzv. literálů) a referencí nahrazujících skupiny znaků.
Příklad
Text „Naolejuje-li Julie koleje“ může být zakódován jako:
- Naolejuje-li Ju
- {odkaz na li ve slově Naolejuje-li}
- e ko
- {odkaz na le ve slově Naolejuje-li}
- {odkaz na je ve slově Naolejuje-li}
Varianty algoritmu a jeho implementace
Rozlišení literálu a reference
Dekompresní algoritmus potřebuje určitým způsobem rozlišit, zda data, které se v daném okamžiku pokouší dekomprimovat, reprezentují literál nebo referenci na předchozí výskyt.
Jedním ze způsobů, jak to zajistit, je přidat před každý literál nebo referenci jeden bit, určující jak mají být následující data interpretována. Tento způsob je sice velmi jednoduchý, nicméně má tu nevýhodu, že je každý literál prodloužen o jeden bit, čímž se zvětšuje délka zkomprimovaných dat.
Dalším způsobem je před každou skupinu literálů přidat speciální kód určující počet následujících literálů. Takto vložený kód samozřejmě prodlouží komprimovaná data o svoji délku. Vzhledem k tomu, že v komprimovaných datech jsou krátké skupiny literálů velmi časté, musí se tento speciální kód vkládat do komprimovaných dat také velmi často. Výsledky pro tuto metodu jsou podobné jako pro metodu s vloženým bitem.
Velikost okna a kódování vzdálenosti
Kompresní algoritmus má k dispozici určité „okno“, ve kterém vidí posledních N znaků a právě na znaky viditelné v tomto okně odkazuje. Obecně platí, že čím větší okno, tím je větší šance na nalezení odkazu. Na druhou stranu, čím větší okno, tím více bitů je třeba k zakódování vzdálenosti odkazu od okamžité polohy v datech. Možným řešením je zavést několik možných délek pro zakodóvání offsetu.
Kódování délky
Nejjednodušším způsobem je kódovat délku odkazu pevným počtem bitů. V reálných datech se však mnohem častěji objevují odkazy o kratší délce než odkazy s větší délkou. Je tedy výhodnější kódovat krátké odkazy menším počtem bitů než odkazy dlouhé. Pro tento účel se velmi často používá Eliasovo gama kódování.
Použití
Algoritmus je v různých variantách používán jak v obecných archivačních programech, tak při bezeztrátové kompresi obrázků.