Sunteți pe pagina 1din 5

Codificare Huffman

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).

Constructia arborelui Huffman

D. Huffman a elaborat un algoritm 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.

Arborele binar Huffman


Exist situaii n care putem utiliza frecvenele standard de apariie a caracterelor, calculate n
funcie de limb sau de specificul textului.

Fie C={c1,c2,...,cn} mulimea caracterelor dintr-un text, iar f1,f2,...,fn, respectiv, numrul
lor de apariii. Dac li ar fi lungimea irului ce codific simbolul ci, atunci lungimea total a
reprezentrii ar fi :

n
L li fi
i 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={ {c1,f1},{c2,f2}, ..., {cn,fn}}, 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 A1 i A2 const n obinerea unui arbore A, al crui subarbore


stng este A1, subarbore drept A2, 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.3

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

Fig. 1.4

Pas 2: Unific arborii corespunztori lui b i c:

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

Fig. 1.6

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

Fig. 1.7

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

Fig. 1.8
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.

- arborii Huffman nu sunt unici. Adic, poi avea arbori diferii, pentru acelai set de
frunze cu aceleai frecvene. De exemplu,dac ai frunze cu aceeai frecven, poziia unora fat
de celelalte nu este important.

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