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
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