Fujitsu-Siemens
 
M A G A Z I N
 
SOFTWARE 
  Marko Petrović

Kako radi Zip? Kompresija na delu!

Vrlo korisni alati koje ste verovatno do sada koristili mnogo puta su alati za komprimovanje i arhiviranje podataka. Najpopularniji od njih je verovatno WinZip čije DOS verzije se sigurno sećaju "stariji korisnici". Osim njega, u upotrebi su i RAR, ARJ... Svi oni omogućuju da se smanji prostor koji neki podaci zauzimaju na disku. Ranije je njihova upotreba bila još izraženija jer su diskovi bili daleko manjeg kapaciteteta, dok se veličina prosečnih dokumenata nije drastično menjala. Bez obzira na činjenicu drastičnog smanjenja cena CD pisača i medija, povećanja kapaciteta diskova, prodora DVD tehnologije, upotreba alata za komprimovanje podataka ne gubi na značaju. I dalje je npr. veoma bitno da se što više smanji veličina podataka koji se prenose, recimo preko Interneta. Osim toga, komprimovanje podataka je veoma rasprostranjeno ne samo u računarskoj tehnici, već i u telekomunikacijama (mobilna telefonija, prenos slike, zvuka...) i drugim sferama.


Kako funkcioniše kompresija?


Svaki postupak komprimovanja podataka se oslanja na matematiku. Ako ste tokom školovanja izbegavali ovaj predmet, slobodno nastavite sa čitanjem jer ćemo sve objasniti pomoću adekvatnih i "pitkih" primera.
Bez obzira na sadržaj nekog dokumenta (tekst, slika, muzika, film, itd.), u računaru je zapisan u binarnom obliku (nule i jedinice). Sama kompresija jednostavno rečeno, smanjuje veličinu dokumenta time što smanjuje potreban broj nula i jedinica za zapis dokumenta. Npr. ako je na početku bilo potrebno 300 nula i jedinica, nakon primene postupka za komprimovanje biće ih potrebno nekoliko puta manje.


Stepen kompresije


Stepen kompresije je odnos veličina originalnog (nekomprimovanog) dokumenta i njegove komprimovane verzije. Taj stepen nije neka fiksna veličina, već zavisi od više parametara. Vrsta dokumenta je recimo jedan od njih. Verovatno ste primetili da se npr. Word-ovi dokumenti drastično smanje nakon "zipovanja", dok slike uglavnom ostaju iste veličine.
Sadržaj dokumenta takođe utiče na stepen kompresije. U sledećem primeru smo kreirali tri tekstualna dokumenta iste veličine (istog broja slova) u Windows-ovom programu Notepad, a zatim ih komprimovali već pomenutim WinZip-om.

Dokument
Veličina (bajt)
Stepen kompresije
Originalni dokument (nekomprimovan)
982
1
Komprimovan, sastavljen od svih istih slova
133
7.38
Komprimovan, sastavljen od jedne reči koja je ponovljena više puta
138
7.12
Komprimovan, sastavljen od različitih slova
608
1.62


Sadržaj nekomprimovanog dokumenta nije bitan, jer svako slovo zauzima istu veličinu (1 bajt).
Kao što se vidi iz tabele, najveći stepen kompresije ima dokument koji u sebi ima sva ista slova. Iznad njega je dokument koji ima jednu reč ponovljenu više puta. Ovde je stepen kompresije nešto niži, dok je najmanji za dokument gde nije zastupljeno neko ponavljanje, već se dokument sastoji od slučajno dobijenih slova.
Najbolju statistiku ima prvi, a najlošiju poslednji dokument. Za kucani tekst iz realnog života, gde se mogu pojaviti iste reči, očekivani stepen kompresije je negde između stepena kompresije drugog i trećeg dokumenta.


Zašto je to tako?


Da bismo odgovorili na ovo pitanje moramo objasniti način na koji WinZip funkcioniše. Kao što je već rečeno, matematika je u pozadini ovakvih postupaka. Procedura, odnosno algoritam koji se u tom slučaju primenjuje je Hafmanov (Huffman) algoritam.


Hafmanov algoritam


Postoje mnoge verzije ovog algoritma, kako jednostavne, tako i kompleksnije. On pripada grupi algoritama sa promenljivom dužinom kodne reči. To znači da se pojedini simboli (u našem slučaju slova) predstavljaju nizovima bitova (kodnim rečima), koji su različite dužine. Dakle, kodne reči su nizovi nula i jedinica različite dužine.
Karakteristika ovog algoritma je da smanjuje nepotrebno ponavljanje simbola i na taj način omogućuje kompresiju podataka. To smanjenje se zasniva na različitim verovatnoćama različitih simbola. Simboli koji imaju veću verovatnoću pojavljivanja se koduju kraćim kodnim rečima, a simboli koji imaju manju verovatnoću pojavljivanja se koduju dužim kodnim rečima.
Kao primer prikazaćemo kompresiju (kodiranje) reči "OMEGAMAGAZIN". Za skup znakova (slova) koristićemo samo slova koja se koriste u našem primeru. Jedno slovo zauzima jedan bajt, a jedan bajt sadrži 8 bitova. Naša reč ima 12 bajtova, tj. 96 bitova. Pošto naša reč ima 12 slova, lako se izračunava da je verovatnoća pojavljivanja jednog slova 1/12 ili 0.083. Npr. novčić ima dve različite strane (pismo i glava) i verovatnoća da će se prilikom bacanja dobiti pismo ili glava je 1/2.


Krenimo na posao!


Prvo se prebroji koliko puta se pojavljuje određeno slovo i verovatnoća pojavljivanja se pomnoži sa tim brojem. Zatim se napravi tabela:

Slovo
Broj ponavljanja
Verovatnoća
O
1
0.083
M
2
0.166
E
1
0.083
G
2
0.166
A
3
0.249
Z
1
0.083
I
1
0.083
N
1
0.083

Postupak (algoritam) kodiranja je sledeći:
1. Poređaju se simboli po opadajućim verovatnoćama
2. Povežu se simboli sa najmanjim verovatnoćama u novi simbol, čija je verovatnoća pojavljivanja zbir verovatnoća ta dva simbola
3. Korak 2. se ponavlja sve dok se ne generiše simbol čija je verovatnoća 1
4. Pravi se kodno drvo (ili tebela), i u njemu se donjim granama dodeli vrednost "1", a gornjim "0" (binarni brojevi)
Sada pravimo stablo:

 

Sa drveta se dobijaju kodovi za pojedina slova na sledeći način: krenemo iz korena drveta (mesto u kojem je verovatnoća 1) prema željenom simbolu i jednostavno pročitamo brojeve na granama drveta preko kojih se krećemo. Tim postupkom dobijamo sledeću tabelu:

Slovo
Verovatnoća
Kod
Broj bitova
A
0.249
00
2
M
0.166
01
2
G
0.166
100
3
O
0.083
101
3
E
0.083
1100
4
Z
0.083
1101
4
I
0.083
1110
4
N
0.083
1111
4

Potvrđena je činjenica da se slova sa najvećom verovatnoćom pojavljivanja koduju sa najmanjom dužinom kodne reči (u našem slučaju slovo "A" - 2 bita), a slova sa najmanjom verovatnoćom pojavljivanja se koduju sa 4 bita. Ako se naš primer predstavi u kodovanom obliku (OMEGAMAGAZIN), videćemo da je on veličine 35 bitova. Ovaj broj se dobije ako saberemo sve nule i jedinice potrebne da se ispišu sva slova našeg primera korišćenjem Hafmanovog koda. Ako sada podelimo broj bitova sa početka priče (96) koji je bio neophodan za prikaz nekodirane reči, dobija se da je stepen kompresije 2.74.
Hafmanov algoritam se još primenjuje i u kompresiji slika (npr. JPEG). Sigurno ste se nekad zapitali kako se neki dokumenti mogu veoma dobro komprimovati, dok drugi ne. Odgovor je vrlo jednostavan: zato što su ti dokumenti već komprimovani na neki način. To se naročito vidi, ako pokušate da komprimujete JPEG slike, MPEG video clip-ove, MP3 pesme, i sl. uz pomoć WinZip-a. Nemoguće je komprimovati komprimovane dokumente jer je njihova statistika već "istrošena".

 

VRH STRANE

(c) 2003 OMEGA - sva prava zadržana