You are on page 1of 4

Arbori de compresie Huffman

Tehnicile de compresie sunt utile pentru fiiere text, n care anumite caractere apar cu o
frecven mai mare dect altele, pentru fiiere ce codific imagini sau sunt reprezentri
digitale ale sunetelor ori ale unor semnale analogice, ce pot conine numeroase motive care se
repet. Chiar dac astzi capacitatea dispozitivelor de memorare a crescut foarte mult,
algoritmii de compresie a fiierelor rmn foarte importani, datorit volumului tot mai mare
de informaii ce trebuie stocate. n plus, compresia este deosebit de util n comunicaii,
transmiterea informaiilor fiind mult mai costisitoare dect prelucrarea lor.
Una dintre cele mai rspndite tehnici de compresie a fiierelor text, care, n funcie de
caracteristicile fiierului ce urmeaz a fi comprimat, conduce la reducerea spaiului de
memorie necesar cu 20%-90%, a fost descoperit de D. Huffman n 1952 i poart numele de
codificare (cod) Huffman. n loc de a utiliza un cod n care fiecare caracter s fie reprezentat
pe 7 sau pe 8 bii (lungime fix), se utilizeaz un cod mai scurt pentru caracterele care sunt
mai frecvente i coduri mai lungi pentru cele care apar mai rar.
S presupunem c avem un fiier de 100.000 de caractere din alfabetul {a,b,c,d,e,f}, pe
care dorim s-l memorm ct mai compact. Dac am folosi un cod de lungime fix, pentru
cele 6 caractere, ar fi necesari cte 3 bii. De exemplu, pentru codul:
a b c d e f
cod fix 000 001 010 011 100 101
ar fi necesari n total 300.000 bii.
S presupunem acum c frecvenele cu care apar n text cele 6 caractere sunt :
a b c d e f
frecven 45 13 12 16 9 5
Considernd urmtorul cod de lungime variabil :
a b c d e f
cod variabil 0 101 100 111 1101 1100
ar fi necesari doar 224.000 bii (deci o reducere a spaiului de memorie cu aproximativ 25%).
Problema se reduce deci la a asocia fiecrui caracter un cod binar, n funcie de
frecven, astfel nct s fie posibil decodificarea fiierului comprimat, fr ambiguiti. De
exemplu, dac am fi codificat a cu 1001 i b cu 100101, cnd citim n fiierul comprimat
secvena 1001 nu putem decide dac este vorba de caracterul a sau de o parte a codului
caracterului b.
Ideea de a folosi separatori ntre codurile caracterelor pentru a nu crea ambiguiti ar
conduce la mrirea dimensiunii codificrii.
Pentru a evita ambiguitile este necesar ca nici un cod de caracter s nu fie prefix al
unui cod asociat al unui caracter (un astfel de cod se numete cod prefix).
Codul Huffman
D. Huffman a elaborat un algoritm Greedy care construiete un cod prefix optimal, numit cod
Huffman. Prima etap n construcia codului Huffman este calcularea numrului de apariii ale
fiecrui caracter n text. Exist situaii n care putem utiliza frecvenele standard de apariie a
caracterelor, calculate n funcie de limb sau de specificul textului.
Fie C={c
1
,c
2
,...,c
n
} mulimea caracterelor dintr-un text, iar f
1
,f
2
,...,f
n,
respectiv,
numrul lor de apariii. Dac l
i
ar fi lungimea irului ce codific simbolul c
i
, atunci lungimea
total a reprezentrii ar fi :
L l f i i
i
n

1

Scopul nostru este de a construi un cod prefix care s minimizeze aceast expresie.
Pentru aceasta, construim un arbore binar complet n manier bottom-up astfel :
-Iniial, considerm o partiie a mulimii C={ {c
1
,f
1
},{c
2
,f
2
}, ..., {c
n
,f
n
}}, reprezentat
printr-o pdure de arbori formai dintr-un singur nod.
-Pentru a obine arborele final, se execut n-1 operaii de unificare.
Unificarea a doi arbori A
1
i A
2
const n obinerea unui arbore A, al crui subarbore
stng este A
1
, subarbore drept A
2
, iar frecvena rdcinii lui A este suma frecvenelor
rdcinilor celor doi arbori. La fiecare pas unificm 2 arbori ale cror rdcini au frecvenele
cele mai mici.
De exemplu, arborele Huffman asociat caracterelor {a,b,c,d,e,f} cu frecvenele
{45,13,12,16,9,5} se construiete pornind de la cele cinci noduri din figura 1:

Fig. 1.
Pas 1: Unific arborii corespunztori lui e i f, deoarece au frecvenele cele mai mici:

Fig. 2.
Pas 2: Unific arborii corespunztori lui b i c:

Fig. 3.
Pas 3: Unific arborele corespunztor lui d i arborele obinut la primul pas, cu rdcina ce are
frecvena 14:

Fig. 4.
Pas 4: Unific arborii ce au frecvenele 25 i 30.

Fig. 5.
Pas 5: Unificnd ultimii doi arbori, obin arborele Huffman asociat acestui set de caractere cu
frecvenele specificate iniial.

Fig. 6.
Nodurile terminale vor conine un caracter i frecvena corespunztoare caracterului;
nodurile interioare conin suma frecvenelor caracterelor corespunztoare nodurilor terminale
din subarbori.
Arborele Huffman obinut va permite asocierea unei codificri binare fiecrui caracter.
Caracterele fiind frunze n arborele obinut, se va asocia pentru fiecare deplasare la stnga pe
drumul de la rdcin la nodul terminal corespunztor caracterului un 0, iar pentru fiecare
deplasare la dreapta un 1.
Obinem codurile :
a b c d e f
cod 0 100 101 110 1110 1111

Observaii
- caracterele care apar cel mai frecvent sunt mai aproape de rdcin i astfel lungimea
codificrii va avea un numr mai mic de bii.
- la fiecare pas am selectat cele mai mici dou frecvene, pentru a unifica arborii
corespunztori. Pentru extragerea eficient a minimului vom folosi un min-heap. Astfel
timpul de execuie pentru operaiile de extragere minim, inserare i tergere va fi, n cazul cel
mai defavorabil, de O(log n).
Algoritm de construcie a arborelui Huffman
Pas 1. Iniializare :
- fiecare caracter reprezint un arbore format dintr-un singur nod;
- organizm caracterele ca un min-heap, n funcie de frecvenele de apariie;
Pas 2. Se repet de n-1 ori :
- extrage succesiv X i Y, dou elemente din heap
- unific arborii X i Y :
- creaz Z un nou nod ce va fi rdcina arborelui
- Z.st := X
- Z.dr := Y
- Z.frecv := X.frecv+Y.frecv
- insereaz Z n heap;
Pas 3. Singurul nod rmas n heap este rdcina arborelui Huffman. Se genereaz codurile
caracterelor, parcurgnd arborele Huffman.
Dezavantaje
Metoda de compresie bazat pe arbori Huffman statici are o serie de dezavantaje:
1. Fiierul de compactat trebuie parcurs de dou ori: o dat pentru a calcula numrul de
apariii ale caracterelor n text, a doua oar pentru a comprima efectiv fiierul. Deci metoda nu
poate fi folosit pentru transmisii de date pentru care nu este posibil reluarea.
2. Pentru o dezarhivare ulterioar a fiierului, aa cum este i firesc, este necesar memorarea
arborelui Huffman utilizat pentru comprimare, ceea ce conduce la mrirea dimensiunii
codului generat.
3. Arborele Huffman generat este static, metoda nefiind capabil s se adapteze la variaii
locale ale frecvenelor caracterelor.
Aceste dezavantaje au fost n mare parte eliminate n metodele care folosesc arbori
Huffman dinamici, ideea fiind ca la fiecare nou codificare, arborele Huffman s se
reorganizeze astfel nct caracterul respectiv s aib eventual un cod mai scurt.

Exercii
1.Scrieti o aplicate care construiete un arbore Huffman
2.Codai i decodai o serie fiiere text.
3.Scriei o aplicaie care introduce n fiierul codat i arborele de codare.