Professional Documents
Culture Documents
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.
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).
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
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
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 .
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