Sunteți pe pagina 1din 5

Introducere

Codarea adaptiva Huffman (cunoscuta si sub denumirea de codare dinamica Huffman) este o tehnica adaptiva de codare, ce construieste codul pe masura ce simbolurile sunt transmise, fara o initiala cunoastere a sursei de distributie, ce permite o codare uni-nivel si o adaptare la modificarile survenite in continutul datelor. Avantajul unei metode uni-nivel consta in faptul ca sursa poate fi codata in timp real, in ciuda faptului ca devine sensibila la erori, deoarece chiar si o singura pierdere de informatie poate strica intregul cod.

Algoritmi
Exista o serie de implementari pentru aceasta metoda, dintre care cele mai semnificative sunt algoritmul FGK (FallerGallager-Knuth) si algoritmul Vitter. In cele ce urmeaza, vom prezenta pe scurt algoritmul Vitter. Algoritmul Vitter In cadrul acestui algoritm, codul este reprezentat ca o structura tip arbore, in care fiecarui nod ii corespund o probabilitate si un o valoare unica. Acestea sunt reprezentate vertical, de la dreapta la stanga. Probabilitatile trebuie sa satisfaca proprietatea de corespondenta, insemnand ca nodurile pot fi listate in ordinea descrescatoare a probabilitatilor, fiecare nod fiind adiacent corespondentului sau. Asadar, daca A este nodul parinte al nodului B si nodul C e nod copil al nodului C, atunci P(A) > P(B) > P(C). Un set de noduri cu aceleasi probabilitati desemneaza un bloc. Pentru a determina codul pentru fiecare bloc, in cazul unui arbore binar, putem parcurge intreg drumul de la radacina pana in nodul respectiv, notand spre exemplu cu 1 deplasarea spre dreapta si cu "0" deplasarea catre stanga.

Exemplu
Acest exemplu pune in evidenta cateva aspecte importante pentru algoritmul de generare si manevrare a codurilor in faza de compresie.

Obs.:

ori de cate ori simbolul citit nu se regaseste printre frunzle arborelui binar, sunt emise doua coduri succesive: primul este cel al simbolului de evitare ESC (cod preluat din arborele Huffman inainte de reactualizare), iar al doilea este codul original pe 8 biti (nemodificat) al simbolului.

odata cu mutarea unui nod in alta pozitie (in cursul reactualizarii arborelui), este posibil ca unul sau mai multi arbori descendenti sa fie, la randul lor, mutati in alte pozitii. Aceasta necesita schimarea codurilor frunzelor lor. Mutarea unui arbore descendent da nastere la doua probleme:

gasirea si marcarea tuturor frunzelor sale inaintea mutarii; reactualizarea codurilor frunzelor marcate; Reactualizarea codurilor frunzelor consta in reactualizarea partii mai semnificative a vechiului cod, caci partea mai putin semnificativa nu este afectata de mutare.

Se considera setul de date format din 4 simboli, primii 3 fiind diferiti: ADIA. Evolutia arborelui Huffman este redata in figurile de mai jos.

Figura 1 - Arborele iniial

Se citeste simbolul A si se emit doua coduri (9 biti): ESC si A = 1 01000001. Figura 2 - Arborele reactualizat

Se citeste simbolul D si se emit doua coduri (10 biti): ESC si D = 01 01000100.

Figura 3 - Arborele reactualizat

Se citeste simbolul I si se emit doua coduri (10 biti): ESC si I = 11 01001001. Figura 4 - Arborele reactualizat

Se citeste simbolul A si se emite codul (2 biti): A = 11.

Figura 5 - Arborele final

Descrierea adaptiva a simbolurilor in faza de decompresie


Spre deosebire de constructia adaptiva a unui cod, decriptarea sa adaptiva este o operatie mult mai simpla, ea presupunand doar o parcurgere descendenta a arborelui. Algoritmul de decompresie adaptiva

se citeste fluxul de intrare la nivel de bit (an mod normal se citeste cate un octet, in cadrul caruia se analizeaza fiecare bit). In paralel, se construieste si se reactualizeaza arborele Huffman intocmai ca in faza de compresie. Initial, arborele este alcatuit doar din simbolii virtuali EOS si ESC. Primul simbol decriptat va fi EOS (cod 0), daca fluxul de intrare este vid, sau ESC (cod 1), in caz contrar. Simbolul ESC va fi urmat de codul original (pe 8 biti) al primului simbol valid din setul de date.

se decripteaza simbolul curent de pe fluxul de intrare, prin parcurgerea arborelul Huffman existent, incepand de la radacina. Parcurgerea arborelui este ghidata de succesiunea bitilor fluxului de intrare. o daca simbolul decriptat este ESC, atunci se citeste urmatorul octet de pe fluxul de intrare. Acesta va fi codul original al simbolului curent. o daca simbolul decriptat este diferit de ESC, atunci simbolul a mai aparut pe fluxul de intrare, frunza ocupata de el in arborele Huffman oferind codul original (pe 8 biti) al acestuia. In ambele situatii descrise mai sus, codul original al simbolului trebuie inscris pe fluxul de iesire. Daca ultimul simbol decriptat este EOS, algoritmul se incheie. In caz contrar, se trece la pasul urmator.

se reactualizeaza arborele Huffman (conform algoritmului de reactualizare prezentat). Algoritmul se reia de la pasul 2.

Exemplu - ADIA Acest sir de caractere este reprezentat pe cel putin 41 de biti (32 de biti ai caracterelor, plus cel putin 9 biti care indica sfarsitul mesajului). Fluxul de intrare in procedura de decompresie este constituit din urmatoarele coduri (33 de biti):

01000001 01 01000100 11 01001001 11 11

se citeste bitul 1 si se decripteaza simbolul ESC, folosind arborele Huffman initial. Codul sau original nu este emis, insa, pe fluxul de iesire. Operatia care se executa in continuare este citirea urmatorului octet de pe fluxul de intrare (litera A), care sta inscris nemodificat pe fluxul de iesire. se reactualizeaza arborele Huffman si se reseteaza parcurgerea sa din radacina. se citesc bitii 01 si se constata ca simbolul decriptat este tot ESC, folosind arborele Huffman reactualizat. In consecinta, urmatorul octet al fluxului de intrare (litera D) este inscris nemodificat pe fluxul de iesire. urmeaza o noua reactualizare a arborelui. urmatorii 2 biti cititi - 11 - conduc tot la simbolul de evitare ESC, motiv pentru care urmatorul octet citit (litera I) este si el descarcat direct pe fluxul de iesire. se reactualizeaza arborele, care va avea acum 5 frunze. se reia citirea fluxului de intrare. Dupa codul 11, se constata ca, folosind arborele Huffman curent, se ajunge la nodul frunza ocupat de litera A. Codul original al acestuia (01000001) este preluat din informatia de nod a arborelui si descarcat pe fluxul de iesire. o noua reactualizare a arborelui binar nu aduce noi frunze acestuia, ci o organizare diferita. utimii 2 biti cititi 11 conduc la decriptarea simbolului EOS, care arata ca decompresia a luat sfarsit si provoaca inchiderea fluxului de iesire.

Din acest exemplu se observa ca un acelasi cod (11) poate avea semnificatii total diferite la momente de timp diferite (ESC, A si EOS). Cu toate acestea, decriptarea este exacta, deoarece structura arborelui Huffman este precisa, unic determinata de fiecare simbol decriptat si identica cu cea din faza de compresie. Concluzie - metoda adaptiva realizeaza o rata de compresie strict pozitiva, pentru ca se emit doar 33 de biti in loc de 41 de biti (sau, in loc de 32 de biti se emit 31 de btti, inlaturand informatia de sfarsit de flux).

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