Sunteți pe pagina 1din 28

Platform de e-learning i curricul e-content

pentru nvmntul superior tehnic


Proiectarea Algoritmilor
3. Scheme de algoritmi - Greedy
Bibliografie
Cormen Introducere n Algoritmi cap. 17

Giumale Introducere in Analiza Algoritmilor cap 4.4 ,4.5

http://www.cs.umass.edu/~barring/cs611/lecture/4.pdf

http://thor.info.uaic.ro/~dlucanu/cursuri/tpaa/resurse/Curs6.pps

http://www.math.fau.edu/locke/Greedy.htm

http://en.wikipedia.org/wiki/Greedoid

http://activities.tjhsst.edu/sct/lectures/greedy0607.pdf

http://www.cse.ust.hk/~dekai/271/notes/L12/L12.pdf

Proiectarea Algoritmilor 2010
Greedy (I)
Metod de rezolvare eficient a unor probleme de
optimizare.

Soluia trebuie s satisfac un criteriu de optim global
(greu de verificat) optim local mai uor de verificat.

Se aleg soluii pariale ce sunt mbuntite repetat pe
baza criteriului de optim local pn ce se obin soluii
finale.

Soluiile pariale ce nu pot fi mbuntite sunt abandonate
proces de rezolvare irevocabil (fr reveniri)!
3
Proiectarea Algoritmilor 2010
Greedy (II)
Schema general de rezolvare a unei probleme folosind Greedy
(programarea lacom):

Rezolvare_lacom(Crit_optim, Problem)
1. sol_pariale = sol_iniiale(Problem); // determinarea soluiilor pariale
2. sol_fin = ;
3. Ct timp (sol_pariale )
4. Pentru fiecare (s in sol_pariale)
5. Dac (s este o soluie a problemei) { // dac e soluie
6. sol_fin = sol_fin U {s}; // final se salveaz
7. sol_pariale = sol_pariale \ {s};
8. } Altfel // se poate optimiza?
9. Dac (optimizare_posibil (s, Crit_optim, Problem))
10. sol_pariale = sol_pariale \ {s} U // da
optimizare(s,Crit_optim,Problem)
11. Altfel sol_pariale = sol_pariale \ {s}; // nu
12. ntoarce sol_fin;
4
Proiectarea Algoritmilor 2010
Arbori Huffman
Metod de codificare folosit la compresia fiierelor.

Construcia unui astfel de arbore se realizeaz printr-
un algoritm greedy.

Considerm un text, de exemplu:
ana are mere

Vom exemplifica pas cu pas construcia arborelui de
codificare pentru acest text si vom defini pe parcurs
conceptele de care avem nevoie.
5
Proiectarea Algoritmilor 2010
Arbori Huffman Definitii (I)
K mulimea de simboluri ce vor fi codificate.

Arbore de codificare a cheilor K este un arbore binar ordonat cu
proprietile:
Doar frunzele conin cheile din K; nu exist mai mult de o cheie intr-o frunz;
Toate nodurile interne au exact 2 copii;
Arcele sunt codificate cu 0 si 1 (arcul din stnga unui nod codificat cu 0).

k = Codul unei chei este irul etichetelor de pe calea de la rdcina
arborelui la frunza care conine cheia k (k este din K).

p(k) frecvena de apariie a cheii k in textul ce trebuie comprimat.

Ex pentru ana are mere:
p(a) = p(e) = 0.25; p(n) = p(m) = 0.083;p(r) = p( ) = 0.166
6
Proiectarea Algoritmilor 2010
Arbori Huffman Definitii (II)
A arborele de codificare a cheilor.

lg_cod(k) lungimea codului cheii k conform A.

nivel(k,A) nivelul pe care apare in A frunza ce conine cheia K.

Costul unui arbore de codificare A al unor chei K relativ la o
frecventa p este:



Un arbore de codificare cu cost minim al unor chei K, relativ la o
frecventa p este un arbore Huffman, iar codurile cheilor sunt coduri
Huffman.

e e
= =
K k K k
k p A k nivel k p k cod lg A Cost ) ( * ) , ( ) ( * ) ( _ ) (
7
Proiectarea Algoritmilor 2010
Arbori Huffman algoritm de construcie
(I)
1. pentru fiecare k din K se construiete
un arbore cu un singur nod care conine
cheia k si este caracterizat de ponderea
w = p(k). Subarborii construii formeaz
o mulime numit Arb.

2. Se aleg doi subarbori a i b din Arb
astfel nct a i b au pondere minim.


8
Proiectarea Algoritmilor 2010
3. Se construiete un arbore binar cu o rdcin r
care nu conine nici o cheie si cu descendenii a si
b. Ponderea arborelui este definit ca w(r) = w(a)
+ w(b).

4. Arborii a si b sunt eliminai din Arb iar r este
inserat in Arb.

5. Se repeta procesul de construcie descris de
paii 2-4 pn cnd mulimea Arb conine un
singur arbore Arborele Huffman pentru cheile K.

9
Arbori Huffman algoritm de construcie
(II)
Proiectarea Algoritmilor 2010
Arbori Huffman Exemplu (I)
Text: ana are mere

p(a) = p(e) = 0.25; p(n) = p(m) = 0.083; p(r) = p( ) =
0.166

Pasul 1



Pasii 2-4
W(a)=
0.25
W(e)=
0.25
W(r)=
0.16
W( )=
0.16
W(n)=
0.08
W(m)=
0.08
W(a) W(e) W(r) W( )
W(m) W(n)
W(m+n)=0.16
10
Proiectarea Algoritmilor 2010
Arbori Huffman Exemplu (II)
Pasii 2-4 (II)


Pasii 2-4 (III)


Pasii 2-4 (IV)

W(a) W(e)
W(r) W( ) W(m) W(n)
W(m+n)=0.16
W(r+ )=0.32
W(a)
W(e)
W(r) W( ) W(m) W(n)
W(m+n)=0.16
W(r+ )=0.32
W(m+n+e)=0.41
W(e)
W(m) W(n)
W(m+n)=0.16
W(m+n+e)=0.41
W(a)
W(r) W( )
W(r+ )=0.32
W(a+r+ )=0.57
11
Proiectarea Algoritmilor 2010
Arbori Huffman Exemplu (III)
Pasii 2-4 (V)




Codificare: a - 00; e -11; r - 010; - 011; m - 100;
n - 101;

Cost(A) = 2 * 0.25 + 2 * 0.25 + 3 * 0.083 + 3 *
0.083 + 3 * 0.166 + 3 * 0.166 = 1 + 1.2 = 2.2 biti.
W(a)
W(e)
W(r) W( ) W(m) W(n)
W(m+n)=0.16
W(r+ )=0.32
W(m+n+e)=0.41 W(a+r+ )=0.57
1
1
1
1
1
0
0
0
0
0
12
Proiectarea Algoritmilor 2010
Arbori Huffman - pseudocod
Huffman(K,p){
1. Arb = {k e K | frunz(k, p(k))};
2. Ct timp (card (Arb) > 1) // am mai muli subarbori
3. fie a
1
si a
2
arbori din Arb a.i. a e Arb a a
1
si a a
2
, avem
w(a
1
) w(a) si w(a
2
) w(a)); // practic se extrage
// de dou ori minimul si se salveaz in a
1
si a
2
4. Arb = Arb \ {a
1
, a
2
} U nod_intern(a
1
, a
2
, w(a
1
) + w(a
2
));
5. Dac (Arb = )
6. ntoarce arb_vid;
6. Altfel
7. fie A singurul arbore din mulimea Arb;
8. ntoarce A;

Notaii folosite:
a = frunz (k, p(k)) subarbore cu un singur nod care conine cheia k, iar
w(a) = p(k);
a = nod_intern(a
1
, a
2
, x) subarbore format dintr-un nod intern cu
descendenii a
1
si a
2
si w(a) = x.
13
Proiectarea Algoritmilor 2010
Arbori Huffman - Decodificare
Se ncarc arborele si se decodific textul din
fiier conform algoritmului:

Decodificare (in, out)
A = restaurare_arbore (in) // reconstruiesc arborele
Ct timp (! terminare_cod(in)) // mai am caractere de citit
nod = A // pornesc din rdcin
Ct timp (! frunz(nod)) // ct timp nu am determinat caracterul
Dac (bit(in) = 1) nod = dreapta(nod) // avansez in arbore
Altfel nod = stnga(nod)
Scrie (out, cheie(nod)) // am determinat caracterul si l scriu la
// ieire
14
Proiectarea Algoritmilor 2010
Demonstraie (I)
Arborele de codificare construit trebuie s
aib cost minim pentru a fi arbore Huffman.

Lema 1. Fie K mulimea cheilor dintr-un
arbore de codificare, card(K) 2, x, y dou
chei cu pondere minim. - un arbore
Huffman de nlime h in care cheile x i y
apar pe nivelul h fiind descendente ale
aceluiai nod intern.
15
Proiectarea Algoritmilor 2010
Demonstraie (II)
Demonstraie Lema 1:








Se interschimb a cu x i b cu y i din definiia
costului arborelui => cost(A) cost(A) cost(A)
=> A arbore Huffman
x
b a
y
A
a
b x
y
A
a
y x
b
A

e e
= =
K k K k
k p A k nivel k p k cod lg A Cost ) ( * ) , ( ) ( * ) ( _ ) (
16
Proiectarea Algoritmilor 2010
Demonstraie (III)
Lema 2. Fie A un arbore Huffman cu cheile K, iar x i y
dou chei direct descendente ale aceluiai nod intern a.
Fie K = K \ {x,y} U {z} unde z este o cheie fictiv cu
ponderea w(z) = w(x) + w(y). Atunci arborele A rezultat
din A prin nlocuirea subarborelui cu rdcina a si
frunzele x, y cu subarborele cu un singur nod care
conine frunza z, este un arbore Huffman cu cheile K.

Demonstraie:
1) analog Cost(A) Cost(A) (Cost(A) = Cost(A) + w(x) + w(y))
2) pp exist A a.i. Cost(A) < Cost(A) =>
Cost(A) < Cost(A) - (w(x) + w(y));
Cost(A) + w(x) + w(y) < Cost(A); => A nu este Huffman
(contradicie)
17
Proiectarea Algoritmilor 2010
Demonstraie (IV)
Teorem Algoritmul Huffman construiete un arbore
Huffman.

Demonstraie: prin inducie dup numrul de chei din
mulimea K.

n 2 => evident

n > 2
Ip. Inductiv: algoritmul Huffman construiete arbori Huffman
pentru orice mulime cu n-1 chei

Fie K = {k
1
, k
2
, , k
n
} a.i. w(k
1
) w(k
2
) w(k
n
)

18
Proiectarea Algoritmilor 2010
Demonstraie (V)
Cf. Lema 1, - Un arbore Huffman unde cheile k
1
, k
2
sunt pe
acelai nivel i descendente ale aceluiai nod.

A
n-1
arborele cu n-1 chei K = K - {k
1
,k
2
} z unde w(z) = w(k
1
)
+ w(k
2
).

A
n-1
rezult din A
n
prin modificrile prezentate in Lema 2 => A
n-1

este Huffman, i cf. ipotezei inductive e construit prin algoritmul
Huffman(K,p).

=> Algoritmul Huffman(K, p) construiete arborele format din k
1

si k
2
si apoi lucreaz ca i algoritmul Huffman(K, p) ce
construiete A
n-1
=> construiete arborele Huffman(K, p).

19
Comparaie D&I i Greedy
Tip abordare
D&I: top-down;
Greedy: bottom-up.

Criteriu de optim
D&I: nu;
Greedy: da.

Proiectarea Algoritmilor 2010
Proiectarea Algoritmilor 2010
Alt exemplu (I)
Problema rucsacului
Trebuie s umplem un rucsac de capacitate
maxim M kg cu obiecte care au greutatea
m
i
i valoarea v
i
. Putem alege mai multe
obiecte din fiecare tip cu scopul de a
maximiza valoarea obiectelor din rucsac.
Varianta 1: putem alege fraciuni de obiect
problema continu
Varianta 2: nu putem alege dect obiecte ntregi
(numr natural de obiecte din fiecare tip)
problema 0-1
Proiectarea Algoritmilor 2010
Alt exemplu (II)
Varianta 1: Algoritm Greedy
sortm obiectele dup raportul v
i
/m
i
;
adugm fraciuni din obiectul cu cea mai mare valoare per kg pn
epuizm stocul i apoi adugm fraciuni din obiectul cu valoarea
urmtoare.
Exemplu: M = 10; m
1
= 5 kg, v
1
= 10, m
2
= 8 kg, v
2
= 19, m
3
= 4 kg, v
3
= 4
Soluie: (m
2,
,

v
2
) 8kg i 2kg din (m
1
,v
1
) valoarea total: 19 + 2 * 10 / 5 =
23

Varianta 2: Algoritmul Greedy nu funcioneaz => contraexemplu
Exemplu: M = 10; m
1
= 5 kg, v
1
= 10, m
2
= 8 kg, v
2
= 19, m
3
= 4 kg, v
3
= 4
Rezultat corect 2 obiecte (m
1
,v
1
) valoarea total: 20
Rezultat algoritm Greedy 1 obiect (m
2
,v
2
) valoarea total: 19
Proiectarea Algoritmilor 2010
Problema are proprietatea de
substructur optim
soluia problemei conine soluiile
subproblemelor.

Problema are proprietatea alegerii locale
alegnd soluia optim local se ajunge la
soluia optim global.
Cnd funcioneaz algoritmii Greedy? (I)
Proiectarea Algoritmilor 2010
Cnd funcioneaz algoritmii Greedy?
(II)
Fie E o mulime finit nevid i I c P(E) a.i. C e I, X _ Y i Y I => X I.
Atunci spunem c (E,I) este un sistem accesibil.

Submulimile din I sunt numite submulimi independente.

Exemple:
Ex1: E = {e
1
, e
2
, e
3
} si I = {C, {e
1
}, {e
2
}, {e
3
}, {e
1
, e
2
}, {e
2
, e
3
}} mulimile ce nu conin e
1

si e
3
.


Ex2: E muchiile unui graf neorientat i I mulimea mulimilor de muchii ce nu conin
un ciclu (mulimea arborilor).

Ex3: E set de vectori dintr-un spaiu vectorial, I mulimea mulimilor de vectori linear
independeni.

Ex4: E muchiile unui graf neorientat i I mulimea mulimilor de muchii n care oricare
2 muchii nu au un vrf comun.
Proiectarea Algoritmilor 2010
Un sistem accesibil este un matroid dac
satisface proprietatea de interschimbare:
X, Y I i |X| < |Y| => -e e Y \ X a.i. X {e} I

Teorem. Pentru orice subset accesibil
(E, I) algoritmul Greedy rezolv problema
de optimizare dac i numai dac (E, I)
este matroid.
Cnd funcioneaz algoritmii Greedy?
(III)
Proiectarea Algoritmilor 2010
Verificm exemplele
Ex1: I = {C, {e
1
}, {e
2
}, {e
3
}, {e
1
, e
2
}, {e
2
, e
3
}}
Fie Y = {{e
1
}, {e
2
}, {e
3
}, {e
1
, e
2
}} si X = {{e
1
}, {e
3
}}
Y \ X = {{e
2
}, {e
1
, e
2
}} X {e
2
} I matroid

Ex4:
3
3
2
2
2
2
2
2
A B C
D E
F
3
3
2
2
2
2
2
2
A B C
D E
F
3
3
2
2
2
2
2
2
A B C
D E
F
Proiectarea Algoritmilor 2010
Algoritmul Greedy

Algoritmul generic Greedy devine:
X = C
sorteaz elementele din E n ordinea
descresctoare a ponderii
Pentru fiecare element e e E (sortat) Repet
X = X {e} dac i numai dac (X {e}) I
ntoarce X
Greedy tema de gndire
Se d un numr natural n. S se gseasc cel mai mare
subset S din {1, 2, ..., n} astfel nct nici un element din S
s nu fie divizibil cu nici un alt element din S.

n plus, dac exist mai multe subseturi maximale ce
respect proprietatea de mai sus, s se determine
ntotdeauna cel mai mic din punct de vedere lexicografic.

S este lexicografic mai mic dect T dac cel mai mic
element care este membru din S sau T, dar nu din
amndou, face parte din S.
Proiectarea Algoritmilor 2010