4
Compresia Huffman 1. Conţinutul lucrării  În lucrare este prezentat unul dintre cei mai utiliza ți algoritmi de compresie. 2. Consideraţii teoretice  Compresia este procesul de minimizare a spaţiului ocupat sau a timpului necesar transmiterii unei anumite cantităţi de informaţie. Aprecierea cantitativă a compresiei realizate se face utilizând factorul de compresie definit ca:  F c =n u  /n c , unde n u  este lungimea în biţi a mesajului iniţial şi n c  lungimea după compresie. Determinarea codurilor Huffman pentru caracterele unui sir de intrare este una dintre aplicatiile  binecunoscute ale arborilor binari. Aceste coduri vor putea fi apoi folosite pentru codificarea sirului pe un numar de biti semnificativ mai mic decat cel 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). De exemplu, într-un fisier apar 6 caractere cu următoarele frecvenț e: a (45), b(13), c(12), d(16), e(9), f(5) Codurile Huffman pentru aceste caractere sunt: a= 0, b=101, c=100, d=111, e=1101, f=1100 Fiecare cod Huffman începe cu un prefix distinct, ceea ce permite recunoașterea lor la decompresie; de exemplu fisierul comprimat 001011101 va fi decodificat ca 0/0/101/1101 = aabe. Problema este de a stabili codul fiecărui caracter funcție de probabilitatea lui de apariție astfel încât numărul total de biți folosiți în codificarea unui șir de caractere să fie minim. Pentru generarea codurilor de lungime variabilă se folosește un arbore binar în care fiecare nod neterminal are exact doi succesori. Pentru exemplul dat ar  borele de codificare cu frecvențele de apariție în nodurile neterminale ș i cu literele codificate în nodurile terminale este : Se observă introducerea unor noduri intermediare notate cu cifre. Pentru codificare se parcurge arborele începând de la radacină și se adaugă câte un bit 0 pentru un succesor la stânga și câte un bit 1 pentru un succesor la dreapta. Algoritmul generează arborele de codificare începând de jos în sus, alegând arborii cu frecvențele cele mai scăzute și grupându-le într-un nou arbore având ca informație suma frecvențelor celor doi subarbori atașaț i. Algoritmul de compresie Huffman trebuie să respecte următorii paș i: 1) Se calculează frecvențele de apariț ie ale simbolurilor. 2) Se construiesc n arbori cu frecvențele obținute. 3) Se aleg arborii cu frecvențele cele mai scazute și se grupează într -un nou arbore având ca informație suma frecvențelor celor doi subarbori atașaț i. 4) Se aplică pasul 3 până  se ajunge la un singur arbore.

7.Compresia Huffman

Embed Size (px)

Citation preview

Page 1: 7.Compresia Huffman

8/12/2019 7.Compresia Huffman

http://slidepdf.com/reader/full/7compresia-huffman 1/4

Compresia Huffman

1. Conţinutul lucrării 

În lucrare este prezentat unul dintre cei mai utilizați algoritmi de compresie.

2. Consideraţii teoretice 

Compresia este procesul de minimizare a spaţiului ocupat sau a timpului necesar transmiterii uneianumite cantităţi de informaţie. 

Aprecierea cantitativă a compresiei realizate se face utilizând factorul de compresie  definit ca: F c=nu /ncunde nu este lungimea în biţi a mesajului iniţial şi nc lungimea după compresie.

Determinarea codurilor Huffman pentru caracterele unui sir de intrare este una dintre aplicatiile binecunoscute ale arborilor binari. Aceste coduri vor putea fi apoi folosite pentru codificarea sirului pe unnumar de biti semnificativ mai mic decat cel 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 bitimai mic decat in mod normal).

De exemplu, într-un fisier apar 6 caractere cu următoarele frecvențe:a (45), b(13), c(12), d(16), e(9), f(5)Codurile Huffman pentru aceste caractere sunt:a= 0, b=101, c=100, d=111, e=1101, f=1100Fiecare cod Huffman începe cu un prefix distinct, ceea ce permite recunoașterea lor la decompresie; de

exemplu fisierul comprimat 001011101 va fi decodificat ca 0/0/101/1101 = aabe.Problema este de a stabili codul fiecărui caracter funcție de probabilitatea lui de apariție astfel încât

numărul total de biți folosiți în codificarea unui șir de caractere să  fie minim. Pentru generarea codurilor delungime variabilă se folosește un arbore binar în care fiecare nod neterminal are exact doi succesori.

Pentru exemplul dat ar  borele de codificare cu frecvențele de apariție în nodurile neterminale și culiterele codificate în nodurile terminale este :

Se observă introducerea unor noduri intermediare notate cu cifre.

Pentru codificare se parcurge arborele începând de la radacină și se adaugă  câte un bit 0 pentru unsuccesor la stânga și câte un bit 1 pentru un succesor la dreapta.Algoritmul generează arborele de codificare începând de jos în sus, alegând arborii cu frecvențele cele ma

scăzute și grupându-le într-un nou arbore având ca informație suma frecvențelor celor doi subarbori atașați.

Algoritmul de compresie Huffman trebuie să respecte următorii pași:1) Se calculează frecvențele de apariție ale simbolurilor.2) Se construiesc n arbori cu frecvențele obținute.3) Se aleg arborii cu frecvențele cele mai scazute și se grupează într -un nou arbore având ca informație

suma frecvențelor celor doi subarbori atașați.4) Se aplică pasul 3 până se ajunge la un singur arbore.

Page 2: 7.Compresia Huffman

8/12/2019 7.Compresia Huffman

http://slidepdf.com/reader/full/7compresia-huffman 2/4

5) Din arborele Huffman, se completează dicționarul de coduri prin parcurgerea în adâncime a acestuia.6) Folosind dicționarul de coduri, se codează mesajul.

Pentru implementarea algoritmului de compresie veți folosi următoarea structură:

typedef struct nod

{int freq;bool free;

int st,dr,parinte;};

Funcțiile ajutătoare sunt: 

void initHuff(){

for(int i=0;i<255;i++){

huff[i].dr=-1;huff[i].st=-1;

huff[i].parinte=-1;huff[i].free=true;

}

}

void computeFreq(char *text){

int l=strlen(text);for(int i=0;i<l;i++){

huff[text[i]].freq++;}

}

int findSmaller(int n, int j)

{int smaller=INT_MAX;

int index=0;for(int i=0;i<n;i++)

if(huff[i].free)if(smaller>huff[i].freq&&i!=j){

smaller=huff[i].freq;index=i;

}return index;

}

void buildHuffmanTree(){

int n=128;while(n<255){

int i=findSmaller(n,-1);int j=findSmaller(n,i);huff[n].freq=huff[i].freq+huff[j].freq;huff[n].free=true; huff[n].st=i; huff[n].dr=j;huff[i].free=false; huff[j].free=false;

huff[i].parinte=n; huff[j].parinte=n;n++;

}}

Page 3: 7.Compresia Huffman

8/12/2019 7.Compresia Huffman

http://slidepdf.com/reader/full/7compresia-huffman 3/4

 void buildDictionary(){

int nod, parent;char cod[128];for(int i=0;i<128;i++){

nod=i;strcpy(codes[i],"");

while(nod!=254)

{parent=huff[nod].parinte;if(huff[parent].st==nod)

{

strcpy(cod,codes[i]); strcpy(codes[i],"0"); strcat(codes[i],cod);}

else {

strcpy(cod,codes[i]);strcpy(codes[i], "1"); strcat(codes[i],cod);}

nod=parent;}

}

}

void compressHuffman(char* text, char * buffer, int & d){

int l=strlen(text);d=0;char cod[128], byte=0, biti=0;

for(int i=0;i<l;i++){

char c=text[i];strcpy(cod,codes[c]);for(int j=0;j<strlen(cod);j++){

byte=2*byte+cod[j]-'0';biti++;if(biti==8){

buffer[d]=byte;d++;biti=0;byte=0;

}}

}buffer[d]=byte<<(8-biti);

d++;buffer[d]=biti;

d++;}

Pentru desfășurarea laboratorului, implementați algoritmul de decompresie Huffman respectândurmătorii pași:

1) Eventual se reconstruiește dictionarul Huffman pe baza frecvențelor de apariție ale simbolurilor.2) Se inițializează un cuvant de cod vid.3) Se adaugă cuvantului de cod următorul bit și se caută un simbol în dicționar corespunzător codului.4) Dacă nu se găsește în dicționar, se revine la pasul 3.5) Dacă se găsește, se afișează simbolul, înapoi la pasul 2.

Page 4: 7.Compresia Huffman

8/12/2019 7.Compresia Huffman

http://slidepdf.com/reader/full/7compresia-huffman 4/4

6) Se repetă pașii 2-5 până la finalul fluxului binar.

3. Mersul lucrării 3.1 Se citeşte de la tastatură o expresie matematică în formă postfixată, sub forma unui şir de caractere.  

Să se construiască arborele corespunzător acestei expresii, fiecare nod conţinând un operator sau un operand. 3.2 Să se tipărească expresia de la punctul 3.1. în formă postfixată şi infixată. 3.3 Să se evalueze expresia matematică de la punctul 3.1. 

3.4 Să se evalueze un arbore care conţine în noduri constantele 0 şi 1 şi operatorii AND, OR, NOT.