![]() | |
![]() |
![]() ![]() |
Politica de confidentialitate |
|
![]() | |
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
![]() |
![]() |
||||||
Analiza algoritmilor recursivi | ||||||
![]() |
||||||
|
||||||
y6h15hj Am vazut in exemplul precedent cat de puternica si, in acelasi timp, cat de eleganta este recursivitatea in elaborarea unui algoritm. Nu vom face o introducere in recursivitate si nici o prezentare a metodelor de eliminare a ei. Cel mai important castig al exprimarii recursive este faptul ca ea este naturala si compacta, fara sa ascunda esenta algoritmului prin detaliile de implementare. Pe de alta parte, apelurile recursive trebuie folosite cu discernamant, deoarece solicita si ele resursele calculatorului (timp si memorie). Analiza unui algoritm recursiv implica rezolvarea unui sistem de recurente. Vom vedea in continuare cum pot fi rezolvate astfel de recurente. Incepem cu tehnica cea mai banala. 5.3.1 Metoda iteratiei Cu putina experienta si intuitie, putem rezolva de multe ori astfel de recurente prin metoda iteratiei: se executa primii pasi, se intuieste forma generala, iar apoi se demonstreaza prin inductie matematica ca forma este corecta. Sa consideram de exemplu recurenta problemei turnurilor din Hanoi. Pentru un anumit n > 1 obtinem succesiv t(n) = 2t(n-1) + 1 = 22t(n-2) + 2 + 1 = … = 2n-1t(1) + t Rezulta t(n) = 2n-1. Prin inductie matematica se demonstreaza acum cu usurinta ca aceasta forma generala este corecta. 5.3.2 Inductia constructiva Inductia matematica este folosita de obicei ca tehnica de demonstrare a unei asertiuni deja enuntate. Vom vedea in aceasta sectiune ca inductia matematica poate fi utilizata cu succes si in descoperirea enuntului asertiunii. Aplicand aceasta tehnica, putem simultan sa demonstram o asertiune doar partial specificata si sa descoperim specificatiile care lipsesc si datorita carora asertiunea este corecta. Vom vedea ca aceasta tehnica a inductiei constructive este utila pentru rezolvarea anumitor recurente care apar in contextul analizei algoritmilor. Incepem cu un exemplu. Fie functia f : N ® N, definita prin recurenta Sa presupunem pentru moment ca nu stim ca f (n) = n(n+1)/2 si sa cautam o astfel de formula. Avem si deci, f (n) I O(n2). Aceasta ne sugereaza sa formulam ipoteza inductiei
specificate partial IISP(n) conform careia f este de forma f (n) = an2+bn+c.
Aceasta ipoteza este partiala, in sensul ca a, b si c nu sunt inca cunoscute.
Tehnica inductiei constructive consta in a demonstra prin inductie matematica
aceasta ipoteza incompleta si a determina in acelasi timp valorile constantelor
necunoscute a, b si c. este o solutie a recurentei (*), unde constantele c1, c2, ..., ck sunt determinate de conditiile initiale. Este remarcabil ca (*) are numai solutii de aceasta forma. Sa exemplificam prin recurenta care defineste sirul lui Fibonacci (din Sectiunea 1.6.4): tn = tn-1 + tn-2 n ³ 2 iar t0 = 0, t1 = 1. Putem sa rescriem aceasta recurenta sub forma tn - tn-1 - tn-2 = 0 care are ecuatia caracteristica x2 - x - 1 = 0 cu radacinile r1,2 = (1 )/2. Solutia generala are forma Impunand conditiile initiale, obtinem c1 + c2 = 0 n = 0 r1c1 + r2c2 = 1 n = 1 de unde determinam c1,2 = Ce facem insa atunci cand radacinile ecuatiei caracteristice nu sunt distincte? Se poate arata ca, daca r este o radacina de multiplicitate m a ecuatiei caracteristice, atunci tn = rn, tn = nrn, tn = n2rn, ..., tn = nm-1rn sunt solutii pentru (*). Solutia generala pentru o astfel de recurenta este atunci o combinatie liniara a acestor termeni si a termenilor proveniti de la celelalte radacini ale ecuatiei caracteristice. Din nou, sunt de determinat exact k constante din conditiile initiale. Vom da din nou un exemplu. Fie recurenta tn = 5tn-1 - 8tn-2 + 4tn-3 n ³ 3 iar t0 = 0, t1 = 1, t2 = 2. Ecuatia caracteristica are radacinile 1 (de multiplicitate
1) si 2 (de multiplicitate 2). Solutia generala este: tn = c11n + c22n + c3n2n De exemplu, o astfel de recurenta poate fi: tn - 2tn-1 = 3n Generalizand acest procedeu, se poate arata ca, pentru a rezolva (**), este
suficient sa luam urmatoarea ecuatie caracteristica: Vom rezolva acum recurenta corespunzatoare problemei turnurilor din Hanoi: tn = 2tn-1 + 1 n ³ 1 iar t0 = 0. Rescriem recurenta astfel tn - 2tn-1 = 1 care este de forma (**) cu b = 1 si p(n) = 1, un polinom de grad 0. Ecuatia
caracteristica este atunci (x-2)(x-1) = 0, cu solutiile 1 si 2. Solutia generala
a recurentei este: tn = c11n + c22n Din conditiile initiale, obtinem tn = 2n - 1 Daca ne intereseaza doar ordinul lui tn, nu este necesar sa calculam efectiv constantele in solutia generala. Daca stim ca tn = c11n + c22n, rezulta tn I O(2n). Din faptul ca numarul de mutari a unor discuri nu poate fi negativ sau constant, deoarece avem in mod evident tn ³ n, deducem ca c2 > 0. Avem atunci tn I W(2n) si deci, tn I Q(2n). Putem obtine chiar ceva mai mult. Substituind solutia generala inapoi in recurenta initiala, gasim 1 = tn - 2tn-1 = c1 + c22n - 2(c1 + c22n-1) = -c1 Indiferent de conditia initiala, c1 este deci -1. 5.3.5 Schimbarea variabilei Uneori, printr-o schimbare de variabila, putem rezolva recurente mult mai complicate. In exemplele care urmeaza, vom nota cu T(n) termenul general al recurentei si cu tk termenul noii recurente obtinute printr-o schimbare de variabila. Presupunem pentru inceput ca n este o putere a lui 2. Un prim exemplu este recurenta Un al doilea exemplu il reprezinta ecuatia In fine, sa consideram si exemplul In toate aceste exemple am folosit notatia asimptotica conditionata. Pentru
a arata ca rezultatele obtinute sunt adevarate pentru orice n, este suficient
sa adaugam conditia ca T(n) sa fie eventual nedescrescatoare. Aceasta, datorita
Proprietatii 5.1 si a faptului ca functiile n2, n log n si nlg 3 sunt netede. Proprietatea 5.2 Fie T : N ® R+ o functie eventual nedescrescatoare 5.4 Exercitii 5.2 Presupunand ca f este strict pozitiva pe N, demonstrati ca definitia lui
O( f ) este echivalenta cu urmatoarea definitie: 5.3 Demonstrati ca relatia “I O” este tranzitiva: daca f I O(g) si g I O(h), atunci f I O(h). Deduceti de aici ca daca g I O(h), atunci O(g) I O(h). 5.4 Pentru oricare doua functii f, g : N ® R*, demonstrati ca: i) O( f ) = O(g) Û f I O(g) si g I O( f ) ii) O( f ) I O(g) Û f I O(g) si g I O( f ) 5.5 Gasiti doua functii f, g : N ® R*, astfel incat f I O(g) si g
I O( f ). 5.6 Pentru oricare doua functii f, g : N ® R* definim urmatoarea relatie
binara: f £ g daca O( f ) I O(g). Demonstrati ca relatia “£”
este o relatie de ordine partiala in multimea functiilor definite pe N si cu
valori in R*. 5.7 Pentru oricare doua functii f, g : N ® R* demonstrati ca 5.8 Fie f (n) = amnm+…+a1n + a0 un polinom de grad m, cu am > 0. Aratati ca f I O(nm). 5.9 O(n2) = O(n3+(n2-n3)) = O(max(n3, n2-n3)) = O(n3) 5.10 Gasiti eroarea in urmatorul lant de relatii: 5.11 Fie f , g : N ® R+. Demonstrati ca: i) I R+ Þ O( f ) = O(g) ii) = 0 Þ O( f ) I O(g) 5.12 Folosind regula lui l’Hôspital si Exercitiile 5.4, 5.11, aratati
ca log n I O( ), dar I O(log n) 5.13 Pentru oricare f, g : N ® R*, demonstrati ca: f I O(g) Û g I W( f ) 5.14 Aratati ca f I Q(g) daca si numai daca 5.15 Demonstrati ca urmatoarele propozitii sunt echivalente, pentru oricare doua functii f, g : N ® R*. i) O( f ) = O(g) ii) Q( f ) = Q(g) iii) f I Q(g) 5.16 Continuand Exercitiul 5.11, aratati ca pentru oricare doua functii f, g : N ® R+ avem: i) I R+ Þ f I Q(g) ii) = 0 Þ f I O(g) dar f I Q(g) iii) = +¥ Þ f I W(g) dar f I Q(g) 5.17 Demonstrati urmatoarele afirmatii: i) logan I Q(logbn) pentru oricare a, b > 1 ii) I Q(nk+1) pentru oricare k I N iii) I Q(log n) iv) log n! I Q(n log n) unde e = 1,71828... . 5.18 Aratati ca timpul de executie al unui algoritm este in Q(g), g : N ® R*, daca si numai daca: timpul este in O(g) pentru cazul cel mai nefavorabil si in W(g) pentru cazul cel mai favorabil. 5.19 Pentru oricare doua functii f, g : N ® R* demonstrati ca 5.20 Demonstrati Proprietatea 5.1. Aratati pe baza unor contraexemple ca cele doua conditii “t(n) este eventual nedescrescatoare” si “f (bn) I O( f (n))” sunt necesare. 5.21 Analizati eficienta urmatorilor patru algoritmi: for i 1 to n do for i 1 to n do for j 1 to 5 do for j 1 to i+1 do 5.22 Construiti un algoritm cu timpul in Q(n log n). 5.23 Fie urmatorul algoritm k 0 for i 1 to n do for j 1 to Taii do k k+Ta ji unde T este un tablou de n intregi nenegativi. In ce ordin este timpul de executie
al algoritmului? 5.24 Pentru un tablou Ta1 .. ni, fie urmatorul algoritm de sortare: for i n downto 1 do for j 2 to i do if Ta j-1i > Ta ji then interschimba Ta j-1i si Ta ji 5.25 Fie urmatorul algoritm for i 0 to n do j i 5.26 Demonstrati ca pentru oricare intregi pozitivi n si d Solutie: Mai ramane sa aratati ca 5.27 Analizati algoritmii percolate si sift-down pentru cel mai nefavorabil caz, presupunand ca opereaza asupra unui heap cu n elemente.Indicatie: In cazul cel mai nefavorabil, algoritmii percolate si sift-down necesita un timp in ordinul exact al inaltimii arborelui complet care reprezinta heap-ul, adica in Q(ëlg nû) = Q(log n). 5.28 Analizati algoritmul slow-make-heap pentru cel mai nefavorabil caz. C(n) £ (n-1) ëlg nû I O(n log n) Pe de alta parte, avem C(n) = ëlg iû > (lg i - 1) = lg n! - (n-1) In Exercitiul 5.17 am aratat ca lg n! I W(n log n). Rezulta C(n) I W(n log n) si timpul este deci in Q(n log n). 5.29 Aratati ca, pentru cel mai nefavorabil caz, timpul de executie al algoritmului heapsort este si in W(n log n), deci in Q(n log n). 5.30 Demonstrati ca, pentru cel mai nefavorabil caz, orice algoritm de sortare
prin comparatie necesita un timp in W(n log n). In particular, obtinem astfel,
pe alta cale, rezultatul din Exercitiul 5.29. 5.31 Analizati algoritmul heapsort pentru cel mai favorabil caz. Care este cel mai favorabil caz? 5.32 Analizati algoritmii fib2 si fib3 din Sectiunea 1.6.4. 5.33 Rezolvati recurenta tn - 3tn-1 - 4tn-2 = 0, unde n ³ 2, iar t0 = 0, t1 = 1. 5.34 Care este ordinul timpului de executie pentru un algoritm recursiv cu
recurenta tn = 2tn-1 + n. 5.35 Scrieti o varianta recursiva a algoritmului de sortare prin insertie si
determinati ordinul timpului de executie pentru cel mai nefavorabil caz. 5.36 Determinati prin schimbare de variabila ordinul timpului de executie pentru
un algoritm cu recurenta T(n) = 2T(n/2) + n lg n, unde n > 1 este o putere
a lui 2. 5.37 Demonstrati Proprietatea 5.2, folosind tehnica schimbarii de variabila. |
||||||
![]() |
||||||
![]() |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2025 | Trimite document | Harta site | Adauga in favorite |
![]() |
|