Sunteți pe pagina 1din 10

Algoritmi de compresie de tip Huffman

1. Obiectivul lucrrii
Scopul acestei lucrri este prezentarea modului de implementare a algoritmilor
Huffman adaptivi FGK i Vitter.

2. Introducere teoretic
Termenul de compresie a datelor a aprut n contextul n care se manifesta o
necesitate evident de a atinge rate mari de transfer n reele sau de a stoca o cantitate
ct mai mare de informaii folosind ct mai puin spaiu. Compresia datelor este
necesar n zilele noastre i este foarte des folosit, mai ales n domeniul aplicaiilor
multimedia.
Codurile Huffman rezolv problema gsirii unui tabel optim al cuvintelor de cod
pentru simboluri cu distribuie arbitrar a probabilitii. n aceast lucrare, se vor
folosi urmtoarele convenii. irul de caractere necomprimate va fi mesajul i
alfabetul su va fi alfabetul original sau alfabetul mesajului. Ieirea comprimat va fi
alctuit din simbolurile rezultate. Se va numi (cuvnt de cod) un ir de simboluri
rezultate, asociate unui simbol din mesaj, iar tabelul cuvintelor de cod va fi setul
codurilor asociate tuturor simbolurilor din alfabetul mesajului. Un tabel al cuvintelor
de cod poate fi vzut ca o funcie F care asociaz simbolurile din mulimea A,
alfabetul mesajului, cu cele din submulimea B, a tuturor irurilor (care au elemente)
unic determinate, formate din alfabetul rezultat B.
Huffman, n lucrarea sa de referin din 1952, prezint procedura de construire a
codurilor optimale de lungime variabil, dndu-se o distribuie cu frecven arbitrar
pentru un alfabet finit. Aceast procedur este construit pe baza ctorva condiii care,
dac sunt satisfcute, produc un tabel optimal al cuvintelor de cod.
Primele condiii sunt dup cum urmeaz:
a) nici un cod de cod nu este prefixul altui cuvnt de cod;
b) nu este necesar nici o informaie suplimentar ca delimitator ntre coduri.
Aceste dou cerine conduc la formularea urmtoarelor trei:
c) L(a1) L(a2) ... L(an), unde L(an) este lungimea cuvntului de cod an.
d) dou cuvinte de cod au lungimea Lmax i sunt identice, n afara ultimului bit.
e) Fiecare cuvnt de cod posibil de lungime Lmax1 ori este deja folosit, ori are
unul din prefixele sale folosit drept cuvnt de cod.
Un arbore Huffman este un arbore binar cu noduri ponderate care are
proprietatea de fraternitate, iar ponderea unui nod printe este egal cu suma
ponderilor urmailor si direci. Fiecare nod al arborelui Huffman este caracterizat de
3 parametri: ponderea asociat, poziia sa n cadrul arborelui i tipul su. n cazul
codrii Huffman, este necesar s se creeze mai nti un dicionar. Acest dicionar
conine caracterele distincte aflate n textul dat, fiecrui caracter asociindu-i-se o
pondere (calculat ca raportul dintre numrul de apariii al acelui caracter n mesaj i
lungimea mesajului), iar ulterior, n urma executrii algoritmului, cuvintele de cod
formate pentru fiecare caracter. Caracterele distincte se ordoneaz n ordinea
descresctoare a ponderilor.

66 8

Tehnologii i echipamente multimedia lucrri practice

Formarea arborelui de construcie a codului Huffman binar decurge dup


urmtorii pai:
Pasul 1. Sunt localizate cele dou noduri libere cu cea mai mic pondere.
Pasul 2. Pentru nodurile gsite la pasul 1 se creeaz un nod printe. Acestui nod
nou creat i se va atribui o pondere egal cu suma ponderilor celor doi
urmai ai si.
Pasul 3. Nodul printe este adugat listei de noduri libere a arborelui, iar cele
dou noduri urma sunt eliminate din aceast list.
Pasul 4. Unuia dintre nodurile urma i este atribuit calea care este urmat n
cazul decodrii unui bit de 0, iar celuilalt urma calea care este
urmat n cazul decodrii unui bit de 1.
Pasul 5. Paii anteriori sunt repetai succesiv pn n momentul n care mai
rmne un singur nod liber. Acesta este desemnat ca fiind nodul
rdcin al arborelui.
2.1. Algoritmul Faller, Galler i Knuth (FGK)
Proprietatea de nvecinare (Gallager, 1978); un arbore binar prezint
proprietatea de nvecinare dac fiecare nod, cu excepia nodului rdcin, are un vecin
i dac nodurile pot fi ordonate n funcie de pondere (n ordine descresctoare), cu
fiecare nod adiacent n ordonare vecinului su din arbore. Un cod prefix binar este cod
Huffman dac i numai dac arborele prezint proprietatea de nvecinare.
Algoritmul de codare FGK decurge dup urmtorii pai:
Pasul 1. La nceput, arborele este format dintr-un singur nod terminal, numit i
nodul 0. Acesta este un nod special, folosit pentru a reprezenta cele nk
mesaje neutilizate.
Pasul 2. La fiecare mesaj transmis, ambele pri (codorul i decodorul) trebuie
s incrementeze ponderile i s refac arborele de codare pentru a
menine proprietatea de nvecinare.
Pasul 3. La momentul de timp la care au fost deja transmise t mesaje, k dintre
ele fiind distincte (k < n), arborele obinut este un arbore Huffman cu
k+1 noduri terminale, cte unul pentru fiecare mesaj, plus unul
corespunztor nodului 0. Dac al (t+1)-lea mesaj este unul dintre cele k
mesaje deja transmise, algoritmul transmite codul curent (pentru
mesajul at+1), incrementeaz numrtorul corespunztor i reface
arborele. Dac apare un mesaj nefolosit, nodul 0 este divizat pentru a
crea o pereche de noduri terminale.
Pasul 4. Arborele este refcut din nou. n acest caz, este transmis codul pentru
nodul 0; n plus, destinatarul trebuie s fie informat care dintre cele nk
mesaje a aprut.
2.2. Algoritmul Vitter
Algoritmul Vitter este o variaie a algoritmului FGK. Diferena principal ntre
algoritmul FGK i algoritmul Vitter este modul n care sunt numerotate nodurile.
Algoritmul Vitter ordoneaz nodurile n acelai mod cu algoritmul FGK, dar cere ca
nodurile terminale cu o anumit pondere s precead nodurile interne cu aceeai
pondere i adncime, n timp ce n algoritmul FGK era suficient ca ponderile
nodurilor de la o anumit adncime s fie aranjate de la stnga la dreapta, fr a face

Algoritmi de compresie de tip Huffman

67

distincie ntre nodurile interne i nodurile terminale. Aceast modificare este


suficient pentru a garanta c algoritmul Vitter codeaz o secven de lungime s cu nu
mai mult de s bii fa de algoritmul Huffman static, fr costul suplimentar de
transmitere ctre decodor a tabelei de probabiliti sau a cuvintelor de cod.
Optimizrile aduse de algoritmul Vitter pot fi sintetizate astfel:
numrul de interschimbri prin care un nod este deplasat n sus n arbore la
refacere este limitat la 1;
se minimizeaz valorile li (lungimea maxim a cilor) i max{li} (nlimea
arborelui).

3. Descrierea evoluiei programului


Programul are ca scop prezentarea modalitilor de construcie a arborilor pentru
codrile Huffman, FGK i Vitter. Dup cum se observ n figura 1, s-a creat o
fereastr principal n care poate fi introdus textul care urmeaz a fi codat i se poate
alege tipul codrii.

Fig. 1. Fereastra principal a programului.

Din cauza constrngerilor de construcie a arborilor, s-au introdus limitri n


ceea ce privete textul care se dorete a fi codat. Astfel, lungimea textului nu trebuie
s depeasc 50 de caractere, iar numrul caracterelor distincte s nu fie mai mare de
19. Dup introducerea textului, se alege tipul de codare dorit i se deschide o nou
fereastr pentru fiecare codare n parte.
3.1. Codarea Huffman
n figura 2 se poate observa modul de implementare a algoritmului Huffman. n
cadrul acestei ferestre, exist patru butoane (ordonare, construire arbore, codare
Huffman, napoi), un spaiu de editare, trei coloane (caracter, pondere, cod) i un
panou pentru desenare. n spaiul de editare, apare textul introdus n cadrul ferestrei
principale, text care urmeaz a fi codat. Acest text nu poate fi modificat n cadrul
acestei ferestre. Acionnd primul buton (ordonare), se creeaz o matrice. n prima
coloan a matricei se introduc toate caracterele distincte, iar n a doua coloan se vor
introduce cuvintele de cod alocate. Practic, aceast matrice reprezint dicionarul, care
va putea fi folosit la decodare. Matricei i se asociaz i un vector n care se introduc
ponderile corespunztoare fiecrui caracter din cadrul textului.

68 8

Tehnologii i echipamente multimedia lucrri practice

Fig. 2. Fereastra pentru codarea Huffman.

Ponderea se calculeaz ca raportul dintre numrul de apariii al caracterului


respectiv i lungimea total a textului. Suma ponderilor tuturor caracterelor trebuie s
fie egal cu 1.
P(ai )

nr _ ap(ai )
,
L

unde P(ai) reprezint ponderea caracterului ai, nr_ap(ai) reprezint numrul de apariii
a caracterului ai i L reprezint lungimea textului. Ponderile calculate trebuie s
ndeplineasc condiia:
k

P(ai ) 1 ,

i 1

unde k reprezint numrul de caractere distincte ale textului dat.


Dup ce s-au calculat ponderile pentru toate caracterele distincte, att caracterele
ct i ponderile acestora se ordoneaz descresctor dup valoarea ponderilor. n cadrul
ferestrei pentru codarea Huffman, apar primele dou coloane, unde sunt afiate
caracterele distincte, respectiv ponderile acestora, dup cum s-au ordonat, adic
descresctor.
La acionarea celui de-al doilea buton (construire arbore), apare arborele
Huffman format cu caracterele din text, n cadrul panoului din dreapta, dup cum se
observ n figura 2. Acest arbore se formeaz n felul urmtor:
toate ponderile caracterelor se introduc ntr-o list simplu nlnuit, n
ordine cresctoare, lista avnd dou cmpuri: valoarea (ponderea) i nodul
corespunztor;

Algoritmi de compresie de tip Huffman

69

se iau primele dou elemente ale listei (adic, cele cu ponderile cele mai
mici), cu care se creeaz un arbore format din cele dou noduri ca urmai i
un printe, cu valoarea (ponderea) egal cu suma ponderilor celor doi urmai
(n stnga se afl nodul cu ponderea cea mai mic);
primele dou elemente ale listei cu care s-a format arborele sunt terse din
list i se introduce un element nou, printele format, locul su n list fiind
n funcie de valoarea sa, astfel nct lista s fie n permanen ordonat
cresctor;
se continu algoritmul pn cnd n list nu mai exist nici un element,
arborele fiind astfel creat.
Se apeleaz procedura de desenare a arborelui, acesta putnd fi vizualizat n
cadrul panoului din dreapta. n cazul n care nu se ncadreaz n ecran, exist bare de
defilare (scroll) n partea de jos i n dreapta panoului, sau se poate mri panoul n
cadrul cruia se deseneaz, cu ajutorul butonului mrete, aflat n stnga sus, n cadrul
panoului.
La acionarea celui de-al treilea buton (codare Huffman) apare cea de-a treia
coloan n stnga panoului, n cadrul creia se afieaz cuvntul de cod obinut pentru
fiecare caracter.
Fiecare nod care are urmai are n stnga o sgeat pe care este trecut valoarea
0, iar n dreapta valoarea 1. Cuvntul de cod pentru fiecare caracter se formeaz
citind, de la rdcin pn la nodul terminal asociat caracterului respectiv, valorile 0,
respectiv, 1, pe drumul cel mai scurt. Lungimea cuvntului de cod respectiv este egal
cu adncimea la care se afl nodul terminal. Adncimea rdcinii (primul nod printe)
este 0 i crete cu o unitate pentru fiecare generaie (fiecare rnd de sus n jos). Toate
codurile astfel obinute se trec pe a doua coloan a matricei care reprezint
dicionarul.
Cuvntul de cod va fi format nlocuind fiecare caracter din text cu codul obinut
n urma algoritmului Huffman. Acest cuvnt de cod va fi transmis pe pagina
principal, unde se vor mai calcula lungimea codului, lungimea medie a codului,
entropia sursei i eficiena codrii, dup cum urmeaz:
lungimea codului este numrul de bii care formeaz cuvntul de cod;
lungimea medie a codului este dat de formula:
k

Lm P(ai ) L(ai ) [bit],


i 1

unde L(ai) este lungimea cuvntului de cod corespunztor caracterului ai;


entropia sursei se calculeaz dup formula:
k

H ( S ) P(ai )log 2 P(ai ) [bit/simbol].


i 1

eficiena codrii reprezint raportul dintre entropia sursei i lungimea medie


a codului (altfel spus, coloana 3 / coloana 2):
E

H (S )
.
Li

Butonul napoi terge elementele create pentru a putea relua aplicaia pentru un
alt text i nchide fereastra codrii Huffman, ntorcndu-se la fereastra principal.

70 8

Tehnologii i echipamente multimedia lucrri practice

Cele patru butoane trebuie acionate n ordinea pailor, pentru a realiza un


algoritm corect. n cazul n care un alt buton este acionat naintea celui precedent,
este afiat un mesaj care anun c butoanele trebuie apsate n ordinea pailor.
3.2. Codarea FGK
Algoritmul de codare FGK este dinamic. La citirea fiecrui caracter din textul
dat, se formeaz un arbore, care are toate proprietile arborelui Huffman.
La crearea unui astfel de arbore, se pornete de la un nod cu valoarea (numrul)
0, iar primul caracter citit, mpreun cu acest nod 0, creeaz primul printe (rdcin a
arborelui), dup cum se observ n figura 3. De fiecare dat cnd apare un caracter
nou, acesta se nfrete cu nodul 0.

Fig. 3. Exemplu de formare a unui nod nou, nfrit cu nodul 0.

Fiecare nod al arborelui are urmtoarele cmpuri:


caracter sau liter n cazul nodurilor terminale, caracterul reprezint
simbolul sau litera creia i corespunde nodul respectiv, iar nodurile interne
au caracterul vid;
numr reprezint numrul de apariii al acelui caracter n textul citit;
codul sau cuvntul de cod se formeaz n urma formrii arborelui n acelai
mod ca la algoritmul Huffman;
adncimea reprezint ordinul generaiei de urmai la care s-a ajuns pornind
de la rdcin (rdcina avnd adncimea 0);
indexul reprezint numrul de ordine al nodurilor din arbore (citirea se
face de jos n sus i de la stnga la dreapta, indexul 1 avndu-l nodul cu
numrul 0, indexul 2 ultimul nod introdus, indexul cel mai mare aparinnd
rdcinii);
adncimea maxim reprezint numrul de generaii urmtoare pentru
fiecare nod (un nod terminal are adncimea maxim 0).
Modul de implementare al algoritmului FGK fiind dinamic, este necesar
implementarea acestui algoritm pe pai.
n figura 4 se poate observa fereastra creat pentru codarea FGK. Aceasta
conine dou cmpuri de editare (prima conine textul introdus n cadrul ferestrei
principale, iar cea de-a doua textul codat pn n acel moment reamintim c pentru
fiecare caracter citit se creeaz un nou arbore Huffman, iar acest lucru se evideniaz
n cadrul aplicaiei), dou butoane, un tabel cu trei coloane i un panou pentru
desenare.
Primul buton, intitulat Paii algoritmului FGK, realizeaz practic ntreg
algoritmul pentru fiecare caracter n parte, acest buton trebuind a fi acionat pentru
fiecare caracter al textului.

Algoritmi de compresie de tip Huffman

71

Fig. 4. Fereastra pentru codarea FGK.

Dac utilizatorul ncearc s se ntoarc n programul principal nainte de a fi


codat tot textul, apare mesajul Nu ai codat tot textul. Apsai butonul de codare pn
la terminarea irului de caracter.
Algoritmul se desfoar dup urmtorii pai:
la acionarea butonului se ia cte un caracter al textului n ordinea
introducerii de la tastatur;
se verific dac acel caracter care urmeaz a fi introdus n arbore a mai
aprut anterior sau nu;
dac acest caracter a mai aprut, se incrementeaz valoarea (numrul)
nodului corespunztor caracterului respectiv i se rearanjeaz arborele, care
trebuie s ndeplineasc anumite condiii (descrise n paragraful urmtor);
dac respectivul caracter nu a mai aprut anterior, se mrete cu 2 valoarea
indexului fiecrui nod din arbore, se caut nodul cu numrul 0, valoarea sa
incrementndu-se (numrul devine egal cu 1), i se construiesc doi urmai
pentru acest nod gsit: cel din stnga devine nodul 0, iar cel din dreapta are
numrul 1 i caracterul citit n acel moment din text (caracterul nodului 0
este tot caracterul vid, dei este un nod terminal);
caracterul nou aprut se introduce ntr-o matrice cu dou cmpuri, primul
cmp reprezentnd caracterul, iar cel de-al doilea cuvntul de cod format n
urma executrii algoritmului;
se rearanjeaz arborele, care se deseneaz n cadrul panoului din dreapta, i
se afieaz n stnga panoului un tabel cu toate caracterele distincte aprute
pn n acel moment, numrul de apariii al acestora i cuvintele de cod
formate, dup cum se observ n figura 4. Toate codurile se reactualizeaz
pentru fiecare caracter citit.

72 8

Tehnologii i echipamente multimedia lucrri practice

Dac este acionat n continuare primul buton i dup codarea ntregului text,
apare mesajul Textul a fost codat n ntregime. Dac se dorete reluarea
algoritmului pentru un alt text sau chiar pentru acelai text, este necesar ntoarcerea
n fereastra principal, ceea ce se poate realiza apsnd butonul napoi.
Cel de-al doilea buton, napoi, terge elementele create pentru a putea relua
aplicaia pentru un alt text i nchide fereastra codrii curente, ntorcndu-se la
fereastra principal. Tot aici se transmit ctre fereastra principal (unde vor fi afiai)
parametrii codrii, i anume: cuvntul de cod format, lungimea codului, lungimea
medie a cuvintelor de cod, entropia sursei i eficiena codrii.

Fig. 5. Afiarea parametrilor n cadrul ferestrei principale.

Condiiile care trebuie ndeplinite la construcia unui arbore FGK sunt


urmtoarele:
nodurile trebuie s fie ordonate de jos n sus i de la stnga la dreapta, n
ordinea cresctoare a valorii numerelor;
nodul 0 trebuie s fie nfrit cu ultimul nod introdus, dac valoarea acestuia
este cea mai mic, sau cu nodul avnd valoarea minim;
numrul de noduri terminale trebuie s fie egal cu numrul caracterelor
distincte, plus nodul 0;
urmaii aceluiai nod printe sunt indexai consecutiv;
ponderea fiecrui nod descrete sau rmne constant odat cu creterea
indexului asociat;
dac dou noduri sunt pe acelai nivel ierarhic, urmaii nodului de indice
mai mic au indici inferiori indicilor urmailor celuilalt nod.
3.3. Codarea Vitter
Modul de implementare a algoritmului pentru codarea Vitter este asemntor
celui de la algoritmul FGK. Exist totui nite diferene, n special n cazul condiiilor
care trebuie ndeplinite la formarea arborelui. Condiiile care apar n plus n acest caz
sunt urmtoarele:
la introducerea unui caracter nou n arbore, acesta nu mai este urma al
nodului 0, ca la FGK, ci se caut nodul cu valoarea 1 avnd indexul cel mai
mare, acesta devenind printe al nodului 0 i al nodului nou introdus, iar
toate celelalte noduri mutndu-se cu o poziie, adic pe nodul cu indexul
avnd valoarea cu o unitate mai mic; pe poziia nodului 0 apare un nod
terminal asociat unui anumit caracter (cel care fusese nfrit cu nodul 0.)

Algoritmi de compresie de tip Huffman

73

chiar dac un caracter citit este deja prezent n arbore, nodul asociat acestui
caracter i schimb poziia, lund locul nodului terminal cu aceeai valoare
i cu indexul cel mai mare, toate celelalte noduri cu indexul mai mic dect
indexul nodului nou ocupat mutndu-se pe nodul cu indexul cu o unitate mai
mic, pn se ajunge la nodul modificat prin apariia caracterului considerat;
nodurile terminale preced nodurile interne;
valorile indecilor nodurilor sunt cresctoare de jos n sus i de la stnga la
dreapta, fa de cazul FGK, unde nu se respect ordinea la fiecare nivel;
adncimea arborelui trebuie s fie minim.

Fig. 6. Fereastra pentru codarea Vitter.

Fereastra pentru codarea Vitter, care poate fi observat n figura 6, are aceleai
componente i este construit la fel ca fereastra pentru codarea FGK.

4. Desfurarea lucrrii
1.
2.
3.
4.

Se parcurg noiunile teoretice din introducerea lucrrii;


Se lanseaz programul de aplicaie;
Se introduce textul care urmeaz a fi codat;
Se alege tipul de codare dorit (Huffman, FGK, Vitter);
I. Codarea Huffman
se observ modul de implementare al algoritmului Huffman, parcurgnd
etapele n ordinea pailor;
se vizualizeaz i se deseneaz arborele Huffman format;
algoritmul se reia pentru un nou exemplu, revenind n pagina principal.

Tehnologii i echipamente multimedia lucrri practice

74 8

II. Codarea FGK


algoritmul se implementeaz dinamic;
se observ la fiecare pas noul arbore format i se deseneaz arborele
final;
algoritmul se reia pentru un nou exemplu, revenind n pagina principal.
III. Codarea Vitter
algoritmul se implementeaz dinamic;
se observ la fiecare pas noul arbore format i se deseneaz arborele
final;
algoritmul se reia pentru un nou exemplu, revenind n pagina principal.
5. Se observ i se noteaz parametrii obinui n urma celor trei tipuri de
codri (lungimea codului, lungimea medie a codului, entropia sursei i
eficiena codrii);
6. Codarea se reia, introducnd un nou text.

5. ntrebri
1. Cum se realizeaz compresia de date prin algoritmii de tip Huffman?
2. Care sunt paii algoritmului FGK?
3. Care sunt paii algoritmului Vitter?
4. Care sunt deosebirile ntre modul de formare al arborelui FGK i al arborelui
Vitter?
5. Care dintre algoritmii studiai este recomandat pentru compresia unei surse
staionare? Dar n cazul n care sursa prezint aglomerri locale de simboluri (surs
nestaionar)? Explicai alegerea fcut.
6. Cum ar trebui s arate un text care s poat profita la maximum de aceast
familie de metode de compresie?
7. Dai un exemplu de text cu rat de compresie bun.
8. Dai un exemplu de text cu compresie slab. Explicai alegerea fcut.
9. Rulai cei trei algoritmi pentru acelai text. Ce observai?
10. Comparai eficiena codrii Huffman pentru un text cu dou caractere
distincte i pentru un alt text cu 10 caractere distincte, ambele avnd acelai numr
total de caractere. Ce observai?
11. Cum se modific rspunsurile de mai sus n cazul aplicrii algoritmilor FGK
i Vitter?
12. Care dintre cei trei algoritmi este mai eficient i de ce?

S-ar putea să vă placă și