160 likes | 425 Vues
Cursul 5. Paradigma algoritmilor “greedy” Prezentarea generala a paradigmei Studii de caz memorarea programelor rucsac (varianta continua) arbori Huffman arborele partial de cost minim. Algoritmi “greedy” - ingrediente. probleme de optim proprietatea de alegere locala (“greedy”)
E N D
Cursul 5 • Paradigma algoritmilor “greedy” • Prezentarea generala a paradigmei • Studii de caz • memorarea programelor • rucsac (varianta continua) • arbori Huffman • arborele partial de cost minim
Algoritmi “greedy” - ingrediente • probleme de optim • proprietatea de alegere locala (“greedy”) • solutia de optim global poate fi obtinuta facind alegeri optime locale (“greedy”) • alegerea optima locala curenta poate depinde de alegerile de pina atunci dar nu si de cele viitoare • trebuie demonstrat ca alegerile optime locale conduc la obtinerea optimului global • proprietatea de substructura optima • solutia optima a problemei contine solutiile optime ale subproblemelor
Algoritmi “greedy” – o prima formalizare • S – o multime de intrari • C(S) • obiectele din C(S) sunt submultimi ale lui S • operatii: X {x}, X – {x} • Problema • Intrare: S, f : C(S) R • Iesire: B obiect maximal din C(S) care optimizeaza f • B este construita incremental • Alegerea locala • alege x a. i. B {x} C(S) • x defineste un optim local • proprietatea de substructura optima • fie x primul ales de alg. greedy • solutia problemei initiale include solutia subproblemei coresp. lui S’ = S – {x}, C(S’) = {B S’ | B {x} C(S)}, f restrictionata la C(S’)
Memorarea eficienta a programelor - formulare • instanta • n obiecte 0,1, ..., n-1 de marimi (lungimi) L0, L1 , ..., Ln-1 • presupunem cele n obiecte asezate intr-o lista liniara in ordinea ((0), ..., (n-1)) • timpul de regasire a obiectului de pe pozitia k este t(k) = i=0,k L(i) • timpul mediu de regasire este TM() = 1/nk=0,n-1t(k) • iesire • o asezare a obiectelor in lista a.i. timpul mediu de regasire sa fie minim
Memorarea eficienta a programelor – algoritm “greedy” • exemplu • L = (40, 10, 60, 30) • TM(id) = (40 + 50 + 110 + 140)/4 = 340/4 = 85 • = (1, 3, 0, 2) • TM() = (10 + 40 + 80 + 140) = 270/4 < 85 • algoritm “greedy”: alege la pasul curent un obiect neales inca de lungime minima • alegerea “greedy” duce la obtinerea optimului global • o permutarea a.i. i < j si L(i) > L(j) • ’ = (i,j) ( inmultit cu transpozitia (i,j)) • TM(’) < TM() • rezulta ca este optima daca (i,j) i < j L(i) L(j) • permutarea calculata de alg. greedy satisface ac. prop. • proprietatea de substructura optima (?) • timp: O(n log n) • spatiu suplimentar: O(1)
Memorarea eficienta a programelor – algoritm “greedy”, formal • S = {(i,j) | 0 i, j < n} • X C(S) daca: ((i,j), (i’,j’) X) i = i’ j = j’ • alegerea locala: • (k, i) a.i. k este prima pozitie libera si L(i) minim peste obiectele nealese • B B {(k,i)} • in final B descrie permutarea care ordoneaza obiectele crescator dupa marime • proprietatea de substructura optima • permutarea “include” permutarea ce ordoneaza crescator dupa marime obiectele {0,1,…,n-1} – (0) (eliminarea celui mai mic obiect)
Problema rucsacului (varianta continua): formulare • instanta: • n obiecte 0, 1, ..., n-1 de dimensiuni (greutati) w0, w1, ..., wn-1 • un rucsac de capacitate M • introducerea in rucsac a unei parti fractionare xi din obiectul i aduce un profit xi pi • profitul total adus de alegerile x0, ..., xn-1 este i=0,n-1 xipi • iesire: • o alegere pentru care profitul adus este maxim
Problema rucsacului: solutie “greedy” care nu-i OK • la pasul curent alege obiectul cu profitul pi cel mai mare • contraxemplu: • n = 3, p = (3, 4, 6), w = (6, 4, 8), M = 10 • profitul = 8 cu alegerea (0, ½, 1)
Problema rucsacului: solutie “greedy” OK • la pasul curent • alege obiectul ce aduce profit maxim pe unitatea de greutate (pi/wi) • daca este loc suficient in rucsac, obiectul se introduce in totalitate (xi = 1) • altfel obiectul este introdus partial (maxim din cit se poate, 0 xi < 1) si procesul de alegere se opreste • exemplu (continuare): • p/w = (3/6, 4/4, 6/8) • profitul = 17/2 cu alegerea (0, 1, 6/8) Teorema Solutia calculata de algoritmul “greedy” este optima • demonstratie • timp: O(n log n) • spatiu suplimentar: O(n)
Problema rucsacului: solutie “greedy”, formalizare • S = {(i,x) | 0 i < n, x [0,1]} • X C(S) daca: ((i,x), (i’,x’) X) i = i’ x = x’ (xwi | (i,x) X) M • alegerea locala: • (i, xi) a.i. i aduce profit maxim pe unitatea de greutate si x cantit maxima ce incape in rucsac • B B {(i, xi)} • proprietatea de substructura optima • solutia x include solutia x’corespunzatoare subproblemei P’ obtinuta din P prin eliminarea obiectului i cu profit maxim pe unitatea de greutate si M’ = M – wi
Coduri Huffman • Coduri liber (independent) de prefix optime • instanta • n mesaje M0, M1, ..., Mn-1 cu frecventele f0, f1, ..., fn-1 • cod(Mi) {0,1}*, i,j: i j cod(Mi) nu este prefix a lui cod(Mj) • lungimea medie a codificarii = 1/n i=0,n-1 (|cod(Mi)|fi) • iesire • o codificare cu lungimea medie minima
Coduri Huffman: reprezentarea unei codificari ca arbore 0 1 1 1 0 0 2 1 B 0 0 1 4 A 2 R 1 U 0 1 H • HARABABURA
Coduri Huffman: algoritm “greedy” f0 f1 fn-1 n1+ n2 n2 n1 n2 n1 • initial: n arbori cu un singur nod etichetati cu fi • pasul curent T1 T2 T1 T2 cu n1, n2 minime peste multimea radacinilor
Proprietati ale codurilor Huffman Lema Fie cod o codificare optima. Daca fi < fj atunci |cod(Mi)| |cod(Mj)| (mesajele cu frecvente mai mari au lungimile codurilor mai mici) • demonstratie Lema Orice codificare optima poate fi transformata intr-o codificare Huffman cu aceeasi lungime medie. • demonstratie
Coduri Huffman: algoritm “greedy”, formalizare • S – cea mai mica multime de arbori construita astfel: • fi S • T1, T2 S T1 T2 S • X C(S) daca: (T X) T = fi sau ( T1, T2 X) T = T1 T2 X este finita f(X) = max{suma_ponderata(T) | T S} • alegere locala B = B {T1 T2}, T1, T2 cu radacini minime in B • proprietatea de substructura optima • solutia problemei coresp. intrarii f0, f1, ..., fn-1 “include” solutia subproblemei coresp. intrarii f0 + f1, ..., fn-1, unde f0, f1 sunt minime
Coduri Huffman: implementare C = zona auxiliara A = min-heap cu radacinile B = noduri care nu-s radacini inf stg drp . . . 0 1 • initial cele n noduri se afla in heap-ul A • la pasul curent: • se extrag primele doua radacini n1 si n2 din heap-ul A • se introduce n1+n2 in heap-ul A • se adauga n1 si n2 la B • A se micsoreaza cu o unitate, B se mareste cu doua unitati, C scade cu o unitate • timp: O(n log n) • spatiu: O(n)