Sunteți pe pagina 1din 11

o o o o o o

Definitia arborelui Huffman Proprieti ale arborelui Huffman Creare arborelui Huffman Aplicaia 1: Codul Huffman Aplicaia 2: Unirea fiierelor sortate Aplicaia 3: Generarea numerelor aleatoare

Definiie:
Un arbore Huffman este un arbore binar care minimizeaz suma f (i ) D(i ) , unde i reprezint un nod frunz, f(i) este frecvena sau i ponderea frunzei i, iar D(i) este lungimea drumului de la rdcin la frunza i. n fiecare aplicaie, f(i) are un sens fizic diferit.

Proprieti:
Arborele Huffman are urmtoarele proprieti: - fiecare nod intern are doi descendeni; - nodurile cu frecvene mai mici se afl mai departe de rdcin; - cele mai mici dou frecvene sunt aezate pe poziiile cele deprtate de rdcin

mai

Exemplu:
Fie un alfabet care conine literele a, b, c, d i e, ceea ce reprezint numele frunzelor ilustrate in tabelul urmator cu frecvenele lor corespunztoare.
Caracterul a b c d e Frecvena 20 11 8 12 49

Conform tabelului frunzele c i b vor fi asezate cel mai departe fa de rdcin. Cele dou frunze cu frecvena cea mai mic trebuie aezate astfel nct s pstrm suma f (i ) D(i ) la valoarea ei minim. i n cazul n care nu s-ar face aceast aezare, suma nu ar fi minim. Acest lucru ar contrazice definiia arborelui Huffman. n acest caz, ar trebui s schimbm frunza cu o frecven mai mic aeznd-o mai departe de radcin. De asemena putem demonstra c fiecare nod intern trebuie s aib doi descendenti pentru a fi un arbore Huffman.S considerm cazul n care tergem frunza a din arborele de mai jos. 100 0 e 49 0 a 20 d 12 c 8 0 0 1 51 1 31 1 19 1 b 11

tergnd frunza ar rezulta un arbore n care suma f (i ) D(i ) nu i ar fi minim. Aadar, trebuie s reconstruim arborele, tergnd o frunz din subarborele nodului, pentru a face acest nod al doilea fiu. Arborele rezultat este cel de mai jos:

80 0 31 d c 1 e

0 12 0 8

1 19 1

49

11

Dup ce au fost identificate dou frunze cu frecvenele cele mai mici, se poate realiza tergerea sau nlocuirea lor cu un nod intern. n aa fel, problema este redus ca dimensiuni. Arborii Huffman nu sunt unici. Adic, poi avea arbori diferii, pentru acelai set de frunze cu aceleai frecvene. De exemplu,dac ai frunze cu aceeai frecven, poziia unora fat de celelalte nu este important.

Construirea arborelui Huffman


S-a realizat un algoritm cu o eficien O(n log n) pentru construirea unui arbore Huffman, datorit lui Hu i a lui Tucker. Se folosete un vector de noduri ce conin o frecven i pointeri ctre dreapta i stnga.
Numr 1 2 . . . . Frunze . . . . . . . . N n+1 Noduri interne n+2 . . . Rdcina 2n-1 f(i) f1 f2 f3 . . . G I V E N . . . . fn . . . . . . Stnga 0 0 0 . . . . . . . . . . . . . 0 0 . . . . . . Dreapta 0 0 0 . . . . . . . . . . . . . 0 0 . . . . . .

n jumtatea de sus a tabelei, numerotat de la 1 la n, avem frunzele unui arbore Huffman. Acestea au anumite frecvene date, i nu au successor stng sau drept, De aceea se pune 0 pe coloanele respective. n partea de jos a tabelei, ntre n+1 i 2n-1, avem nodurile interne,incluznd rdcina, de pe poziia 2n-1.Frecvenele lor pot fi calculate de succesorii lor stng, respectiv drept. Dup cum vom vedea mai departe, cel mai slab caz este de complexitate O(n log n). Alfabetul este aranjat ntr-un heap, care are, prin definiie, cele mai mici elemente mai sus. Cheile dup care este ordonat heap-ul sunt frecvenele caracterelor. Heap-ul este iniial format din n perechi (i, f(i))
4

corespunztoare frunzelor. La fiecare iteraie, dou elemente de frecvene minime sunt terse i este creat un nod intern.Frecvena acestui nod intern nou format este suma frecvenelor succesorilor si, i este reprezentat printr-un nou supercaracter. Acest nod este inserat n heap i procesul se repet. Algoritmul Hu Tucker
O(n) Se folosete heap-ul ce contine perechile (1,f(1)),..,(n,f(n)) FOR i = n+1 TO 2n-1 DO (l,fl) <--- Deletemin(Heap) (r,fr) <--- Deletemin(Heap) fi <--- fl + fr Insert ((i,fi), Heap) Left[i] <--- l Right[i] <--- r RETURN

O(n log n)

Instruciunea for care este executat de n-1 ori pentru un alfabet de n litere extrage n mod repetat cele dou noduri cu cele mai mici frecvene i le nlocuiete cu un alt nod, avnd frecvena suma frecventelor celorlalte dou noduri. Acest nou nod are drept descendeni nodurile anterioare cu frecvenele cele mai mici. Cel mai slab caz are complexitatea O(n log n).

Aplicaia 1: Codul Huffman


Un limbaj este format din simboluri sau caractere. Setul de simboluri al unui limbaj se numete alfabet. Un cod de cuvinte este un mod de a reprezenta un simbol folosind alte simboluri. Fiecare simbol dintr-un alfabet are propriul su cod. Colecia de coduri de cuvinte formeaz un cod. Codurile sunt folosite n multe aplicaii pe calculator. O astfel de aplicaie este comprimarea i decomprimarea datelor. O alt aplicaie des ntlnit este folosit n transmiterea datelor. Datele sunt transmise prin fire de telefon sau cabluri de date ca semnale electrice.De cnd aceste semnale electrice sunt o form a limbajului binari, datele trebuie codificate. Pentru a face transmiterea ct mai rapid, ne-am dori un cod eficient cu cea mai mic lungime medie a cuvintelor din cod. Oricum aceasta lungime medie nu este pur i simplu media lungimilor tuturor cuvintelor, ci mai degrab media lungimii fiecarui cuvnt, nmulit cu probabilitatea de apariie a simbolului P(i), aa cum indic i formula urmtoare:

unde Pi este probabilitatea simbolului. Probabilitatea unui simbol reprezint probabilitatea ca acel simbol s apar n text.Ca ntotdeauna, suma probabilitilor P(i) este 1. Dac lum primul nostru exemplu, cel cu cinci litere ale alfabetului, ilustrat n Tabela 1, putem genera arborele Huffman pentru el. Frecvena se poate da sub form de probabiliti, procentaj sau sub orice alta form numeric. 100 0 e 49 0 a 20 d 12 c 8 0 0 1 51 1 31 1 19 1 b 11

Caracter Frecvena Cod A B C D E 20 11 8 12 49 10 1111 1110 110 0

Codul prefixelor poate fi vizualizat printr-un arbore,avnd frunzele corespunztoare simbolurilor. Codul pentru fiecare caracter al alfabetului este generat, urmrind drumul de la rdcin spre caracter, unde fiecare ramur stng este notat cu 0, iar fiecare ramur dreapt cu 1. Dac probabilitile sunt exacte, atunci codul Huffman d cea mai bun medie dintre numarul de bii i simboluri. Aceasta este o metod de optimizare a arborilor, folosind arbore Huffman, unde frecvena f(i) este nlocuit de probabilitatea P(i). Folosind exemplul nostru putem calcula lungimea medie a cuvintelor din cod:
0.49*1 + 0.20*2 + 0.12*3 + 0.11*3 + 0.08*3 = 1.82

Aplicaia 2: Concatenarea fiierelor sortate


Vrem s concatenm n fiiere sortate de lungimi s(1),, s(n) ntrun fiier mai mare, fcnd un numr minim de comparaii. Numrul de comparaii necesar pentru a concatena dou fiiere sortate de lungimi m, respective n este, n cel mai ru caz, m+n (de fapt sunt m+n-1 comparaii, dar vom ignora -1 pentru moment). Putem uni doar cte dou fiiere o dat, de aceea ordinea n care se unesc este important. De exemplu, avem cinci fiiere de lungimi 200, 150, 810, 300 i 40.S ncercm s le unim n aceast ordine.Mai nti unim fiierele de lungimi 200 i 150 i se obine un fiier de lungime 350. Apoi unim fiierul de lungime 350 cu cel de lungime 810, rezultnd un fiier de lungime 1160.Apoi acesta de 1160, cu cel de 300 i obinem un fiier cu o lungime de 1460. i n sfrit, unim fiierele de lungimi 1460 i 40, obinnd un fiier de lungime 1500. Acest proces se poate vizualiza prin arborele binar de mai jos.

Fiecare fiier este o frunz a arborelui. Dou noduri cu frecvenele cele mai mici se unesc formnd un fiier printe mai mare. Acest mecanism pare bun, dar este de fapt o pierdere de timp. Pentru c fisierele anterioare sunt unite iar i iar, ca pri din fiierul mai mare, numrul de comparaii necesar pentru a uni fiierele n aceast ordine este 200+150+350+810+1160+300+1460+40=4470 Exist un mod mult mai eficient de a proceda, ce va necesita mai puine comparaii. Dac am privi din perspectiva arborelui, numrul total de comparaii este suma dupa fiecare frunz i din produsul dintre lungimea fisierului s(i) nmulit cu distanta de la rdcin D(i).

Numrul de comparaii = s (i ) * D(i ) i Din nou, avem aceeai optimizare: vrem s minimizm suma s(i ) D(i ) . Acum s(i) joac rolul lui f(i). Metoda optim de a uni i fiierele ar fi s fac acest lucru n ordinea cresctoare a lungimilor: se unete fierul de lungime 40 cu cel de lungime 150, rezultnd unul de lungime 190, se unete fiierul de 190 cu cel de lungime 200, i rezult unul de lungime 390, se unete fiierul de lungime 390 cu cel de 300, rezult un fiier de lungime 690, apoi se unete cel de lungime 690 cu cel de lungime 810 i rezult unul de lungime 1500. Acest procedeu d un numr total de comparaii de: 40+150+190+200+390+300+690+810=2770 (n comparaie cu 4470 obinute anterior). Astfel, cele mai mici fiiere sunt cele mai des unite. Este analog cu problema caracterelor cu frecvena cea mai mic.
150 0 69 0 30 0 19 0 4 0 15 0 39 0 20 0 81 0

Dintre toti, arborele Huffman este optim. Una din proprietaile de baz ale arborelui Huffman este aceea c cele mai mici frecvente se afl cel mai departe de rdcin iar acestea se unesc ntr-un nod printe. Reinnd acest lucru, nu avem neaprat nevoie de arbore. Singurul lucru pe care trebuie s-l reinem este c cele mai mici dou fiiere vor fi unite mai nti. Acest pas se va repeta .

Aplicaia 3: Generarea numerelor aleatoare


Problem: S se genereze aleator un numr ntreg dndu-se probabilitatea de apariie. Metoda folosit pentru rezolvare se bazeaz pe un arbore binar n care fiecare frunz corespunde unui numr ntreg. Se ia un numr oarecare U din intervalul [0,1] i se parcurge arborele dinspre rdcin, aa nct fiecare frunz este parcurs cu probabilitatea corect. Probabilitaile din exemplul nostru sunt cele ilustrate n figura de mai jos. De exemplu probabilitatea de apariie a cifrei 1 este 0.15, pe cnd probabilitatea de apariie a lui 2 este 0.20.Vrem s construim un arbore care va parcurge fiecare din cele ase frunze cu probabilitatea corect.

Algoritmul pentru parcurgerea arborelui asociaz fiecrui nod i o valoare prag t(i), care este suma valorilor frunzelor din stnga acestuia. Pentru a gsi valoarea t(i) se parcurge arborele n preordine. Preord (i) Dac i NULL atunci t(i) = t(i) + P(i), unde P(i) este frecvena unei frunze sau 0 pentru un nod intern Preord (st [i]) Preord(dr [i])

10

Dac acest lucru este stabilit, fiecare nod intern are o valoare ce ne permite s parcurgem mai departe arborele, parcurgnd frunzele cu probabilitatea corect. Arborele de mai jos ilustreaz valorile pentru fiecare nod intern. Vom compara aceste valori cu numrul aleator dat.

Fiecare dintre aceste ase probabiliti apar ntr-o gam ntre 0 i 1. Lungimea acestui sir de numere este direct proporional cu frecvena lor. Deci, dac numrul aleator dat este ntre 0 i 0.10, vom ajunge la frunza 3.n acelai fel pentru a parcurge frunza 6 trebuie ca numrul aleator s fie ntre 0.72 i 0.85. Lungimea irului cu ajutorul cruia este atins frunza 6 este 0.13, care este i probabilitatea ei de apariie. 1 comparaie = 1 unitate de timp Deci, conform celor de mai sus vom avea nevoie de 3 unitai de timp pentru a atinge frunza 6 i de 2 uniti de timp pentru frunza 2. Timpul total necesar este p(i ) * D (i ) , unde i sunt frunzele, iar i p(i)probabilitile date. Arborele care optimizeaza timpul de execuie este arborele Huffman. Deci trebuie s-l construim ca mai sus.

11