Sunteți pe pagina 1din 12

Coduri Huffman

Codarea se folosete pentru a mri eficiena transmisiei, prin


reducerea redundanei, adic micorarea numrului de simboluri n
fiecare cuvnt de cod. Se ofer o protecie la perturbaii mai bun, prin
introducerea unei redundane (se completeaz cuvntul de cod cu noi
litere n scopul detectrii i corectrii de erori).
Tipuri de coduri:
Compacte
Shanon-Fano
Huffman
Grup
Ciclice
Convoluionare
n informatic i teoria informaiei , codurile Huffman reprezinta un
algoritm optimal, in sensul ca ele reprezint o tehnic foarte eficient de
compactare a datelor,spaiul economisit fiind cuprins adesea ntre 20% i
90%.Sunt situaii n care i ali algoritmi pot da o lungime medie egal cu
cea dat de algoritmul Huffman, dar niciodat mai mic. Acestea au fost
dezvoltate de David A. Huffman (student la Massachusetts Institute of
Technology) , i publicate n 1952 in lucrarea " A Method for the
Construction of Minimum-Redundancy Codes ". n aplicaii de compresie a
textului, algoritmul Huffman poate fi utilizat pentru codarea unui ir de
caractere pentru care poate fi determinat frecvena relativ de apariie a
fiecrui caracter. Deoarece fiecare caracter este codat printr-un cuvnt de
cod avnd un numr variabil de bii, procesul de decodare a irului de bii
recepionat se va face pe o baz orientat pe bit i nu pe baza unor

lungimi fixe de 7/8 bii.Datorit modului n care se face alocarea biilor n


timpul procedurii de codare, algoritmul Huffman are proprietatea c nici
un cuvnt de cod scurt nu este prefixul unui cuvnt de cod mai lung. Prin
urmare codul obinut este

instantaneu decodabil, printr-o procedur

recursiv de verificare bit cu bit pn n momentul n care se gsete un


cuvnt

de

cod

corespunztoare

valid.

In

Figura

algoritmului

de

este

decodare.

prezentat
Algoritmul

organigrama
presupune

disponibilitatea la recepie a unui tabel al cuvintelor de cod, precum i al


caracterelor ASCII corespunztoare. irul de bii recepionat este memorat
n bufferul IR RECEPIONAT, iar biii citii i utilizai pentru construirea
cuvintelor de cod se memoreaz n bufferul CUVNT DE COD. Din
organigram rezult faptul c pe msur ce este identificat un cuvnt de
cod viabil, caracterul ASCII corespunztor este ncrcat n BUFFER
RECEPIE. Procedura se repeat pn n momentul n care au fost procesai
toi biii recepionai.

Paii algoritmului sunt:


1. Ordonarea listei simbolurilor sursei n ordinea descresctoare a
probabilitilor.
2. Formarea din ultimele dou mesaje a unui mesaj restrns
SM

avand p(

r1

)=p(

3. Includerea mesajului

S M 1
r1

)+p(

SM

r 1=S M1

n mulimea celorlalte mesaje, n ordinea

descresctoare a probabilitilor, alctuind irul ordonat R1.

4. Repetarea algoritmului de restrngere pn cnd ultimul ir ordonat


Rk

conine doar dou mesaje.

5. Cuvintele de cod corespunztoare fiecrui mesaj se obin n felul


urmtor:
- simbolului

r k1

i se aloca '0', iar lui

rk

'1'

- la fiecare diviziune n dou se aloc, n aceeai ordine ca la prima


diviziune, simbolurile '0' sau '1' i operaia se continu pn cnd se
ajunge la mulimi formate dintr-un singur mesaj.
Deoarece cuvintele de cod Huffman obinute se modific n funcie de
setul de caractere transmise, este necesar cunoaterea de ctre
receptor a cuvintelor de cod corespunztoare datelor transmise. Aceast
cunoatere poate fi asigurat prin dou metode. Prima metod const n
transmiterea cuvintelor de cod corespunztoare urmtorului set date
nainte de transmiterea efectiv a datelor. A doua metod const n
cunoaterea prealabil de ctre receptor a cuvintelor de cod care
urmeaz a fi utilizate.Prima metod conduce la o form de compresie
adaptiv, deoarece cuvintele de cod pot fi modificate n scopul de a fi
potrivite tipului de date care urmeaz a fi transmise. Dezavantajul
metodei const n faptul c noul set de cuvinte de cod (mpreun cu
caracterele corespunztoare) trebuie transmise de fiecare dat cnd un
nou tip de date urmeaz a fi transmise. O alternativ a acestei metode
este aceea de a memora la nivelul receptorului mai multe seturi de
cuvinte de cod, astfel nct de la emitor s fie necesar doar indicarea
setului de cuvinte de cod care urmeaz a fi utilizate cu urmtorul set de
date transmise.De exemplu, n cazul des ntlnit al transmisiei de fiiere
de text generate de un procesor de text, pot fi utilizate analize statistice
privind frecvena de apariie a diferitelor caractere din alfabet. Aceast

informaie poate fi utilizat pentru construirea cuvintelor de cod Huffman


pentru alfabetul respectiv, care vor fi utilizate n mod automat de ctre
emitor i receptor.
O

limitare

performanelor

codorului

Huffman

pentru

simboluri

independente, fa de calculele teoretice, este aceea c lungimea medie


a cuvintelor de cod Lmed 1, independent de valoarea entropiei. Se
poate arta c optimalitatea teoretic se atinge ntotdeauna dac
probabilitile de apariie a simbolurilor sunt de forma 2-m, unde m este
un numr natural i dac, n plus, entropia este mai mare dect 1. Pentru
asemenea aplicaii, unde viteza este un factor important i numrul de
simboluri este mare, se folosesc alte coduri de lungime variabil, care au
performane apropiate de cele ale codorului Huffman, dar conduc la
coduri cu lungime maxim mai mic.
Codificarea Huffman este o varianta foarte populara de codificare cu
lungime variabila. Ea presupune ca datele sunt reprezentate, in general,
ca un sir de simboluri (octeti, cifre, litere, de exemplu), unde fiecare
simbol ai din multimea tuturor simbolurilor posibile (alfabetul A = {a1, a2,
,

an}

),

are

asociata

anumita

probabilitate

de

aparitie

pi.

Probabilitatile se pot determina fie estimativ (de exemplu pe baza tipului


sirului de date: text, imagine, cod executabil), fie inspectand sirul de la
cap la coada si numarand aparitiile fiecarui simbol, apoi impartind fiecare
contor la numarul total de simboluri.
Exemplu:

ana are mere

Alfabetul A este A = {'a', 'n', ' ', 'r', 'e', 'm'}. Sirul de date are
lungimea totala 12, iar pe baza frecventei fiecarui simbol in sir, putem
asocia fiecarui
Simbol
a
n

r
e
m

simbol probabilitatile din tabel:


Probabilitate
1/4
1/12
1/6
1/6
1/4
1/12

Conform formulei cantatii de informatie necesare reprezentarii unui


simbol, in cazul nostru un simbol se va reprezenta teoretic prin
H = 1/4*log2(4) + 1/12*log2(12) + 1/6*log2(6) + 1/6*log2(6) +
1/4*log2(4) + 1/12*log2(12) = 2.45 biti
Daca vom asocia fiecarui simbol un numar de biti (numerici), I1, , In,
atunci numarul mediu
real de biti al unui simbol va fi media ponderata a lungimilor acestora, cu
ponderea egala cu
probabilitatile de aparitie:
Imed = I1 * p1 + + In * pn
Algoritmul Huffman incearca sa apropie valoarea Imed cat mai mult
de cea teoretica, 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 cat mai mica, si viceversa pentru simbolurile
cu aparitie foarte rara, si in acelasi timp codurile sa poata fi usor
delimitate intr-un sir continuu de simboluri (a se vedea problematica de la
codificarile cu lungime variabila).
Acest lucru este realizat intr-un mod foarte ingenios plasand fiecare
simbol intr-un mod convenabil ales in frunzele unui arbore binar, iar
codificarea simbolurilor sa fie de fapt calea parcursa prin arbore, de la
radacina spre fiecare simbol. Algoritmul Huffman reprezinta algoritmul de

constructie al acestui arbore, pornind de la o multime de simboluri A,


fiecare avand asociat probabilitatea pi

Algoritmul Huffman de construire a arborelui binar


de simboluri
Arborele binar de simboluri contine in fiecare frunza un simbol, alaturi
de probabilitatea sa de aparitie. Fiecare nod intern al arborelui va contine
doar un numar, si anume suma probabilitatilor simbolurilor descendente.
Astfel radacina arborelui va

contine probabilitatea 1, intrucat toate

simbolurile din alfabet ii sunt descendente. Parcurcand arborele de la


radacina catre o frunza, se poate genera codul asociat simbolului din frunza
respectiva: la fiecare pas al parcurgerii, pentru o alegere a nodului stang se
adauga un '0', iar pentru o alegere a nodului drept, se adauga un '1'.
Mai jos este prezentat algoritmul Huffman de constructie a arborelui de
simboluri:
1. Construieste cate un nod frunza pentru fiecare simbol si probabilitate
asociata.
2. Adauga nodurile frunza intr-o coada, sortandu-le in ordinea crescatoare
a probabilitatilor, de la cele mai rare simboluri la cele mai frecvente.
3. Atata timp cat coada contine mai mult de un nod, executa:
3.1
Extrage primele 2, cele mai infrecvente noduri, si creeaza un alt
nod, cu probabilitatea egala cu suma probabilitatilor celor doua noduri.
3.2
Adauga cele 2 noduri extrase ca descendenti stang, respectiv
drept, la noul nod creat.
3.3
Insereaza nodul creat inapoi in coada, pastrand ordinea de
sortare in functie de probabilitatile nodurilor

Figura de mai jos prezinta procesul de constructie al arborelui Huffman


pentru exemplul considerat:

Pe baza arborelui Huffman generat, fiecare simbol va avea urmatoarea


codificare:
Astfel, sirul ana are mere va fi codificat astfel:
01 1100 01 111 01 00 10 111 1101 10 00 10

iar numarul total de biti este 30. Intrucat teoria prezicea un numar de biti
minim de H*lungime = 2.45 * 12 = 29.4 biti, putem afirma cu incredere ca
algoritmul Huffman a comprimat bine datele.
Simbol

Codificare

01

1100

111

00

10

1101

Daca am fi folosit un cod cu lungime fixa (in cazul nostru lungimea fixa
minima ar fi fost de 3 biti), numarul total de biti necesari pentru sirul nostru
ar fi fost 3*12 = 36 de biti, semnificativ mai mare decat rezultatul obtinut.
Mai mult decat atat, daca am fi reprezentat sirul de caractere ca un vector
de coduri ASCII (8 biti), ar fi fost necesar un numar de 8*12 = 96 de biti
pentru reprezentare!
Astfel, pentru a decomprima un fisier arhivat folosind compresia
Huffman, avem nevoie de arborele Huffman (codificat cumva la inceputul
arhivei), si de sirul de biti de procesat. Observati ca putem parcurge sirul si
sa identificam fiecare simbol in parte: ne pozitionam in radacina arborelui, si
pentru fiecare 0 sau 1 citit, avansam in descendentul stang, respectiv drept,
pana cand ajungem la o frunza. Atunci stim ca am parcurs un cod intreg, si
simbolul codat este continut in fruza respectiva. Apoi ne resetam pozitia pe
nodul radacina, pentru a citi urmatorul simbol, si asa mai departe.
Aparent s-ar putea spune ca bitii castigati la compresie sunt cheltuiti
pentru reprezentarea arborelui Huffman din arhiva. Acest lucru este adevarat

pentru fisiere mici, unde compresia nu este asa de eficienta. Insa odata cu
cresterea dimensiunii fisierului, arborele de simboluri ramane practic
constant, insa datele sunt micsorate semnificativ.

Aplicaii

Codificare aritmetic poate fi privita ca o generalizare de coduri


Huffman, n sensul c acestea produc aceeai ieire atunci cnd fiecare
k
simbol are o probabilitate de forma 1/ 2 , tinzand s ofere n mod

semnificativ o compresie de dimensiuni mici ale alfabetului cat mai buna. Cu


toate acestea,codificare Huffman este

utilizarea pe scar larg datorit

simplitii sale i pentru viteza mare. Intuitiv, codificare aritmetic poate


oferi o compresie mai bun dect codificare Huffman, deoarece "cuvintele
sale cod" pot avea efectiv lungimi non-ntregi de bii, n timp ce cuvintele cod
din codificare Huffman poate avea doar un numr ntreg de bii. Prin urmare,
exist o ineficien n codificarea Huffman n care un cuvnt cod de lungime
k se potrivete numai optim unui simbol optim de probabilitate 1/2 k i alte
probabiliti nu sunt reprezentate ca optim i ntruct lungimea de codificare
n codificare aritmetic poate fi fcut cat mai aproape de adevar

de

probabilitatea simbolului.
Codificarea Huffman de astzi este adesea folosit ca un "back-end"
pentru alte metode de compresie. DEFLATE( PKZIP algoritm ) i codec-uri
multimedia, cum ar fi JPEG i MP3 au un model de front-end i de cuantificare
, urmat de codare Huffman (sau variabil lungime coduri-prefix liber, cu o
structur similar, dei poate nu neaprat proiectate folosind algoritmul
Huffman lui

Coduri Huffman

Chivulescu Adrian Gabriel


Grupa:8216