Documente Academic
Documente Profesional
Documente Cultură
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
> 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
.
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),
lungimco lui S
n
=1
unde, o
, 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 :