LZ77 i LZ78

S Vikipedije, slobodne enciklopedije

LZ77 i LZ88 su dva algoritma kompresije bez gubitaka. Stvorili su ih Abraham Lampel i Jakov Ziv 1977. i 1978. godine. Algoritmi su još poznati i pod nazivima LZ1 te LZ2 a ujedno predsavljaju i osnovu za mnogobrojne varijacije raznih algoritama kompresije i dekompresije kao na primer LZS algoritam.

Obadva algoritma su tzv. rečnik koderi. Tj, čuvaju određenu kolicinu podataka iz zadate datoteke koju kompresuju. LZ77 tokom kompresije podržava [[Klizni-prozor protokol|klizni-prozor] (Sliding window protocol) a jedna od osnovnih razlika između dva algoritma je ta što LZ77 svoj posao počinje od samog početka rečnika dok LZ78 ima mogućnost slučajnog pristupa bilo kom delu rečnika.

LZ77[uredi | uredi izvor]

Algoritam LZ77 teži postiči kompresiju zamenom niza podataka koji se ponavljaju referencom na jedan od njih koji će se nalaziti u nekompresovanom delu datoteke. Da bi ceo postupak mogao da se izvede algoriam mora pamtiti neku količinu podataka za vreme izvršavanja postupka. Strukturu u kojoj se ovi podaci održavaju nazivamo klizni-prozor (Sliding window protocol) te kroz nju možemo provući poslednja 2, 4 ili 32 kilobajta podataka. Koder mora zadržati ove podatke sve dok ne postavi referencu na svaki duplikat.[1]

U sledećoj tablici pokazaćemo princip rada ovog algoritma korišćenjem rečnika bafera veličine 12, te veličine 9. Položaj uz desnu iviču rečnika se prilikom komprimacije mora uzeti u obzir a kao proizvod rada algoritma imamo kolonu izlaz (poslednju kolonu naše tabele).

Baferi rade po principu kliznih-prozora. Podatak koji uđe u bafer moraće proći dužinu rečnika i postaviti reference na sve duplikate. Ovakav način rada neće biti vremenski najefikasniji, ali će rezultat biti efikasan jer u bafer ni jednog trenutka neće dospeti neki duplikat.[2]

Example of a LZ77 compression sliding window
Linija 12 11 10  9  8  7  6  5  4  3  2  1  0  1  2  3  4  5  6  7  8  9 Izlaz
1 (Prazno) a a c a a c a b c a (0,0,"a")
2 (Prazno) a a c a a c a b c a b (1,1,"c")
3 (Prazno) a a c a a c a b c a b a a (3,4,"b")
4 (Prazno) a a c a a c a b c a b a a a c (Prazno) (3,3,"a")
5 a a c a a c a b c a b a a a c (Prazno) (12,3,"$")
završetak

LZ78[uredi | uredi izvor]

LZ78 algoritam pak kompresiju vrši tako što u rečnik karaktere smešta na sledeći način: rečnik[indeks] = {indeksPrethodnog, karakter}. Dakle podatke bukvalno "vezuje" jedne za druge odgovarajućim indeksom tako što će mu dodeliti indeks prethodnog s tim da će karaktere smeštati "od nazad" da bi ispis mogao da funkcioniše.[3]

Primer: ako želimo da smestimo karaktere ABC uradićemo na sledeći način rečnik[1] = {0, 'A'}, rečnik[2] = {1, 'B'}, rečnik[3] = {2, 'C'}.

Ukoliko se pri dodavanju novog karaktera u rečnik dati karakter već pronađe unutar njega, neće se dodavati ponovo isti karakter već će se indeks promeniti da bi mogao da pristupi više pozicija. Ukoliko karakter nije pronađen u rečniku postupak je klasičan i očekivan, na novo mesto sa novim indeksom ga dodajemo i pamtimo mu indeks prethodnog.

Reference[uredi | uredi izvor]

  1. ^ [1], PefPak kompresija
  2. ^ [2], Algoritam kompresije LZ77
  3. ^ [3] Arhivirano na sajtu Wayback Machine (28. maj 2021) Lampel-Zivov notes

Spoljašnje veze[uredi | uredi izvor]