16
Calin Jebelean Coduri Huffman 1 Coduri Huffman 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)

Coduri Huffman

  • Upload
    cael

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

Coduri Huffman. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Coduri Huffman

Calin Jebelean Coduri Huffman 1

Coduri Huffman

Una dintre aplicatiile binecunoscute ale arborilor binari optimi o constituie determinarea codurilor Huffman pentru caracterele unui sir de intrareAceste coduri vor putea fi apoi folosite pentru codificarea sirului pe un numar de biti semnificativ mai mic decat initialDaca 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)

Page 2: Coduri Huffman

Calin Jebelean Coduri Huffman 2

Coduri Huffman

Vom studia mersul algoritmului pe un exempluFie sirul de intrare: “MARE E MAREA MARMARA”Se parcurge sirul si se contorizeaza numarul de aparitii ale fiecarui caracter distinctAstfel:

‘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 ‘_’)

Page 3: Coduri Huffman

Calin Jebelean Coduri Huffman 3

Coduri Huffman

Cunoscand ca lungimea sirului este de 20 de caractere, putem calcula foarte usor frecventele (probabilitatile) de aparitie ale fiecarui caracterAstfel:

‘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

Page 4: Coduri Huffman

Calin Jebelean Coduri Huffman 4

Coduri Huffman

Pentru fiecare caracter distinct vom construi un arbore binar optim avand un singur nod

Asociem fiecarui nod frecventa de aparitie a cheii nodului respectivIdeea este de a reduce la fiecare pas numarul de arbori binari optimi prin combinare, pana cand se ajunge la un singur arbore binar optim

M A R E _

4/20 6/20 4/20 3/20 3/20

Page 5: Coduri Huffman

Calin Jebelean Coduri Huffman 5

Coduri Huffman

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 eiIn cazul nostru, vom alege ultimii 2 arbori, ei avand frecventele de aparitie minimeSe 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 componentiDeoarece am inlocuit 2 arbori printr-unul singur, numarul total de arbori a scazut cu o unitate

Page 6: Coduri Huffman

Calin Jebelean Coduri Huffman 6

Coduri Huffman

Din cei 4 arbori ramasi, alegem 2 care au frecventele de aparitie minimeAcestia vor fi primul si al treilea si vor fi inlocuiti printr-un nou arbore avand frecventa 8/20

M A R

E _

4/20 6/20 4/20

*6/20

3/20 3/20

Page 7: Coduri Huffman

Calin Jebelean Coduri Huffman 7

Coduri Huffman

Din cei 3 arbori ramasi, alegem 2 care au frecventele de aparitie minimeAcestia vor fi ultimii 2 si vor fi inlocuiti printr-un nou arbore avand frecventa 12/20

A

E _

6/20

*6/20

M R

*8/20

4/20 4/20 3/20 3/20

Page 8: Coduri Huffman

Calin Jebelean Coduri Huffman 8

Coduri Huffman

Nu mai avem de ales, fiind doar 2 arboriAcestia vor fi inlocuiti printr-un nou arbore avand frecventa 20/20

A

E _

*M R

*8/20

*12/20

4/20 4/20 6/20

3/20 3/20

Page 9: Coduri Huffman

Calin Jebelean Coduri Huffman 9

Coduri Huffman

Am ajuns la un singur arbore, moment in care ne oprimVom eticheta fiecare ramura spre stanga cu 0 si fiecare ramura spre dreapta cu 1

A

E _

*M R

* *

20/20

*

4/20 4/20 6/20

3/20 3/20

Page 10: Coduri Huffman

Calin Jebelean Coduri Huffman 10

Coduri Huffman

Caracterele din sirul initial au ajuns frunze in arborele HuffmanDrumul de la radacina la fiecare frunza va da codul Huffman al caracterului corespunzator frunzei

A

E _

*M R

* *

20/20

*

4/20 4/20 6/20

3/20 3/20

0

0 1

1 0 1

0 1

Page 11: Coduri Huffman

Calin Jebelean Coduri Huffman 11

Coduri Huffman

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)

Page 12: Coduri Huffman

Calin Jebelean Coduri Huffman 12

Coduri Huffman

Se observa ca codurile Huffman obtinute in urma algoritmului prezentat sunt mai scurte decat codurile standard de 3 biti/caracterMai 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

Page 13: Coduri Huffman

Calin Jebelean Coduri Huffman 13

Coduri Huffman

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

Page 14: Coduri Huffman

Calin Jebelean Coduri Huffman 14

Coduri Huffman

Vom codifica sirul “MARE E MAREA MARMARA” folosind codurile obtinuteRezultatul este: 00 10 01 110 111 110 111 00 10 01 110 10 111 00 10 01 00 10 01 10Sunt necesari 46 de bitiCodificarea cu 3 biti/caracter ar fi dus la 3·20 = 60 de biti, deci am realizat o compresie de 76,6%Codificarea implicita cu 8 biti/caracter ar fi dus la 8·20 = 160 de biti deci am realizat o compresie de 28,75% fata de aceasta codificare

Page 15: Coduri Huffman

Calin Jebelean Coduri Huffman 15

Coduri Huffman

Codurile Huffman obtinute au proprietatea de prefixProprietatea de prefix suna astfel: “nici un cod nu este prefix pentru alt cod”Aceasta proprietate este asigurata implicit din modul de constructie al arborelui HuffmanFiecare 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)

Page 16: Coduri Huffman

Calin Jebelean Coduri Huffman 16

Coduri Huffman

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