Primer neravnomernog koda: HUFFMAN-ov kod

Huffman-ov kod

Algoritam za konstrukciju Huffman-ovog koda se koristi za dobijanje optimalnog skupa kodnih reči za kodiranje poruke pre slanja. Cilj je da kodirana poruka bude što kraća da bi prenos bio brži. To se ne može postići ravnomernim kodom, te stoga kodne reči imaju različitu dužinu. Ideja je da se karakteri koji se češće pojavljuju u poruci kodiraju kraćim kodnim rečima. Može se dokazati da ovako kodirana poruka ima najmanju moguću dužinu u odnosu na sva moguća kodiranja.

U ovom primeru, kodiramo skup vokala (A, E, I, O, U) binarnom azbukom {0,1}, tj. svakom vokalu se pridružuje jedna binarna niska. Primalac poruke koristi drvo za dekodiranje poruke. Drvo za dekodiranje je binarno drvo, tj. iz svakog čvora drveta izlaze najviše dve grane: leva i desna. Takođe, u svaki čvor (sem jednog koga nazivamo koren) ulazi tačno jedna grana. Na slici je to predstavljeno tako da su grane usmerene odozgo naniže, tj. grana uvek izlazi iz gornjeg čvora i uvek ulazi u donji čvor. (Stoga je koren uvek najviši čvor na slici.) Čvorovi iz kojih ne izlaze grane nazivaju se listovi. Niz grana u drvetu takav da svake dve uzastopne grane imaju zajednički čvor nazivamo put i kažemo da put povezuje izlazni čvor prve grane i ulazni čvor poslednje grane. Na datoj slici je dat primer drveta čiji su čvorovi obeleženi sa 15, 6, 3, A, E, 9, O i U. Čvor 15 predstavlja koren, a grane se mogu predstaviti kao uređeni parovi oblika (izlazni čvor, ulazni čvor): (15,6), (6,3), (6,I), (3,A), (3,E), (15,9), (9,O), (9,U).

Listovi u drvetu za dekodiranje su uvek obeleženi elementima skupa koje kodiramo (u ovom primeru svaki list je obeležen jednim vokalom). Ako leve grane označimo nulom, a desne grane jedinicom, svakom vokalu možemo pridružiti put od korena do lista koji je obeležen tim vokalom. Dopisivanjem oznaka grana od kojih se put sastoji dobijamo jednu binarnu nisku. Npr, vokalu E odgovara put koji se sastoji od tri grane: (15,6), (6,3), (3,E); prve dve su obeležena nulom, a poslednja jedinicom, te vokalu E odgovara binarna niska 001. Upravo ta niska predstavlja kodnu reč koju pridružujemo vokalu E. Slično, kodne reči za vokale A, I, O, i U su 000, 01, 10 i 11 tim redom, tj oznake puteva koji vode od korena do listova obeleženih tim vokalima.

VokalPut od korena do lista (vokala)Kodna reč
A(15,6), (6,3), (3,A)000
E(15,6), (6,3), (3,E)001
I(15,6), (6,I)01
O(15,9), (9,O)10
U(15,9), (9,U)11

Poruka IOU se lako kodira sledećom niskom bitova: 011011. Ako bismo istu poruku kodirali ravnomernim kodom, njegova širina d morala bi da zadovolji nejednakost 5<=2d, odakle sledi da bi najmanja širina ravnomernog koda bila 3. Stoga bi poruka IOU zahtevala 3*3=9 bitova umesto 6 koliko je postignuto Huffman-ovim kodom.

Algoritam

Program Huffman Code Help Utility. je napisan sa ciljem da ilustruje algoritam za konstrukciju Huffman-ovog koda. Algoritam započinje određivanjem frekvencija (broj pojavljivanja) svakog karaktera koji se pojavljuje u poruci. Svakom karakteru se pridružuje jedno drvo koje sadrži samo jedan čvor (koji je ujedno i koren i list). Koren drveta se obeležava odgovarajućim karakterom i dodeljuje mu se njegova frekvencija. Drveta su sortirana po frekvenciji svojih korena (odgovarajućih karaktera) tako da je uvek moguće izabrati 2 drveta sa najmanjom frekvencijom.

Izabrani čvorovi sa najmanjom frekvencijom se zamenjuju poddrvetom tako da su oni listovi tog poddrveta, a korenu tog poddrveta se pridružuje zbir frekvencija njegovih listova. Dobijena drveta se potom ponovo sortiraju po frekvencijama svojih korenova i postupak se ponavlja dok se ne dobije jedno jedino drvo.

Na kraju ostaje da se svaka leva grana obeleži nulom, a desna - jedinicom. Dobijeno drvo je drvo dekodiranja.

Detaljniju ilustraciju daje Huffman Code Applet (lokalizovan na srpski


Autori ovog apleta.