Sunteți pe pagina 1din 13

Universitatea Politehnica din București

Facultatea de Automatică și Calculatoare

CODIFICAREA HUFFMAN
Complemente de matematici

Profesor îndrumător Student

Prof. Dr. Ing. Cristina Serbanescu Vasiliu Victoria


Maftei Irina Mihaela

2021
BUCUREȘTI
Cuprins
1. Noțiuni teoretice ................................................................................................................................. 2
1.1. Noţiuni generale despre compresie ............................................................................................. 2
1.2. Clasificarea algoritmilor de compresie fără pierderi: ................................................................... 3
1.3. Algoritm Huffman static ............................................................................................................... 3
1.4. Algoritm Huffman dinamic ........................................................................................................... 4
2. Exemple ............................................................................................................................................... 5
2.1. Problemă frecvențe ...................................................................................................................... 5
2.2. Problemă probabilitate ................................................................................................................ 8
Concluzii: ............................................................................................................................................... 11
Bibliografie: ........................................................................................................................................... 12
1. Noțiuni teoretice
1.1. Noţiuni generale despre compresie
Compresia este procesul de minimizare a spaţiului ocupat sau a timpului necesar
transmiterii unei anumite cantităţi de informaţie.
Metodele de compresie pot fi împărţite în:
-metode de compresie cu pierdere;
-metode de compresie fără pierdere.
Metodele de compresie cu pierdere de informaţie sunt folosite în special în
transmisia semnalului audio şi video, unde pierderea de informaţie are ca rezultat o scădere a
calităţii sunetului, respectiv imaginii, ele neconstituind obiectul prezentei lucrări.
Conceptul de compresie de date fără pierdere pare imposibil la prima vedere, dar
o analiză mai atentă face ca această idee, de compresie fără pierdere, să aibă sens. Astfel, dacă
ne gândim la prescurtările din viaţa de zi cu zi (abrevieri: prof., etc., CEC, ş.a.) acestea apar ca
o formă primitivă a compresiei de date. Compresia de date fără pierdere, prezentă în programele
de arhivare, în sistemele de transmisiune a datelor, a evoluat de-a lungul timpului pornind de la
algoritmi simpli (suprimarea zerourilor, codarea pe şiruri) şi ajungând la algoritmii complecşi
folosiţi în prezent.
Avantajele compresiei sunt:
-reducerea spaţiului necesar depozitării unei cantităţi de informaţie;
-scăderea timpului de transmitere a unor mesaje, ceea ce duce la scăderea costului per
mesaj şi posibilitatea creşterii traficului într-o reţea de transmisiuni. Această scădere a timpului
este efectul direct al micşorării cantităţii de informaţie, dar şi efectul indirect al micşorării
pierderilor de timp datorate protocoalelor de comunicaţie.
- scăderea timpului de rulare a unui program datorită timpului de acces la disc.
Metodele de compresie fără pierderi au la bază ideea că, în general, cantitatea de
informaţie prelucrată (transmisă, depozitată) conţine o anumită redundanţă care se datorează:
-distribuţiei caracterelor (unele caractere au o frecvenţă de apariţie mult mai mare decât
altele);
-repetării consecutive a unor caractere;
-distribuţiei grupurilor de caractere (unele grupuri sunt mult mai frecvente decât altele
şi în plus există grupuri care nu apar deloc);
- distribuţiei poziţiei (unele caractere sau grupuri ocupă poziţii preferenţiale,
predictibile în anumite blocuri de date).
Având în vedere toate aceste tipuri de redundanţe putem înţelege de ce o anumită tehnică
de compresie poate da un rezultat bun pentru un anumit tip de surse, pentru altele însă rezultatul
poate fi dezastruos. De aici este uşor de înţeles că noile direcţii în studiul compresiei urmăresc
obţinerea unui algoritm care să ofere o compresie cât mai bună pentru tipuri de surse cât mai
diferite.
Aprecierea cantitativă a compresiei realizate se face utilizând factorul de compresie
𝑛𝑢
definit ca: 𝐹𝑐 = , unde 𝑛𝑢 este lungimea în biţi a mesajului iniţial şi 𝑛𝑐 lungimea după
𝑛𝑐
𝐻(𝑆)
compresie, precum şi prin eficienţa codării definită prin η = , unde H(S) reprezintă
𝑛̅∙𝑙𝑜𝑔2 𝑚

entropia sursei informaţionale ce este codată, m reprezintă numărul simbolurilor din alfabetul
de codare iar 𝑛̅ reprezintă lungimea medie a cuvintelor.

1.2. Clasificarea algoritmilor de compresie fără pierderi:


Algoritmii de compresie de date fără pierdere pot fi încadraţi în una din următoarele
categorii:
-Algoritmi statici, care se bazează pe o statistică bine cunoscută a sursei şi dau rezultate
bune în cazul în care sursele au o statistică asemănătoare cu cea presupusă. În caz contrar,
rezultatul poate fi o extensie în loc de o compresie.
-Algoritmi semiadaptivi sau în două treceri, algoritmi care folosesc statistica
simbolurilor mesajului, statistică ce se obţine printr-o parcurgere iniţială a întregului mesaj.
Aceşti algoritmi oferă rezultate pentru orice tip de sursă, dar nu pot fi folosiţi într-o
transmisiune.
-Algoritmi adaptivi, care sunt de obicei cei mai potriviti pentru orice tip de sursă.
Tehnicile adaptive au ca idee construirea unui "dicţionar de codare" al simbolurilor mesajului,
paralel cu codarea pentru compresie a mesajului. Acest dicţionar se va construi identic la
recepţie, pe baza informaţiei recepţionate.
1.3. Algoritm Huffman static
Algoritmul Huffman (1952) constituie un algoritm optimal, în sensul că nici un alt
algoritm nu asigură o mai mică lungime medie a cuvintelor. Sunt situaţii în care şi alţi
algoritmi pot da o lungime medie egală cu cea dată de algoritmul Huffman, dar niciodată mai
mică.
Pașii algoritmului sunt:
1. Ordonarea mesajelor sursei în ordinea descrescătoare a probabilităților.
2. Formarea din ultimele două mesaje a unui mesaj restrâns 𝑟1 = 𝑠𝑀−1 ∪ 𝑠𝑀 având
p(𝑟1) = p(𝑠𝑀−1 ) + p(𝑠𝑀 )
3. Includera mesajului 𝑟1 în mulțimea celorlalte mesaje, în ordinea descrescătoare a
probabilităților, alcătuind șirul ordonat 𝑅1 .
4. Repetarea algoritmului de restrângere până când ultimul șir ordonat 𝑅𝑘 conține doar
două mesaje.
5. Cuvintele de cod corespunzătoare fiecărui mesaj se obțin în felul următor:
✓ Simbolului 𝑟𝑘−1 i se alocă „0”, iar lui 𝑟𝑘 „1”;
✓ La fiecare diviziune în două se alocă, în aceeași ordine ca la prima diviziune,
simbolurile „0” sau „1” și operația se continuă până când se ajunge la mulțimi
formate dintr-un singur mesaj.

1.4. Algoritm Huffman dinamic


Se porneşte de la premiza că varianta statică a algoritmului de compresie Huffman este
bine înţeleasă.
Ideea de bază în codarea Huffman dinamică este folosirea pentru codarea simbolului
ti+1 din mesaj, a unui arbore de codare construit pe baza primelor i simboluri din mesaj. După
transmiterea simbolului 𝑡𝑖+1 se va revizui arborele de codare în vederea codării simbolului 𝑡𝑖+2 .
Există mai multe variante ale algoritmului Huffman dinamic (FGK, Δ) care diferă între ele prin
modul de construcţie al arborelui.
Procedura generală de compresie pentru codarea Huffman dinamică are următorul
alrgoritm:
1. Se inițializează arborele de codare cu un nod rădăcină;
2. Transmitem litera mai departe;
3. Se construiesc încă două noduri (frunze) care pornesc din nodul rădăcină, unul spre
stânga care nu conține niciun simbol, căruia i se atașează ponderea nulă (frunză
goală) și unul la dreapta care conține simbolul apărut, ponderea acestuia devenind
egală cu 1;
4. Se citește următoarea literă din mesaj;
5. Dacă litera este deja în arbore transmit codul ei din arbore. Codul literii din arbore
se formează citind simbolurile de “0” respectiv “1” ataşate ramurilor, pornind de la
nodul rădăcină până la nodul în care se află litera. Simbolurile de “0” respectiv “1”
se ataşează ramurilor astfel: toate ramurile din dreapta vor avea ataşate simbolul “1”,
iar toate ramurile din stânga vor avea ataşate simbolul “0”. Apoi se trece direct la
pasul 7;
6. Dacă litera nu este în arbore atunci transmitem codul nodului terminal care nu
conţine nici un simbol (frunză goală) urmat de codul în clar(ASCII) al literei. Codul
nodului fără nici o literă se formează ca şi în cazul nodului care conţine o literă;
7. Reactualizăm arborele; dacă mesajul s-a terminat, atunci codarea este terminată, iar
în caz contrar reluăm procedeul începând cu pasul 4.
2. Exemple
2.1. Problemă frecvențe
Algoritm static.
Prima etapă în construcția codului Huffman este calcularea numărului de apariții ale
fiecărui caracter în text. Există situații în care putem utiliza frecvențele standard de apariție a
caracterelor, calculate în funcție de limbă sau de specificul textului.

Fie C = {𝑐1 , 𝑐2 , 𝑐3 , … , 𝑐𝑛 } mulțimea caracterelor dintr-un text, iar 𝑓1 , 𝑓2 , … , 𝑓𝑛 ,


respectiv, numărul lor de apariții. Dacă 𝑙𝑖 ar fi lungimea șirului ce codifică simbolul 𝑐𝑖 , atunci
lungimea totală a reprezentării ar fi:

L = ∑𝑛𝑖=1 𝑙𝑖 ∙ 𝑓𝑖
Scopul nostru este de a construi un cod prefix care să minimizeze acastă expresie. . Î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. Pentru aceasta, se construiește un arboe binar complet
după cum urmează:

1. Inițial se consideră o partiție a mulțimii C = {{𝑐1 ,𝑓1 } , {𝑐2 , 𝑓2 } , … , {𝑐𝑛 , 𝑓𝑛 } }


reprezentată printr-o pădure de arbori formați dintr-un singur nod;
2. Pentru a obține arborele final se execută n-1 operații de unificare. Unificarea a doi
arbori 𝐴1 și 𝐴2 constă în obținerea unui arbore A, al cărui subarbore stâng este 𝐴1 , iar
subarbore drept este 𝐴2 , iar frecvența rădăcinii lui A este suma frecvențelor rădăcinilor
celor doi arbori. La fiecare pas unificăm 2 arbori ale căror rădăcini au frecvențele cele
mai mici.
De exemplu, arborele Huffman asociat structurii ”complemente de matematici.”, cu
caracterele {c,o,m,p,l,e,t,n,d,a,i,_,.}cu frecvențele {2,1,4,1,1,5,3,1,1,2,2,2,1} se construiește
pornind de la cele 13 noduri din figura următoare:
E|5 M|4 T|3 I|2 _|2 C|2 A|2 O|1 P|1 L|1 N|1 D|1 .|1

Pasul 1: Unificăm arborii care au frecvențele cele mai mici și anume {O,P}, {L,N}, {D,.}
adunând frecvențele acestora la rândul lor.

2 2 2

E|5 M|4 T|3 I|2 _|2 C|2 A|2 O|1 P|1 L|1 N|1 D|1 .|1

Pasul 2: Unificăm următorii arbori cu frecvențele cele mai mici corespunzători


caracterelor {_,C}, {A} și noul arbore obtinut la punctul anterior cu frecvența 2 , incluziv
ultimii doi arbori cu frecvențele 2; obținând astfel 3 noi noduri cu frecvențele 4.
4 4 4

E|5 M|4 T|3 I|2 _|2 C|2 A|2 2 2 2

O|1 P|1 L|1 N|1 D|1 .|1

Pasul 3: Unificăm următorii arbori cu frecvențele cele mai mici, și anume arborii
corespunzători caracterelor {T,I}, obținând un nou arbore cu frecvența 5. În continuare
unificăm ultimii arbori rămași corespunzători caracterelor {E,M} cu frecventele 5 respectiv 4.

E|5 M|4 5 4 4 4

T|3 I|2 _|2 C|2 A|2 2 2 2

O|1 P|1 L|1 N|1 D|1 .|1

Pasul 4: Unificăm arborii ce au frecvențele 4, obținând un nou arbore cu frecvența 8 și


arborii cu frecvența 5 respectiv 4 obținând un nou arbore cu frecvența 9, ca în figura de mai
jos.

9 9 8

E|5 M|4 5 4 4 4

T|3 I|2 _|2 C|2 A|2 2 2 2

O|1 P|1 L|1 N|1 D|1 .|1

Pasul 5: Unificăm ultimii arbori rămași ce au frecvențele 9 și 8 obținând un nou arbore cu


frecvența 17, pe care îl unificăm cu ulimul arbore rămas ce are frecvența 9, obținând astfel
arborele Huffman asociat acestui set de caractere cu frecvențele specificate inițial.
26

17

9 9 8

E|5 M|4 5 4 4 4

T|3 I|2 _|2 C|2 A|2 2 2 2

O|1 P|1 L|1 N|1 D|1 .|1

Nodurile terminale conțin un caracter și frecvența corespunzătoare acestuia; nodurile


interioare conțin suma frecvențelor caracterelor corespunzătoare nodurilor terminale din
subarbori.
Arborele Huffman obinut va permite asocierea unei codificări binare fiecărui caracter.
Caracterele fiind frunze în arborele obținut, se va asocia pentru fiecare deplasare la stânga pe
drumul de la rădăcină la nodul terminal corespunzător caracterului un 0, iar pentru fiecare
deplasare la dreapta un 1.
0 1
26

0 17 1

9 9 0
8 1
0
0
1
1

E|5 M|4 5 4 4 4 1
1
0
0 1 0 1 0

T|3 I|2 _|2 C|2 A|2 2 2 2


1 1 1
0 0 0

O|1 P|1 L|1 N|1 D|1 .|1

Obținem codurile:
Caracter Cod corespunzător
E 00
M 01
T 1000
I 1001
_ 1010
C 1011
A 1100
O 11010
P 11011
L 11100
N 11101
D 11110
. 11111

Observații
– Caracterele care apar cel mai frecvent sunt mai aproape de rădăcină și astfel lungimea
codificării va avea un număr mai mic de biți.
– La fiecare pas am selectat cele mai mici frecvențe, pentru a unifica arborii
corespunzători.

2.2. Problemă probabilitate


Algoritm dinamic.
Se considera codificarea Huffman a sirului de date:
‚Cursul este despre matematica’
Alfabetul A are A={A, C, D, E, I, L, M, P, R, S, T, U, “”}.
Sirul de date are lungimea totala de 29, iar pe baza frecventei fiecarui simbol in sir, putem
asocia fiecarui simbol probabilitatile de mai jos:

Caracter Probabilitate
L 1/29
D 1/29
P 1/29
I 1/29
M 2/29
C 2/29
U 2/29
R 2/29
E 5/29
S 3/29
T 3/29
A 3/29
„” 3/29
Conform formulei cantatii de informatie necesare reprezentarii unui simbol, in cazul nostru
un simbol se va reprezenta teoretic prin:

H = 4*1/29*log2(29) + 4*2/29*log2(29) + 4*3/29*log2(29) + 5/29*log2(29)=

= 4*1/29*4,86 + 4*2/29*4,86 + 4*3,29*4,86 + 5/29*4,86=

= 0,67 + 1,34 + 2,01 + 0,83 = 4,85 bit

Daca vom asocia fiecărui simbol un număr de biți (numerici), 𝐼1, … ,𝐼𝑛 atunci numărul
mediu real de biți al unui simbol va fi media ponderata a lungimilor acestora, cu ponderea egală
cu probabilitățile de apariție:

𝐼𝑚𝑒𝑑 = 𝐼1 ∙ 𝑝1 + ⋯ + 𝐼𝑛 ∙ 𝑝𝑛

Algoritmul Huffman incearcă să apropie valoarea 𝐼𝑚𝑒𝑑 cât mai mult de cea teoretică, H.
Ideea de la baza compresiei Huffman este de a asocia simbolurilor cu ponderea cea mai mare
(adica care apar cel mai frecvent in text), coduri de lungime cât mai mică, și viceversa pentru
simbolurile cu apariție foarte rară, și în același timp codurile să poată fi ușor delimitate într-un
șir continuu de simboluri. Acest lucru este realizat într-un mod foarte ingenios plasând fiecare
simbol într-un mod convenabil ales în frunzele unui arbore binar, iar codificarea simbolurilor
să fie de fapt calea parcursă prin arbore, de la rădacină spre fiecare simbol. Algoritmul Huffman
reprezintă algoritmul de construcție al acestui arbore, pornind de la o mulțime de simboluri A,
fiecare având asociat probabilitatea 𝜋.

Codificare:
Arborele Huffman:

Pe baza arborelui general, fiecare simbol va avea propria lui codificare:


Caracter Cod corespunzător
L 00000
D 00001
P 00010
I 00011
M 0010
C 0011
U 0100
R 0101
E 011
S 100
T 101
A 110
„” 111
Astfel sirul „Cursul este despre matematica” este codificat dupa cum urmeaza:
0011 0100 0101 100 0100 00000 111 011 100 101 011 111 00001 011 100 00010 0101
011 111 0010 110 101 011 0010 110 101 00011 0011 110.
De aici rezulta ca numarul total de biti este 114. Teoria prezice un numar minim de biti:
H*lungime= 4.85*29= 140,88, de unde putem afirma ca algoritmul Huffman a comprimat
bine datele.
Daca am fi reprezentat sirul de caractere ca un vector de coduri ASCII (8 biti), ar fi fost
necesar un numar de 8*29 = 232 de biti pentru reprezentare, ceea ce este mult mai mult fata de
cat am obtinut folosind algoritmul Huffman.

Concluzii:
Compresiile binare sunt folosite adesea atunci cand utilizăm calculatorul pentru
necesitățile zilnice. A comprima un mesaj înseamnă a păstra numai acei parametri care sunt
esențiali pentru destinatar. Ceilalti parametri nu se transmit, respectiv nu se stochează.
De exemplu:
-pe instagram sunt folosite atunci cand sunt încărcate poze cu o calitate ridicată iar ei o
modifică folosind codificarea pentru a mai tăia din memoria ocupată de poză.
-atunci când arhivăm documente de tip .zip pentru a le transfera, acestea sunt codificate
pentru a micșora dimensiunea, pentru a fi posibilă transmiterea acestora.
-când se încarcă un filmuleț pe youtube și se încarcă la o calitate mai proastă acest lucru se
datorează compresiei.
Toate aplicațiile de genul acesta folosesc codificarea pentru a comprima informațiile, ca să
își conserve spațiile de memorie.
Bibliografie:
[1]Curs: Compresia Imaginilor Binare (#349651) - Graduo
[2]Microsoft Word - Huffman.doc (edu.ro)
[3]Codificare Huffman folosind arbori binari [CS Open CourseWare] (pub.ro)
[4]Curs “Complemente de matematici”

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