Sunteți pe pagina 1din 5

CODAREA HUFFMAN

In Teoria Transmisiei Informatiei, codarea Huffman este un algortim de codare entropic,


folosit pentru compresia datelor fara pierderi. Termenul se refera la folosirea unei tabela de
cod de lungime variabila pentru codarea unui simbol sursa (cum ar fi un caracter intr-un
fisier) unde tabela de cod cu lungime variabili a fost derivata intr-un mod particular bazat pe
probabilitatea de aparitie a fiecarui simbol posibil al sursei.
Acest cod a fost dezvoltat de catre David A. Huffman in timp ce isi facea studiul de
doctorat la MIT, si publicat in 1952 in lucrarea A Method for the Construction of MinimumRedundancy Codes (O metoda de constructie a codurilor de redundanta minima). Huffman
a devenit membru al facultatii MIT dupa absolvire.
Codarea Huffman foloseste o metoda specifica de a alege reprezentarea fiecarui simbol,
rezultand un cod cu proprietatea ca fiecare succesiune de biti ce reprezinta un simbol
particular, nu este niciodata un prefix al altui simbol. Acest cod are de asemenea
proprietatea ca asigneaza simbolurilor cu probabilitatea de aparitie cea mai mare,
succesiunea cea mai scurta de biti.
Huffman a putut astfel sa dezvolte cea mai eficienta metoda de compresie de acest tip.
Nici o alta metoda de asignare a unei secvente de biti unor simboluri ale unei surse, nu
poate produce o marime medie mai mica a sirului de iesire, atunci cand frecventa de
aparitie a simbolurilor este aceea folosita in creearea codului. In schimb, a fost mai tarziu
gasita o metoda ce poate face asta in timp liniar, daca probabilitatile de intrare sunt sortate.
Desi codarea Huffman este optima pentru o codare simbol cu simbol cu distributia
probabilitatilor cunoscute. De exemplu codarea aritmetica si LZW de multe ori au capacitati
de compresie mai bune. Ambele metodele pot combina un numar arbitrar de simboluri
pentru o codare mai eficienta, si in general sa se adapteze statisticilor de intrare. Acestea
sunt utile in mod deosebit, atunci cand probabilitatile de intrare nu sunt cunoscute precis.

Una dintre aplicatiile binecunoscute ale arborilor binari optimi o constituie


determinarea codurilor Huffman pentru caracterele unui sir de intrare
Aceste coduri vor putea fi apoi folosite pentru codificarea sirului pe un numar de biti
semnificativ mai mic decat initial
Daca pe post de sir de caractere este folosit un fisier, codurile Huffman pot ajuta la
compresia fisierului respectiv (reprezentarea continutului sau pe un numar de biti mai
mic decat in mod normal)
Vom studia mersul algoritmului pe un exemplu
Fie sirul de intrare: MARE E MAREA MARMARA
Se parcurge sirul si se contorizeaza numarul de aparitii ale fiecarui caracter distinct
Astfel:
M apare de 4 ori
A apare de 6 ori
R apare de 4 ori
E apare de 3 ori
<blank> (spatiul) apare de 3 ori (pentru o mai mare claritate vom reprezenta
caracterul spatiu prin simbolul _)

Cunoscand ca lungimea sirului este de 20 de caractere, putem calcula foarte usor


frecventele (probabilitatile) de aparitie ale fiecarui caracter
Astfel:
M 4/20
A 6/20
R 4/20
E 3/20
_ 3/20
Evident: 4/20 + 6/20 + 4/20 + 3/20 + 3/20 = 20/20
Pentru fiecare caracter distinct vom construi un arbore binar optim avand un singur
nod
Asociem fiecarui nod frecventa de aparitie a 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)
Daca sunt mai mult de 2 arbori in aceasta situatie, se vor alege arbitrar 2 dintre ei
In cazul nostru, vom alege ultimii 2 arbori, ei avand frecventele de aparitie minime
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)
Frecventa de aparitie a noului arbore va fi data de suma frecventelor de aparitie a
celor 2 subarbori componenti
Deoarece am inlocuit 2 arbori printr-unul singur, numarul total de arbori a scazut cu o
unitate

Din cei 4 arbori ramasi, alegem 2 care au frecventele de aparitie minime


Acestia vor fi primul si al treilea si vor fi inlocuiti printr-un nou arbore avand frecventa
8/20

Din cei 3 arbori ramasi, alegem 2 care au frecventele de aparitie minime


Acestia vor fi ultimii 2 si vor fi inlocuiti printr-un nou arbore avand frecventa 12/20

Nu mai avem de ales, fiind doar 2 arbori


Acestia vor fi inlocuiti printr-un nou arbore avand frecventa 20/20

6/20

Am ajuns la un singur arbore, moment in care ne oprim

Vom eticheta fiecare ramura spre stanga cu 0 si fiecare ramura spre dreapta cu 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:

M codul 00; A codul 10; R codul 01;

E codul 110; _ codul 111

In mod normal, un caracter din sir (sau din fisier, daca folosim un fisier) se codifica pe 8 biti

In cazul de fata, tinand cont ca sunt numai 5 caractere in total, am putea implementa foarte usor o
codificare binara de 3 biti/caracter (2 biti ar asigura doar 4 caractere distincte, dar noi avem 5)

Se observa ca codurile Huffman obtinute in urma algoritmului prezentat sunt mai scurte decat
codurile standard de 3 biti/caracter

Mai precis, fiecare aparitie a caracterelor M, A sau R in sirul initial va duce la o economie de 1 bit
iar fiecare aparitie a caracterelor E sau _ nu va cauza nici pierdere nici castig (se folosesc tot 3
biti)

Nu intamplator, caracterele M, A si R sunt caracterele care aveau frecventele de aparitie cele


mai mari, astfel incat economiile de care aminteam se vor manifesta foarte des

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

Vom codifica sirul MARE E MAREA MARMARA folosind codurile obtinute

Rezultatul este: 00 10 01 110 111 110 111 00 10 01 110 10 111 00 10 01 00 10 01 10

Sunt necesari 46 de biti

Codificarea cu 3 biti/caracter ar fi dus la 320 = 60 de biti, deci am realizat o compresie de 76,6%

Codificarea implicita cu 8 biti/caracter ar fi dus la 820 = 160 de biti deci am realizat o compresie de
28,75% fata de aceasta codificare

Codurile Huffman obtinute au proprietatea de prefix

Proprietatea de prefix suna astfel: nici un cod nu este prefix pentru alt cod

Aceasta proprietate este asigurata implicit din modul de constructie al arborelui Huffman

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)

Daca codurile Huffman nu ar fi avut proprietatea de prefix, am fi avut mari probleme la decodificarea
unui sir

Sa presupunem, prin absurd, ca am fi obtinut:

cod(A) = 11 si cod(E) = 111

Atunci sirul initial AE ar fi fost codificat 11111 dar de decodificat poate fi decodificat fie
ca AE fie ca EA

Proprietatea de prefix (pe care am incalcat-o aici) nu ar fi dus la astfel de ambiguitati

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