LZ77

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 8. ledna 2022; kontroly vyžadují 2 úpravy .

LZ77 a LZ78  jsou bezeztrátové kompresní algoritmy publikované v dokumentech izraelských matematiků Abrahama Lempela a Yaakova Ziva v letech 1977 a 1978 . Tyto algoritmy jsou nejznámějšími variantami v rodině LZ* , která také zahrnuje LZW , LZSS , LZMA a další algoritmy.

Oba algoritmy jsou slovníkové metody, na rozdíl od jiných metod redundance redundance, jako je RLE a aritmetická komprese . LZ77 je algoritmus "posuvného okna", který je ekvivalentní implicitnímu použití slovníkového přístupu, který byl poprvé navržen v LZ78.

LZ77

Můžeme říci, že algoritmy rodiny LZ* jsou složitějším zobecněním jednoduché a intuitivní metody komprese dat používané v RLE . Pro pochopení tohoto algoritmu je nutné pochopit jeho dvě složky: princip posuvného okna a mechanismus koincidenčního kódování .

Princip posuvného okna

Metoda kódování podle principu posuvného okna bere v úvahu informace, se kterými se již setkali, tedy informace, které jsou již kodéru a dekodéru známé (druhý a další výskyt řetězce znaků ve zprávě je nahrazen pomocí odkazů na jeho první výskyt).

Kvůli tomuto principu jsou algoritmy LZ* někdy označovány jako metody komprese posuvných oken. Posuvné okno si lze představit jako vyrovnávací paměť (nebo složitější dynamickou datovou strukturu), která je organizována tak, aby si pamatovala a zpřístupňovala dříve „uvedené“ informace. Samotný proces kódování komprese podle LZ77 tedy připomíná psaní programu, jehož příkazy umožňují přístup k prvkům „posuvného okna“ a místo hodnot komprimované sekvence vložit odkazy na tyto hodnoty ​v "posuvném okně". Velikost posuvného okna lze dynamicky měnit a být 2, 4 nebo 32 kilobajtů. Je třeba také poznamenat, že velikost okna kodéru může být menší nebo rovna velikosti okna dekodéru, ale ne naopak.

Výše uvedené srovnání procesu kódování s „programováním“ může vést k předčasnému závěru, že algoritmus LZ77 patří k metodám kontextového modelování . Proto je třeba poznamenat, že algoritmus LZ77 je obvykle klasifikován jako slovníková metoda komprese dat , když se místo pojmu „posuvné okno“ používá termín „dynamický slovník“.

Mechanismus shodného kódování

Než přistoupíme k úvahám o mechanismu kódování, ujasněme si pojem shoda (z anglického  match ). Uvažujme posloupnost N prvků. Pokud jsou všechny prvky sekvence jedinečné, pak taková sekvence nebude obsahovat jediný opakující se prvek, nebo jinými slovy, v sekvenci nebudou alespoň dva stejné nebo shodné prvky.

Ve standardním algoritmu LZ77 jsou shody kódovány jako pár:

V návaznosti na již uvedenou analogii s programováním podotýkáme, že ve většině článků věnovaných algoritmu LZ77 je zakódovaný pár interpretován přesně jako příkaz ke zkopírování znaků z posuvného okna z určité pozice, nebo doslova jako: „Návrat na hodnotu offsetu ve vyrovnávací paměti znaků a zkopírujte hodnotu délky znaku počínaje aktuální pozicí.

I když se tato interpretace může zdát intuitivním programátorům imperativním , říká jen málo o povaze algoritmu LZ77 jako kompresní metody. Zvláštností tohoto kompresního algoritmu je to, že použití zakódovaného páru délka-offset je nejen přijatelné, ale také účinné v případech, kdy hodnota délky přesahuje hodnotu offsetu.

Příklad s příkazem copy není zcela zřejmý: "Vraťte se o 1 znak zpět do vyrovnávací paměti a zkopírujte 7 znaků, počínaje aktuální pozicí." Jak můžete zkopírovat 7 znaků z vyrovnávací paměti, když je v tuto chvíli ve vyrovnávací paměti pouze 1 znak? Následující výklad kódovacího páru však může situaci objasnit: každých 7 následujících znaků je stejných (ekvivalentních) jako 1 znak před nimi.

To znamená, že každý znak lze jednoznačně určit pohybem zpět ve vyrovnávací paměti – i když daný znak v době dekódování aktuálního páru délky-offset ještě ve vyrovnávací paměti není . Takový kódovaný pár by byl vícenásobným (určeným hodnotou offsetu) opakováním sekvence (určené hodnotou délky) znaků, což je obecnější forma RLE .

Nevýhody

Příklad "abracadabra"

Poz. Symbol délky abrakadabra 0 0 a brakadabra 0 0 b ab racadabra 0 0 r a br akadabra 3 1 a c abr a c adabra 2 1 a d abra cad abra 7 4 abra

Vybrané znaky nejsou v kódovací sekvenci.

LZ78

Na rozdíl od LZ77, který pracuje s již přijatými daty, LZ78, navržený v roce 1978 [1] , se zaměřuje na data, která budou pouze přijímána (LZ78 nepoužívá „posuvné“ okno, ukládá slovník již prohlížených frází). Algoritmus čte znaky zprávy, dokud není nahromaděný podřetězec zcela zahrnut do jedné z frází slovníku. Jakmile tento řetězec již neodpovídá alespoň jedné frázi ve slovníku, algoritmus vygeneruje kód skládající se z indexu řetězce ve slovníku, který obsahoval vstupní řetězec až do posledního zadaného znaku, a znaku, který shodu porušil. Poté se zadaný podřetězec přidá do slovníku. Pokud je slovník již plný, pak je z něj předběžně odstraněno slovní spojení nejméně používané ve srovnání.

Příklad

Nechť je dán řetězec ACAGAATAGAGA.

Slovník Přečtěte si obsah řádku Kód
A <0,A>
A=1 C <0,C>
A=1
C=2
AG <1,G>
A = 1, C = 2
AG = 3
AA <1,A>
A=1, C=2
AG=3, AA=4
T <0, T>
A = 1, C = 2, AG = 3
AA = 4, T = 5
AGA <3,A>
A=1, C=2, AG=3
AA=4, T=5, AGA=6
G <0,G>
A=1, C=2, AG=3, AA=4
T=5, AGA=6, G=7
A <1,EOF>

Výsledkem práce bude sekvence: <0, A><0, C><1, G><1, A><0, T><3, A><0, G><1, EOF> .

Poznámky

  1. Vladimir Lidovsky, Přednáška 7: Algoritmy komprese informací zaměřené na substituci nebo slovník. Metody Lempel-Ziv Archivní kopie ze dne 15. září 2016 na Wayback Machine v rámci přednášek "Základy teorie informace a kryptografie" // Intuit.ru, 4/11/2007

Odkazy