Sunteți pe pagina 1din 15

1

Tehnica Greedy
Prezentare
Un algoritmgreedy va funciona asemntor modului de gndire al unui om lacom: va consuma
elemente dintr-o anumit secven, de fiecare dat lund acel element, ce se potrivete cel mai bine cu
un anumit criteriu, fr a privi n perspectiv. Dei prima impresie ar fi c aceast abordare este una
greit, datorit conotaiei cuvntului lacom, totui uneori algoritmii de acest tip pot duce la soluii
simple i eficiente.
Un algoritmgreedy este potrivit atunci cnd trebuie s lum o serie de decizii, i anume pe cea
mai convenient la un moment dat. Aceast alegere este un optim local, iar sperana este ca, ntr-un
final s fie obinut soluia global, ns nu se ntmpl aa ntotdeauna. Pentru un algoritm dat, va
trebui s determinm dac soluia este sau nu optim.
n cele mai multe situaii avem:
- O mulime de candidai ( valori de ales, noduri in graf etc.)
- O funcie care verific dac o mulime de candidai constituie o soluie posibil, nu neaprat
optim, a problemei
- O funcie care verific dac o mulime de candidai este fezabil, adic dac este posibil s
completm aceast mulime astfel nct s obineam o soluie posibil (nu neaprat
optim).
- O funcie de selecie ce indic ntr-un anumit moment care este cel mai potrivit dintre
candidaii nefolosii.
- O funcie obiectiv care d valoarea unei soluii (timpul necesar executrii tuturor lucrrilor
ntr-o anumit ordine), lungimea drumului pe care l-am gsit etc).
Iat un exemplu simplu ce ilustreaz tehnica greedy. Atunci cnd facem cumprturi, i
efectum plata, nu dorim s primim rest foarte mrunt. Soluia pentru a gsi cea mai bun
soluie la plata restului ( n monede ) permite reformularea problemei, conform celor
afirmate mai sus. Iat elementele problemei:
2
- Candidaii: mulimea iniial de monede de 1, 5, i 25 de uniti i presupunem c avem o
cantitate nelimitat din fiecare categorie
- Funcia ce verific soluia posibil: valoarea total a unei astfel de mulimi s fie exact
valoarea ce trebuie returnat ca rest.
- O mulime fezabil: valoarea total a unei astfel de mulimi nu este mai mare dect suma
de returnat ca rest.
- Funcia de selecie: se alege cea mai mare moned din mulimea de candidai. Motivul este
acela c dorim s pltim folosind ct mai puine monede.
- Funcia obiectiv: numrul de monede folosite s fie ct mai mic.
Evident soluia optim se poate gsi ncercnd toate combinrile posibile de monede, i
abordarea se mai numete brute force. Acest lucru necesit foarte mult timp. Din cele deduse mai sus
rezult urmtorul algoritm formulat ntr-un limbaj descriptiv:
1. wh||e ( moi sunt monczi i nu s o gsit sumo) du
2. io cco moi morc moncJ Jin cclc rmosc
3. | ( oJugorco monczii occ co sumo s ic moi morc Jcct rcstul) then
4. rcspingc moncJo
5. e|xe
6. oJoug moncJo lo rcst
7. | ( rcstul cstc cgol cu sumo Jc rcturnot) then
8. problcmo cstc rczol:ot, s o gsit sumo
Iat un mic exemplu pentru a demonstra acest algoritm. Se d suma de returnat 36. Se va prelua
o moned de 25 de uniti, se verific s fie mai mic sau egal cu 36 i este, ceea ce duce la adugarea
ei n soluia provizorie. Apoi se ncearc adugarea unei monede de 25, ceea ce va depi suma de 36
deci moneda va fi respins. Apoi se va ncerca adugarea unei monede de 5, suma devine 30, apoi nc o
moned de 5, suma devine 35 i ncercarea adugrii nc unei monede de 5 eueaz. Apoi se ncearc
adugarea unei monede de 1 i suma este atins. Algoritmul se ncheie.
Pe de alt parte dac am introduce monezi de 18 sau de 12 algoritmul va gsi un numr mai
mare dect 2 monede de 18 sau 3 de 12, ceea ce dovedete c atingerea numrului optim de monede
nu este ndeplinit n toate cazurile, deci algoritmul nu funcioneaz pentru orice caz.
3
Pornind de la problema de mai sus, i mai exact de la paii folosii pentru a rezolva algoritmul,
putem generaliza rezolvarea problemei astfel:
FuNCII0N 0REE(C)
1. C cstc mulimco conJiJoilor
2. S unJc S cstc mulimco n corc rcincm soluio
3. wh||e nut solutic(S)and C du
4. x un clcmcnt Jin C care minimalizeaz sclcct(x)
5. C C\{x}
6. | czobil(S {x}) then S S {x}
7. | soluic(S) then return S
8. e|xe return "nu cxist soluic"
Este de neles acum de ce un astfel de algoritm se numete lacom: la fiecare pas, procedura
alege cel mai bun candidat la momentul respectiv, fr s i pese de viitor i fr a se rzgndi (a reveni
asupra deciziei). Dac un candidat este inclus n soluie el va rmne acolo. Dac n schimb, acel
candidat este exclus, el nu va mai putea niciodat fi reconsiderat.
Asemenea unui ntreprinztor rudimentar, care urmrete ctigul imediat, n dauna celui din
perspectiv, un algoritm greedy acioneaz simplist. Totui, ca i n afaceri, o astfel de metod se
dovedete util, tocmai datorit simplitii ei.
Funcia sclcct este de obicei derivat din funcia obiectiv, uneori aceste funcii sunt identice.
Minimizarea timpului mediu de ateptare
S presupunem c un frizer are mai muli clieni pentru diverse tratamente ( tuns simplu, tuns
cu ampon, permanent, vopsit). Tratamentele nu vor dura la fel, dar stilistul tie ct va lua fiecare. Un
scop al problemei, este ca frizerul s programeze clienii astfel ca s minimizeze timpul de ateptare n
salon (att ct stau ct i cnd sunt servii). Timpul total petrecut n salon se numete timp n sistem.
Problema minimizrii timpului de ateptare are multe aplicaii: putem permite accesul la disc n funcie
de utilizator. Astfel utilizatorii vor atepta ct mai puin pentru a citi un fiier.
O alt problem apare cnd un client va avea nevoi de acelai timp pentru a completa o sarcin
dar are un anumit deadline ceea ce nseamn uneori ca trebuie s nceap mai devreme, sau s fie servit
la timp. Scopul este evident, de a minimiza timpul pentru a maximiza profitul. Vom discuta i acest
aspect.
4
S presupunem c exist trei sarcini care trebuie ndeplinite i timpii pentru le a ndeplini sunt:
t
1
= 5, t
2
= 10 i t
3
= 4
Unitile de timp nu sunt relevante. Dac ordonm cronologic cele trei sarcini obinem urmtoarea
secvene de aciuni:
Sarcin Timp n sistem
1 5(timp de servire)
2 5(timp ateptare dup 1) + 10(timp de servire)
3 5(timp ateptare dup 1) + 10(timp de ateptare dup 2) +4(timp de servire)
Timpul de total de ateptare este: 5 + (5 + 10) + (5 +10 + 4) = 39
Aceeai metod de calcul va duce la urmtoarele posibiliti de a servi cele trei cereri:
Mod de a servi Timpul total in sistem
[1, 2, 3] 5+(5+10)+(5+10+4) = 39
[1, 3, 2] 5+(5+4)+(5+4+10) = 33
[2, 1, 3] 10+(10+5)+(10+5+4) = 44
[2, 3, 1] 10+(10+4)+(10+4+5) = 43
[3, 1, 2] 4+(4+5)+(4+5+10) = 32
[3, 2, 1] 4+(4+10)+(4+10+5) = 37
Se observ c cel mai bun mod de a servi cererile este [3, 1, 2] cu un timp total de 32.
Exist clar un algoritm care poate verifica toate permutrile posibile. Ordinul de timp al acestui algoritm
este ns factorial. Aceast soluie, numit i brute force poate fi nlocuit cu un algoritm de tip greedy
mult mai simplist i mai eficient. Se observ c soluia cea mai bun conine timpii sortai cresctor.
Intuitiv, un algoritm pe care l dezvoltm va ncerca s serveasc sarcina care dureaz cel mai puin:
PR0CEuRE 0PIIHAl IIHE
1. sortcoz sorcinilc Jup timp n orJinc crcsctoorc
2. wh||e (instono nu cstc rczol:ot) du
3. progromcoz urmtoorco sorcin
4. | (nu moi cxist sorcini) then
5. instono cstc rczol:ot
Evident c algoritmul poate fi adaptat dup sensul problemei, i n cazul de fa putem nlocui pasul 3 cu
adugarea timpului sarcinii urmtoare la timpul total.
Complexitatea acestui algoritm este : 0(n log n).
5
Teorema 4.1
Singurul mod de a aranja astfel ca timpul total s fie minim, este acela n care sarcinile sunt ordonate
cresctor dup timpul de servire.
Demonstraie
Pentru 1 i n 1 fie t

timpul de servire pentru a i-lea sarcin programat n aa fel nct timpul


total este minim. Va trebui s art, c este necesar ca sarcinile s fie ordonate dup timpul lor de
execuie. Vom demonstra acest lucru prin reducere la absurd. Dac nu sunt ordonate dup timpul lor de
execuie, atunci exist una i anume i unde 1 i n 1, pentru care
t

> t
+1
Putem rearanja ordinea iniial, interschimbnd aceste sarcini i anume i cu i + 1. Realiznd aceasta,
am luat t

uniti de timp din sarcina i + 1, care anterior erau calculate pentru timpul acesteia. Motivul
pentru care scdem acest t

este c acum i + 1 nu mai ateapt dup i. Evident la sarcina i adunm t


+1
pentru acelai motiv. Totui timpul total din sistem nu se modific. Dac I este timpul total din sistem,
atunci I
i
este timpul total dup rearanjarea de mai sus. Atunci
I
i
= I +t
+1
t

.
Deoarece t

> t
+1
putem spune c I
i
< I ceea ce contrazice afirmaia c I este timpul optim.
Se poate deduce cum generalizm algoritmul pentru ca acesta s trateze o problem de programare
multi-server. Fie m servere. S se ordoneze aceste servere arbitrar. S se ordoneze sarcinile dup timp,
n ordine cresctoare. Fie ca primul server s deserveasc prima sarcin, cu cel mai mic timp, i al m-lea
server s deserveasc a m-a sarcin. Primul server va termina la un moment dat, primul, deoarece are si
cel mai mic timp de executat. Apoi primul server va deservi a (m+1) sarcin. Apoi al doilea server va
efectua a (m+2) sarcin. Schema de servire are loc dup cum urmeaz:
Scr:cr 1 Jcscr:crtc sorcino 1, (1 + m), (1 + 2m),
Scr:cr 2 Jcscr:crtc sorcino 2, (2 +m), (2 +2m),

Scr:cr i Jcscr:crtc sorcino i, (i + m), (i + 2m),

Scr:cr m Jcscr:crtc sorcino m, (m+ m), (m+2m),


Rezult ordinea fireasc a servirii:
1, 2, , m, (1 + m), (2 +m), (m+m), (1 +2m),
6
Programarea servirii folosind termeni limit
n aceast problem de programare, fiecare sarcin va avea nevoie de o unitate de timp pentru
a termina i are un termen limit i un profit. Adic, dac operaia ncepe mai devreme de termenul
limit, se obine un profit. Scopul este de a programa operaia ca profitul s fie maxim. Nu toate
sarcinile trebuie s fie executate. Iat un exemplu pentru a ilustra mai bine problema:
Fie urmtoarele sarcini, timpi limit, profituri:
Sarcin Timp limit Profit
1 2 30
2 1 35
3 2 25
4 1 40
Atunci cnd spunem c o sarcin 1 are un termen limit de 2, nseamn c sarcina 1 poate
ncepe la timpul 1 sau timpul 2. Nu exist timp 0. Deoarece sarcina 2 are timpul limit 1, aceast sarcin
poate porni doar la timpul 1. Iat posibilele profituri.
Programare Profit total
[1, 3] 30+25 = 55
[2, 1] 35+30 = 65
[2, 3] 35+25 = 60
[3, 1] 25+30 = 55
[4, 1] 40+30 = 70
[4, 3] 40+25 = 65
Alte programri imposibile (de exemplu [1,2]), nu au mai fost listate. Pe de alt parte,
programri ca [1,3] sunt posibile, deoarece sarcina 1 a pornit naintea termenului limit, iar sarcina 3, a
pornit exact la termenul limit. Se poate vedea c programarea [1,4] este optim i are cel mai mare
profit. Se poate modifica algoritmul de mai sus pentru a obine un algoritm mai bun dect cel de ordin
factorial pentru a rezolva aceast problem.
7
Interclasarea optim a irurilor ordonate
S presupunem c avem dou iruri S
1
, S
2
ordonate cresctor i c dorim s obinem prin
interclasarea lor, irul ordonat cresctor ce conine elementele din ambele iruri. Dac interclasarea are
loc prin deplasarea elementelor din cele dou iruri, atunci evident numrul deplasrilor este #S
1
+
#S
2
.
Dac generalizm, considermn iruri S
1
, S
2
, , S
n
unde fiecare ir S

, 1 i n fiind format din


q

elemente ordonate cresctor ( vom denumi q

lungimco lui S

). Ne propunem s obinem irul S,


ordonat cresctor, unde S conine toate elementele din cele n iruri. Vom realiza aceasta prin
interclasri succesive de cte dou iruri. Problema const n determinarea ordinii optime n care
trebuie efectuare aceste interclasri, astfel ca numrul total de deplasri s fie minim. Exemplul de mai
jos ne arat c problema nu este una banal.
Fie irurile S
1
, S
2
, S3 de lungimi q
1
= 30, q
2
= 20, q
3
= 10. Dac interclasm pe S
1
cu S
2
, iar
rezultatul l interclasm cu S
3
, numrul total de deplasri este (30 +20) + (50 +10) = 110.
Dac interclasm pe S
1
cu S
2
, iar rezultatul n interclasm cu S
3
, numrul total de deplasri este
(10 +20) + (30 +30) = 90. Dac interclasm pe S
1
cu S
3
, iar rezultatul n interclasm cu S
2
, atunci
numrul total de deplasri va fi (10 +30) +(40 + 20) = 100.
Dup cum se poate vedea numrul minim de deplasri este 90.
Atam fiecrei strategii de interclasare un arbore binar n care valoarea fiecrui vrf este dat
de lungimea irului pe care l reprezint.
De exemplu, dac irurile S
1
, S
2
, , S
6
au lungimile q
1
= 30, q
2
= 10, q
3
= 20, q
4
= 30, q
1
=
50, q
6
= 10, dou dintre strategiile de interclasare sunt reprezentai prin arborii din figura de mai jos:
8
Figura 1. Reprezentarea strategiilor de interclasare
Observm c fiecare arbore are 6 vrfuri terminale, corespunznd celor 6 iruri iniiale i 5 vrfuri
neterminale, adic cele 5 interclasri care definesc strategia. Numerotm vrfurile astfel: vrful terminal
i, 1 i 6 va corespunde irului S

, iar vrfurile neterminale se numeroteaz de la 7 la 11 n ordinea


obinerii lor, ca n figura 2.
Strategia greedy apare n figura 1b, i const n a interclasa mereu cele mai scurte iruri
disponibile la momentul curent.
Interclasnd irurile S
1
, S
2
, , S
n
de lungimile q
1
, q
2
, , q
n
, obinem pentru fiecare strategie
cte un arbore binar cu n vrfuri terminale, numerotate de la 1 la n, i n 1 vrfuri neterminale,
numerotate de la n +1 la 2n 1. Definim pentru un arbore oarecare A de acest tip, lungimea extern
ponderat ca fiind
I(A) = o

n
=1
unde, o

este adncimea vrfului i. Se observ c numrul total de deplasri de elemente pentru


strategia corespunztoare lui A este chiar I(A). Soluia optim este deci arborele pentru care lungimea
ponderat este minim.
9
Figura 2. Numerotarea vrfurilor arborilor din figura 1.
Proprietatea 1
Prin metoda greedy se obine ntotdeauna interclasarea optim a n iruri ordonate.
Demonstraie
Demonstrm prin inducie. Pentru n = 1, proprietatea este verificat. Presupunem c proprietatea este
adevrat pentru n 1 iruri. Fie A arborele strategiei greedy de interclasare a n iruri de lungime
q
1
q
2
q
n
. Fie B un arbore cu lungimea extern ponderat minim, corespunztor unei strategii
optime de interclasarea a celor n iruri. n subarborele A apare arborele
reprezentnd prima interclasare fcut conform strategiei greedy. n arborele B, fie un vrf neterminal,
de adncime maxim. Ceio doi fii ai acestui nod, sunt q
]
, q
k
. Fie B
i
arborele obinut din B
interschimbnd vrfurile q
1
cu q
]
respectiv, q
2
cu q
k
. Evident c I(B
i
) I(B). Deoarece B are
lungimea extern ponderat minim, rezult c I(B
i
) = I(B). Eliminnd din B
i
vrfurile q
1
, q
2
,
obinem un arbore B
ii
cu n 1 vrfuri terminale q
1
+ q
2
, q
3
, , q
n
. Arborele B
i
are lungimea extern
ponderat minim i I(B
i
) = I(B
ii
) +(q
1
+q
2
). Rezult c i B
ii
are lungimea extern ponderat
10
minim. Atunci conform ipotezei, I(B
ii
) = I(A
i
) unde A
i
este arborele strategiei greedy de interclasare
a irurilor de lungime q
1
+ q
2
, q
3
, , q
n
. CumA se obine din A
i
atand nodului q
1
+ q
2
, fii q
1
i q
2
, iar
B
i
se obine n acelai mod din B
ii
, rezult c I(A) = I(B
i
) = I(B). Rezult c proprietatea este
adevrat pentru orice n.
La scrierea algoritmului care genereaz arborele strategiei greedy de interclasare, vom folosi un
min-heap. Fiecare element al min-heap-ului este o pereche (q, i) unde i este numrul unui vrf din
arborele strategiei de interclasare, iar q este lungimea irului. Proprietatea de min-heap se refer la q.
Algoritmul interopt va construi arborele strategiei greedy. Un vrf i al arborelui va fi memorat n trei
locaii diferite coninnd:
Iu[i] = lungimea irului reprezentat de vrf
SI[i] = lungimea irului corespondent fiului stng
R[i] = lungimea irului corespondent fiului drept
PR0CEuRE INIER0PI([1. . n])
1. construicstc orborclc strotcgici grccJy Jc intcrclosorc
2. o sirurilor Jc lungimi [i] = q

, 1 i n
3. E min cop :iJ
4. ur i 1 tu n du
5. ([i], i) E inscrcoz in min cop
6. Iu[i] [i]
7. SI[i] 0
8. R[i] 0
9. ur i n +1 tu 2n 1 du
10. (s, ]) E cxtrogc rJcino lui E
11. (r, k) E cxtrogc rJcino lui E
12. SI[i] ]
13. R[i] k
14. Iu[i] s +r
Timpul total pentru acest algoritm este de 0(n log n)
11
Algoritmul lui Huffman
O alt aplicaie a strategiei greedy i a arborilor binari cu lungime extern ponderat minim
este obinerea unei codificri ct mai compacte a unui text.
Un principiu general de codificarea a unui ir de caractere este urmtorul: se msoar frecvena
de apariie a diferitelor caractere, i cele mai lungi coduri, celor mai puin frecvente caractere, i cele
mai lungi coduri, celor mai puin frecvente caractere. Acest principiu st, de exemplu, la baza codului
Morse.
Pentru situaia n care codificarea este binar, exist o metod elegant pentru a obine codul
respectiv. Aceast metod, descoperit a fost descoperit de David Albert Huffman n 1953 i folosete
o strategie greedy. Aceast strategie este folosit cu succes n compresii de date, pentru a codificarea
datelor din fiiere de exemplu. Pentru a prezenta algoritmul vom avea nevoie de nite noiuni
preliminare.
Un mod convenient de a reprezenta un fiier este cel n care folosim cod binar. n astfel de cod,
fiecare caracter este reprezentat de un ir binar unic, numit cuvnt codificat. Un cod binar de lungime
fix, poate reprezenta un caracter folosind un numr de bii. De exemplu iat mulimea de caractere
{o,b,c} Putem folosi 2 bii pentru a codifica fiecare caracter astfel:
o:00 b:01 c:11
Dac avem un fiier ce conine secvena
obobcbbbc
codificarea acestuia este:
000100011101010111
Putem obine o codificare mult mai eficient folosind un cod binar de lungime variabil. Un
astfel de cod poate reprezenta diferite caractere folosind diferite numere de bii. n exemplul de fa,
putem nota unul din caractere ca 0, din moment ce b apare cel mai frecvent, ar fi suficient s codificm
acest caracter folosind 0. Totodat, o nu mai poate fi codificat ca 00, deoarece nu mai putem distinge
ntre un o i doi de b succesivi. Dac am codifica pe o cu 01, apare confuzia interpretrii: primul 0 este
un nceput de o sau este un b. Aa c o metod de a codifica este:
o:10 b:0 c:11
Dat fiind aceast codificare, irul de mai sus poate fi reprezentat ca:
1001001100011
12
Observm c aceast codificare va avea nevoie de 13 bii pentru a reprezenta irul, n
comparaie cu cea de mai sus care are nevoie de 18.
Coduri prefixate
Un tip aparte de coduri variabile ca lungime este codul prefixat. ntr-u cod prefixat, nici un cuvnt
codificat pentru un caracter are voie s constituie nceputul unui cuvnt codificat al altui caracter. De
exemplu, dac 01 este cuvntul codificat pentru o atunci 011 nu are voi s fie cuvnt codificat pentru b.
Codul de 13 bii de mai sus este un astfel de exemplu. Fiecare cod prefixat poate fi reprezentat ca un
arbore binar a cror frunze sunt caracterele ce trebuie codificate. Arborele binar corespunztor codului
de mai sus este:
Figura 3. Arborele binar corespunztor codului o:10 b:0 c:11
Iat mai jos un alt exemplu:
Fie mulimea de caractere {o,b,c,J,c,} i fiecare caracter apare n fiier de un numr de ori
indicat n tabelul de mai jos. Acest tabel prezint diferena ntre diversele coduri folosite.
Caracter Frecven C1(Lungime fix) C2 (o codificare) C3(Huffman)
a 16 000 10 00
b 5 001 11110 1110
c 12 010 1110 110
d 17 011 110 01
e 10 100 11111 1111
f 25 101 0 10
Se poate calcula numrul de bii folosii pentru a codifica acest fiier:
Bii(C1) = 16(3) + 5(3) +12(3) +17(3) + 10(3) + 25(3) = 255
Bii(C2) = 16(2) + 5(5) +12(4) +17(3) + 10(5) + 25(1) = 231
Bii(C3) = 16(2) + 5(4) +12(3) +17(2) + 10(4) + 25(2) = 212
13
Se poate observa c C2 aduce o mbuntire, dar Huffman este mai bun dect acesta. n figura 4 mai
jos, avem reprezentrile arborilor ce conin codificrile C2 i C3.
Figura 4. Reprezentarea codificrilor C2 o) i C3Eumon b)
De aici se poate deduce urmtoarea formul de calcul a numrului de bii necesari reprezentrii acestor
caractere, dat fiind un arbore binar A ca cele de mai sus:
bii(A) = rcc:cno(:

) oJncimco(:

)
n
=1
Unde :

sunt caracterele din fiier.


14
Algoritmul de codificare Huffman
Algoritmul construiete un arbore A corespunztor codului optimal. Va ncepe de la un set de |C| noduri
i va efectua |C|1 operaii de compunere pentru a crea arborele final.
n pseudocodul de mai jos, vom presupune c C este o mulime de n caractere i c fiecare caracter cC
este un obiect cu o frecven de |c|.
O coad de prioriti, , construit pe , este folosit pentru a identifica cele dou mai puin
frecvente obiecte pentru a le compune. Rezultatul compunerii celor dou obiecte este un nou obiect a
crei frecven este suma frecvenelor celor 2 obiecte. este implementat ca un arbore heap.
Iat mai jos algoritmul sub forma pseudocod.
EuFFHAN(C)
1. n |C|
2. C
3. ur i 1 tu n 1 du
4. z AII0CAIE N0E()
5. x lct[z] EXIRACI HIN()
6. y rigt[z] EXIRACI HIN()
7. [z] [x] +[y]
8. INSERI(, z)
9. return EXIRACI HIN()
Fie exemplul urmtor:
Caractere a b c d e f
Frecvene 45 13 12 16 9 5
Pentru exemplul nostru algoritmul va funciona astfel. Din moment ce sunt 6 litere, mrimea iniial a
cozii i a mulimii va fi n=6, vor fi necesari 5 pai de combinare a frecvenelor. Cuvntul codificat pentru
o liter este secvena de etichete de pe muchii parcurs de la rdcin la liter.
Linia 2 iniializeaz coada de prioriti cu literele din C. Bucla or din liniile 3-8 va repeta
extragerea ultimelor noduri din heap-ul , ultimele avnd cele mai mici frecvene, i va insera un nou
nod (z) ce are ca valoare suma frecvenelor lor. Nodul z are pe x drept copil stnga iar pe y drept copil
dreapta. Dup n1 operaii de acest fel, obinem un singur nod n , rdcina arborelui ce conine codul,
iar acest nod este returnat la linia 9.
15
Analiza ordinului de timp al algoritmului lui Huffman, presupune c este implementat ca un
arbore binar. Pentru un set C de n caractere, iniializarea din linia 2 poate fi realizat n timp 0(n)
folosind metoda MAKE-HEAP din cursul 3. Bucla or poate fi executat de n1 ori, dar o operaie pe
heap necesit un timp 0(log(n)), deci bucla va produce un timp 0(nlog(n)). De aceea acesta va fi timpul
total al algoritmului Huffman.
Figura 5. Paii algoritmului pentru frecvenele de mai sus.
Fiecare parte prezint coninutul cozii sortate dup frecven. la fiecare pas, dou noduri cu frecvenele
cele mai joase sunt unite. Frunzele sunt prezentate ca dreptunghiuri, iar nodurile interne sunt cercuri ce
conin suma frecvenelor copiilor. Eticheta unui copil stnga se va pune 0 iar eticheta unui copil dreapta
va fi 1. Codul fiecrui caracter se obine parcurgnd arborele final de la rdcin la frunza ce conine
litera.

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