You are on page 1of 21

ARBORE DE CODIFICARE HUFFMAN

Tehnicile de compreie sunt utile pentru fisiere text, in care


anumite caractere apar cu o frecventa mai mare decat altele,
pentru fisiere ce codifica imagini sau sunt reprezentari digitale
ale sunetelor ori ale unor semnale analogice, ce pot contine
numeroase motive care se repeta.

Una dintre cele mai raspandite tehnici de compresie a


fisierelor text a fost descoperita de David Huffman in 1952 si
poarta numele de codificare (cod) Huffman.

In loc de a utiliza un cod in care fiecare caracter sa fie


reprezentat pe 7 sau 8 biti(lungime fixa), se utilizeaza un cod
mai scurt pentru caracterele care sunt mai frecvente si coduri
mai lungi pentru caractere care apar mai rar. In unele cazuri
aceasta matoda poate reduce dimensiunea fisierelor cu peste
70%, in special in cazul fisierelor de tip text.

Vom studia mersul algoritmului pe un exemplu.

Fisierul de intrare : VENI, VIDI, VICI

Se parcurge sirul si se contorizeaza numarul de aparitii ale


fiecarui caracter distict.

Caractere
distincte

Nr de aparitii

Cunoscand ca lungimea sirului este de 16 caractere, putem


calcula foarte usor frecventa(probabilitatile), de aparitie ale
fiecarui caracter.
v Astfel:
v

Caractere
distincte

Frecventa
caracterelor

3/16

1/16

1/16

5/16

2/16

2/16

1/16

1/16

3/16

Pentru fiecare caracter distinct vom construi un arbore binar


optim avand un singur nod.
1/16

1/16

5/16

2/16

2/16

1/16

1/16

Asociem fiecarui nod frecventa de aparitie cheii nodului


respectiv.

Ideea este de a reduce la fiecare pas numarul de arbori binari


optimi prin combinare, pana cand se ajunge la un singur
arbore binar optim

In acest sens, la fiecare pas se aleg 2 dintre arborii binari


optimi disponibili, si anume acei 2 arbori binari optimi care au
frecventele de aparitie minime (minimul si urmatorul minim).
v Daca sunt mai mult de 2 arbori in aceasta situatie, se vor alege
arbitrar 2 dintre ei.
v In cazul nostru vom alege arbitrar al doilea si al treilea arbore,
ei avand frecventele de aparitie minime.
v Se vor inlocui cei 2 arbori printr-unul singur, care are ca
radacina un caracter fictiv * si cei 2 arbori selectati ca
subarbori (nu conteaza plasarea pe stanga sau pe dreapta,
ideea este ca unul din ei va fi subarbore stang si celalalt
subarbore drept).
v Frecventa de aparitie a noului arbore va fi data de suma
frecventelor de aparitie a celor 2 subarbori componenti.
v

Deoarece am inlocuit 2 arbori printr-unul singur, numarul total


de arbori a scazut cu o unitate.

3/16

2/16

5/16

2/16

2/16

E
1/16

1/16

1/16

N
1/16

Din cei 7 arbori ramasi, alegem doi care au frecventele de


aparitie minime. Acestia vor fi ultimi doi arbori care vor fi
inlocuiti printr-un nou arbore avand frecventa 2/16.

3/16

V
E
1/16

2/16

5/16

2/16

2/16

2/16

N
1/16

D
1/16

C
1/16

Din cei 6 arbori ramasi, alegem 2 arbori cu frecventele minime


v In cazul nostru sunt 4 arbori cu frecvente minime
v Alegem arbitrar doi dintre ei de exemplu arborii 4 si 5.
v Acestia vor fi inlocuiti printr-un nou arbore avand frecventa
de
4/16.
v

3/16

V
E
1/16

2/16

5/16

4/16

2/16

1/16

2/16

2/16

1/16

1/16

Acum alegem urmatorii doi arbori care au frecventele minime.


v Acestia vor fi al doilea si ultimul.
v Acestia se inlocuiesc printr-un nou arbore avand frecventa de
4/16.
v

3/16

4/16

5/16

4/16

*
E
1/16

*
N
1/16

D
1/16

2/16

2/16

1/16

Alegem urmatorii doi arbori cu frecvente minime


v Il alegem pe primu deoarece are frecventa minima 3/16, iar
din cei doi arbori cu frecventa 4/16 il alegem pe ultimul.
v Asadar dupa combinarea celor doi arbori vom avea un arbore
cu frecventa 7/16.
v

7/16

*
V
3/16

4/16

5/16

2/16

2/16

1/16

1/16

D
1/16

C
1/16

Dintre cei trei arbori ii alegem pe ultimii doi.


v Dupa combinarea celor doi arbori vom avea un singur arbor cu
frecventa de 9/16.
v

7/16

9/16

V
3/16

*
,

2/16

2/16

*
E
1/16

5/16

*
N

1/16

1/16

C
1/16

Nu mai avem de ales, fiind doar doi arbori


v Acestia vor fi inlocuiti printr-un nou arbore avand frecventa
de 16/16.
v

16/16

7/16

9/16

3/16

2/16

2/16

*
E
1/16

5/16

*
N
1/16

1/16

1/16

*
1

*
1

*
0

*
1

I
1

*
0

*
1

Caracterele din sirul initial au ajuns frunze in arborele


Huffman
Drumul de la radacina la fiecare frunza va da codul Huffman
al caracterului corespunzator frunzei

Astfel vom avea:


V-codul 00;
E-codul 1000;
N-codul 1001;
I-codul 11;
v

, -codul 010;
- -codul 011;
D -codul 1010;
C -codul 1011;

In mod normal, un caracter din sir (sau din fisier, daca folosim
un fisier) se codifica pe 8 biti. In cazul nostru ar veni
8*16=128 biti
v In cazul de fata, tinand cont ca sunt numai 8 caractere in total,
am putea implementa foarte usor o codificare binara de 3
biti/caracter si am avea in total 48 biti.
v Daca implementam algoritmul Hoffman am avea 44 biti.
v

Se observa ca codurile Huffman obtinute in urma algoritmului


prezentat sunt mai scurte decat codurile standard de 3
biti/caracter
v Mai precis, fiecare aparitie a caracterelor V, I in sirul
initial va duce la o economie de 1 bit, caracterele , si
-nu va cauza nici pierdere nici castig (se folosesc tot 3 biti)
iar caracterle E,N,Dsi C aduc un surplus de 1 bit.
Dar per total codificarea Huffman este mai avantajoasa din
punct de vedere al memoriei fata de codificarea pe trei biti.
v Nu intamplator, caracterele V siI sunt caracterele care
aveau frecventele de aparitie cele mai mari, astfel incat
economiile de care aminteam se vor manifesta foarte des
v

Practic, datorita faptului ca la fiecare pas am selectat cei 2


arbori care aveau frecventele de aparitie minime, caracterele
cu frecvente de aparitie relativ mari au fost lasate la urma,
astfel incat in arborele final sa se regaseasca mai sus decat
caracterele cu frecvente de aparitie mai mici

Aceasta este ideea dominanta la arbori optimi, deci arborele


rezultat este, din acest punct de vedere, un arbore optim
v Vom codifica sirul: VENI, VIDI, VICI folosind codurile
obtinute.
v Rezultatul este: 00 1000 1001 11 010 011 00 11 1010 11 010
011 00 11 1011 11
v Sunt necesari 44 de biti
v

Codificarea cu 3 biti/caracter ar fi dus la 316 = 48 de biti,


deci am realizat o compresie de 91%
v Codificarea implicita cu 8 biti/caracter ar fi dus la 816 = 128
de biti deci am realizat o compresie de 34% fata de aceasta
codificare
v Codurile Huffman obtinute au proprietatea de prefix
v Proprietatea de prefix suna astfel: nici un cod nu este prefix
pentru alt cod
v Aceasta proprietate este asigurata implicit din modul de
constructie al arborelui Huffman
v Fiecare caracter ajunge o frunza in arbore, si nu exista drum
de la radacina la o frunza in totalitate continut in alt drum de
la radacina la o alta frunza (o proprietate de bun simt a
arborilor, in general)
v

Decodificarea este de asemenea simpla pentru codurile prefix.


Cum nici un cuvnt de cod nu este prefixul altuia, nceputul
oricarui fisier codificat nu este ambiguu. Putem sa identificm
cuvantul de cod de la nceput, sa l convertim n caracterul
original, sa-l ndepartam din fisierul codificat i s repetm
procesul pentru fisierul codificat ramas.
v Avand codificarea Huffman a sirului
001000100111010 011001110101010
0110011101111
v Pentru a decodifica sirul de biti, sirul se desparte in:
00 - 1000 - 1001 - 11 - 010 - 011 - 00 - 11 - 1010 -11 - 010
011 - 00 - 11 - 1011 - 11
v

Procesul de decodificare necesit o reprezentare convenabil a


codificrii prefix astfel nct cuvantul iniial de cod s poat fi
uor identificat. O astfel de reprezentare poate fi dat de un
arbore binar de codificare, care este un arbore complet
(adica un arbore n care fiecare nod are 0 sau 2 fii, ale carui
frunze sunt caracterele date

BIBLIOGRAFIE

Soroiu Claudiu, Compresia datelor, serial Gazeta de


informatic nr.13/1, Cluj-Napoca, ianuarie 2003.
Soroiu Claudiu, Compresia datelor, serial Gazeta de
informatic nr.13/2, Cluj-Napoca, februarie 2003.
Huffman Coding Wikipedia
Structuri de date si Algoritmi Rodica Ceterchi