STISKANJE DATOTEK
Opis algoritma za zip
stiskanje
-
Zip stiskalni program temelji na LZ77 (Lempel - Ziv 1977)
algoritmu. Najde ve~kratne nize v vhodnih podatkih. Drugi pojavitveni
niz se nadomesti s kazalcem na prej{nji niz v obliki para
(oddaljenost, dol`ina) . Oddaljenost je omejena z 32K byti,
dol`ina pa z 258 byti. ^e se niz ne pojavi nikjer v 32K bytih, se
ta niz prepi{e kot zaporedje enakih bytov. (V tem opisu se mora niz
jemati kot neomejeno zaporedje bytov in ne kot omejen tiskan znak).
-
Enaki nizi ali dol`ine ujemalnih nizov so
stisnjeni s prvim Huffmanovim drevesom, oddaljenosti do ujemalnih
nizov pa z drugim drevesom. Drevesi sta shranjeni v kompaktni obliki
na za~etku vsakega bloka. Bloki imajo lahko poljubno velikost
(razen tega morajo stisnjeni podatki enega bloka ustrezati
razpolo`ljivi velikosti pomnilnika). Velikost bloka je dolo~ena ko
zip
z algoritmom odlo~i, kdaj bi bilo koristno za~eti nov blok z sve`ima
drevesoma (to bi bilo v grobem opis stiskanja).
-
Ponovitvene nize najdemo z uporabo "hash" tabel. Vsi vhodni nizi
dol`ine 3 se vnesejo v "hash" tabelo. "Hash" indeks je izra~unan za
naslednje 3 byte. ^e vrsta "hash" ni prazna za naslednji indeks, se
vsi nizi v vrsti primerjajo s trenutnim vhodnim nizom in ozna~i
se najdalj{i niz.
-
"Hash" vrsta za~ne iskanje pri najnovej{em nizu z najkraj{o razdaljo,
in tako izkoristi prednost pri Huffmanovem kodiranju. Vrsta je
enojno povezana in v njej ni brisanja. Algoritem preprosto
opusti stare ujemalne nize.
-
Da prepre~imo najslab{o mo`no situacijo, so zelo dolge vrste
samodejno skraj{ane (na za~etku ali koncu) na dolo~eno dol`ino.
To lahko dolo~imo v izbiri, ki jih program zip vsebuje
(zip -1 do -9). Tako zip ne najde vedno najdalj{i mo`en ujemalni
niz, vendar poi{~e dovolj dolgega.
-
Zip v vrsti odlo`i tudi ujemalne nize s po~asnej{im ra~unskim
mehanizmom. Potem ko je algoritem na{el ujemalni niz dol`ine N,
zip i{~e dalj{i ujemalni niz na naslednjem vhodnem bytu. ^e ga najde,
se prej{nji ujemalni niz skraj{a v niz dol`ine ena ( to povzro~i
nastank enega enojnega byte). To nam omogo~i, da kasneje v
algoritmu poi{~emo dalj{i ujemalni niz. Druga~e zadr`imo originalni
ujemalni niz in naslednji mo`en je le N korakov pozneje.
-
Ujemalni nizi z po~asej{im ra~unskim mehanizmom so tudi izbira ki jo
program zip vsebuje. ^e je trenutni ujemalni niz dovolj dolg, zip
preneha z iskanjem dalj{ega, kar pospe{i celoten proces stiskanja.
^e je stiskalno razmerje pomembnej{e od hitrosti stiskanja, zip
posku{a najti dalj{i ujemalni nizi, ~eprav je prvotni `e dovolj dolg.
-
Ujemalni nizi s po~asnej{im ra~unskim mehanizmom niso uporabni za
hitro stiskanje(izbira hitrosti -1 do -3). Pri tem hitrem stikanju,
kadar ne najdemo ustreznega ujemalnega niza ali ta ni dovolj dolg,
se v "hash" tabelo vrinejo novi nizi. To zmanj{a stiskalno razmerje,
vendar se prihrani ~as, saj se
zmanj{a iskanje in vrivanje ujemalnega niza.
Ujemalni niz
je ve~ji ali enak niz (po dol`ini), ki se ujema z nekim
predhodnim nizom.