Documente Academic
Documente Profesional
Documente Cultură
11. Analiza algoritmilor recursivi. Relaţii de ∈ O(n2 | n este o putere a lui 2). execuţie pentru procedura MERGE este Θ(n).
recurenţă 15. Metoda master de rezolvare a recurenţelor.
Teorema master.
Când un algoritm conţine o apelare recursivă la
Metoda master furnizează o „reţetă” pentru
el însuşi, timpul său de execuţie poate fi descris
rezolvarea recurenţelor de forma T(n)= aT(n/b)
adesea printr-o recurenţă. O recurenţă este o 17. Tehnica Greedy
+ f(n) unde a 1 şi b>1sunt constante, iar f(n)
ecuaţie sau o inegalitate care descrie întregul este o funcţie asimptotic pozitivă.
timp de execuţie al unei probleme de Algoritmii greedy (greedy = lacom) sunt în
`Teorema 5.1.1. (teorema master) Fie a 1 general simpli şi sunt folosiţi la probleme de
dimensiune n cu ajutorul timpilor de execuţie şi b>1 constante, fie f(n) o funcţie şi fie T(n)
pentru date de intrare de dimensiuni mici. optimizare, cum ar fi: să se găsească cea mai
definită pe întregii nenegativi prin recurenţă bună ordine de executare a unor lucrări pe
Vom nota cu T(n) timpul de execuţie al unei T(n)= aT(n/b) + f(n) unde interpretăm n/b fie
probleme de dimensiune n. Dacă dimensiunea calculator, să se găsească cel mai scurt drum
problemei este suficient de mică, de exemplu ca ⌊ n/b ⌋ fie ca ⌈n/b⌉ . Atunci T(n) poate într-un graf etc. În cele mai multe situaţii de
n c pentru o anumită constantă c, soluţia fi delimitată asimptotic după cum urmează. acest fel avem:
log a−ε o mulţime de candidaţi (lucrări de executat,
directă ia un timp constant de execuţie, pe 1. Dacă f ( n )=Ο ( n ) b
vârfuri ale grafului etc);
care îl vom nota cu Θ(1). pentru o anumită constantă >0, atunci o funcţie care verifică dacă o anumită mulţime
Să presupunem că divizăm problema în a de candidaţi constituie o soluţie posibilă, nu neapărat optimă, a
log ab
subprobleme, fiecare dintre acestea având T ( n ) =Θ ( n ) . problemei;
o funcţie care verifică dacă o mulţime de
log ab
dimensiunea de 1/b din dimensiunea problemei
2. Dacă f ( n )=Θ ( n ) , candidaţi este fezabilă, adică dacă este posibil să completăm
originale. Dacă D(n) este timpul necesar pentru această mulţime astfel încât să obţinem o soluţie posibilă, nu
log ab
a divide problema în suprobleme, iar C(n) este atunci T ( n ) =Θ ( n lg n ) . neapărat optimă, a problemei;
o funcţie de selecţie care indică la orice moment
log ab +ε
timpul necesar pentru a combina soluţiile 3. Dacă f ( n )=Ω ( n ) , care este cel mai promiţător dintre candidaţii încă nefolosiţi;
subproblemelor în soluţia problemei originale, o funcţie obiectiv care dă valoarea unei soluţii
pentru o anumită constantă >0 şi dacă (timpul necesar executării tuturor lucrărilor într-o anumită
obţinem recurenţa:
Θ (n) , n≤c
af ( n/b )≤cf ( n ) pentru o anumită
ordine, lungimea drumului pe care l-am găsit etc); aceasta este
T (n)=
{
aT
n
b()+ D ( n )+ C ( n ) , n>c
constantă c 1şi toţi n suficient de mari, atunci
T ( n ) =Θ ( f ( n ) ) .
funcţia pe care urmărim să o optimizăm
(minimizăm/maximizăm).
Pentru a rezolva problema de optimizare, se
caută o soluţie posibilă care să optimizeze valoarea
În fiecare dintre cele trei cazuri, comparăm funcţia f(n) cu
12. Recurenţe liniare omogene. Metoda funcţia nlogba. În primul caz, f(n) trebuie nu numai să fie
funcţiei obiectiv. Un algoritm greedy construieşte
ecuaţiilor caracteristice de rezolvare a mai mică decât nlogba, trebuie să fie polinomial mai mică. soluţia pas cu pas. La fiecare pas, se adaugă acestei
Adică f(n) trebuie să fie asimptotic mai mică decât nlogba cu mulţimi cel mai promiţător candidat, conform funcţiei
recurenţelor.
un factor n pentru o anumită constantă >0. În al treilea de selecţie. Dacă algoritmul greedy funcţionează
Vom considera recurenţe liniare omogene, caz, f(n) trebuie nu numai să fie mai mare decât nlogba, corect, prima soluţie găsită va fi totodată o soluţie
de forma a0tn + a1tn-1 + …+ aktn-k = 0 unde ti sunt trebuie să fie polinomial mai mare şi, în plus, să verifice optimă a problemei. Soluţia optimă nu este în mod
valorile pe care le căutăm, iar coeficienţii ai condiţia de „regularitate” af ( n/b )≤cf ( n )
. necesar unică: se poate că funcţia obiectiv să aibă
sunt constante. Este important de realizat că cele trei cazuri nu acoperă aceeaşi valoare optimă pentru mai multe soluţii
Vom căuta soluţii de forma tn = xn unde x toate posibilităţile pentru f(n). Există un gol între cazurile 1 şi 2 posibile. Funcţia de selecţie este de obicei derivată din
când f(n) este mai mic decât nlog ba dar nu polinomial mai mic. funcţia obiectiv; uneori aceste două funcţii sunt chiar
este o constanta (deocamdată necunoscută). Analog există un gol între cazurile 2 şi 3 când f(n) este mai mare identice
Încercăm aceasta soluţie în (5.2.1) şi obţinem decât nlog ba dar nu polinomial mai mare. Dacă funcţia f(n) cade
a0xn + a1xn-1 + ... + akxn-k = 0. într-unul dintre aceste goluri, sau când condiţia de regularitate
din cazul 3 nu este verificată, metoda master nu poate fi
Soluţiile acestei ecuaţii sunt fie soluţia utilizată pentru a rezolva recurenţa.
triviala x = 0, care nu ne interesează, fie soluţiile Exemplu: Metoda master nu se aplică recurenţei T(n)=
ecuaţiei a0xk + a1xk-1 + ... + ak = 0 care este 2T(n/2) + nlgn, chiar dacă are forma potrivită: a=2, b=2, f(n)=
nlgn şi nlogba = n. Se pare că ar trebui să se aplice cazul 3,
ecuaţia caracteristica a recurenţei (1.4.2). deoarece f(n)= nlgn este asimptotic mai mare decât nlogba = n,
Presupunând deocamdată ca cele k rădăcini r1, dar nu polinomial mai mare. Raportul f(n)/nlogba = (nlgn)/n este
r2, ..., rk ale acestei ecuaţii caracteristice sunt asimptotic mai mic decât n pentru orice constantă pozitivă .
În consecinţă, recurenţa cade în golul dintre cazurile 2 şi 3
distincte, orice combinaţie liniară
k 16. Metoda divide si stapineste
t n=∑ c i r ni Unul din avantajele algoritmilor de tipul
i=1 este o soluţie a recurenţei divide şi stăpîneşte este acela că timpul lor de
(5.2.1), unde constantele c1, c2, ..., ck sunt execuţie este adesea uşor de determinat
determinate de condiţiile iniţiale. folosind tehnici date mai sus. Aceşti algoritmi
folosesc de obicei o abordare de tipul divide şi
13. Recurenţe liniare neomogene stăpîneşte: ei rup problema de rezolvat în mai
Consideram acum recurenţe de multe probleme similare problemei iniţiale, dar
următoarea formă mai generală a0tn + a1tn-1 + ... de dimensiune mai mică, le rezolvă în mod
+ aktn-k = bnp(n) unde b este o constantă, iar recursiv şi apoi le combină pentru a crea o
p(n) este un polinom în n de grad d. Ideea soluţie a problemei iniţiale.
generala este că, prin manipulări convenabile, Paradigma divide şi stăpîneşte implică trei paşi la fiecare
nivel de recursivitate:
să reducem un astfel de caz la o formă Divide problema într-un număr de subprobleme.
omogenă. Stăpîneşte subproblemele prin rezolvarea acestora în
mod recursiv. Dacă dimensiunile acestora sunt suficient de mici,
14. Metoda schimbării variabilei. rezolvă subproblemele în mod uzual, nerecursiv.
Combină soluţiile tuturor subproblemelor în soluţia
Uneori, printr-o schimbare de variabilă,
finală pentru problema iniţială.
putem rezolva recurenţe mult mai complicate. 1.1. Sortarea prin interclasare.
În exemplele care urmează, vom nota cu T(n) Algoritmul de sortare prin interclasare urmează
termenul general al recurenţei şi cu tk termenul îndeaproape paradigma divide şi stăpîneşte. Intuitiv acesta
operează astfel:
noii recurenţe obţinute printr-o schimbare de Divide: Împarte şirul de n elemente care urmează a fi
variabilă. Presupunem pentru început ca n este sortat in două subşiruri de câte n/2 elemente. Stăpîpneşte:
o putere a lui 2. Sortează recursiv cele două subşiruri utilizînd sortarea prin
interclasare. Combină: Interclasează cele două subşiruri sortate
Fie recurenţa T(n) = 4T(n/2) + n, n > 1 în pentru a produce rezultatul final.
care înlocuim pe n cu 2k, notăm tk = T(2k) = T(n) Din punctul de vedere al timpului de
şi obţinem tk = 4tk-1 + 2k. Ecuaţia caracteristică a execuţie, fiecare pas de bază durează un timp
acestei recurenţe liniare este (x-4)(x-2) = 0 cu constant, deoarece comparăm de fiecare dată
rşi deci, tk = c14k + c22k. Înlocuim la loc pe k cu lg doar două cărţi. Deoarece avem de făcut cel
18. Arbori parţiali de cost minim.
Fie G = <V, M> un graf neorientat conex, unde V
este mulţimea vârfurilor şi M este mulţimea muchiilor. Fiecare 20. Arbori binari de interclasare. Algoritmul
muchie are un cost nenegativ (sau o lungime nenegativă).
Problema este să găsim o submulţime A M, astfel încât toate Huffman.
vârfurile din V să rămână conectate atunci când sunt folosite Codurile Huffman reprezintă o tehnică 21. Cele mai scurte drumuri care pleacă din
doar muchii din A, iar suma lungimilor muchiilor din A să fie cat foarte utilizată şi eficientă pentru compactarea acelaşi punct. Algoritmul Dijkstra.
mai mică. Căutăm deci o submulţime A de cost total minim.
datelor; în funcţie de caracteristicile fişierului Fie G = <V, M> un graf orientat, unde
Această problemă se mai numeşte şi problema conectării
care trebuie comprimat, spaţiul economisit este V este mulţimea vârfurilor şi M este mulţimea
oraşelor cu cost minim, având numeroase aplicaţii.
între 20% şi 90%. Algoritmul greedy pentru muchiilor. Fiecare muchie are o lungime
Graful parţial <V, A> este un arbore şi este numit nenegativa. Unul din vârfuri este ales că vârf
realizarea acestei codificări utilizează un tabel
arborele parţial de cost minim al grafului G (minimal spanning sursă. Problema este de a determina lungimea
tree). Un graf poate avea mai mulţi arbori parţiali de cost cu frecvenţele de apariţie ale fiecărui caracter.
celui mai scurt drum de la sursă către fiecare
minim. Vom prezenta doi algoritmi greedy care determină Ideea este de a utiliza o modalitate optimă vârf din graf.
arborele parţial de cost minim al unui graf. În terminologia
pentru reprezentarea fiecărui caracter sub Se spune, că un drum de la sursă câtre
metodei greedy, vom spune că o mulţime de muchii este o
soluţie, dacă constituie un arbore parţial al grafului G, şi este forma unui şir binar. un alt vârf este special, dacă toate vârfurile
fezabila, dacă nu conţine cicluri. O mulţime fezabilă de muchii Sa presupunem că avem un fişier ce conţine 100.000 de
este promiţătoare, dacă poate fi completată pentru a forma caractere, pe care dorim să îl memorăm într-o formă intermediare de-a lungul drumului aparţin lui S
soluţia optimă. O muchie atinge o mulţime dată de vârfuri, dacă compactată. Frecvenţele de apariţie ale caracterelor în text (numarul de virfuri).
exact un capăt al muchiei este în mulţime. Mulţimea iniţiala a sunt date de figura 2.2: există doar şase caractere diferite şi Proprietatea 3. În algoritmul lui
candidaţilor este M. Cei doi algoritmi greedy aleg muchiile una fiecare dintre ele apare de 45.000 de ori.
Vom considera problema proiectării unui cod binar al Dijkstra, dacă un vârf i
cate una intr-o anumita ordine, această ordine fiind specifică
fiecărui algoritm. caracterelor (pe scurt cod) astfel încât fiecare caracter este a) este în S, atunci D[i] dă lungimea celui mai
reprezentat printr-un şi binar unic. Dacă utilizăm un cod de scurt drum de la sursă câtre i;
lungime fixă, avem nevoie de 3 biţi pentru a reprezenta şase b) nu este în S, atunci D[i] dă lungimea celui
Algoritmul Kruskal. caractere: a=000,b=001, ...,f=101. Această metodă
Arborele parţial de cost minim poate fi necesită 300.000 de biţi pentru a codifica tot fişierul. Se pune
mai scurt drum special de la sursă câtre i.
construit muchie, cu muchie, după următoarea problema dacă se poate face o compactare şi mai bună. La terminarea algoritmului, toate
metoda a lui Kruskal (1956): se alege întâi muchia de O codificare cu lungime variabilă poate vârfurile grafului, cu excepţia unuia, sunt în S.
cost minim, iar apoi se adaugă repetat muchia de cost îmbunătăţi semnificativ performanţele, Din proprietatea precedenta, rezulta că
minim nealeasă anterior şi care nu formează cu algoritmul lui Dijkstra funcţionează corect.
precedentele un ciclu.
atribuind caracterelor cu frecvenţe mai mari
cuvinte de cod mai scurte iar celor cu frecvenţe . Iniţializarea necesita un timp în O(n).
Proprietatea 1. În algoritmul lui Alegerea lui v din bucla repeat presupune
Kruskal, la fiecare pas, graful parţial <V, A> mai reduse cuvinte de cod mai lungi.
parcurgerea tuturor vârfurilor conţinute în C la
formează o pădure de componente conexe, în Huffman a inventat un algoritm greedy
iteraţia respectivă, deci a n1, n2, ..., 2 vârfuri,
care fiecare componentă conexă este la rândul care construieşte o codificare prefix optimă
ceea ce necesită în total un timp în O(n2). Bucla
ei un arbore parţial de cost minim pentru numită codul Huffman. Algoritmul construieşte
for interioară efectuează n2, n3, ..., 1 iteraţii,
vârfurile pe care le conectează. În final, se arborele corespunzător codificării optime, într-
totalul fiind tot în O(n2). Rezulta că algoritmul
o manieră "bottom-up". Se începe cu o mulţime de | C|
obţine arborele parţial de cost minim al grafului
frunze şi se realizează o secvenţă de | C | -1 operaţii de
Dijkstra necesita un timp în O(n2). Timpul se
G. interclasare pentru a crea arborele final. poate îmbunătăţi, dacă se vor folosi în locul
O(m log m) pentru a sorta muchiile. Deoarece m n(n–1)/2, În algoritmul care urmează, vom presupune că C este o matricei de adiacenţă liste de adiacenţă.
rezulta O(m log m) O(m log n). Mai mult, graful fiind conex, mulţime de n caractere şi fiecare caracter c C este un obiect Este uşor de observat că, într-un graf G
din n1 m rezulta şi O(m log n) O(m log m), deci având o frecvenţă dată f[c]. Va fi folosită o coadă de priorităţi
O(m log m) = O(m log n). pentru a identifica cele două obiecte cu frecvenţa cea mai
neorientat conex, muchiile celor mai scurte
O(n) pentru a iniţializa cele n mulţimi disjuncte. redusă care vor fuziona. Rezultatul interclasării celor două drumuri de la un vârf i la celelalte vârfuri
Cele cel mult 2m operaţii find3 şi n–1 operaţii merge3 obiecte este un nou obiect a cărui frecvenţă este suma formează un arbore parţial al celor mai scurte
necesita un timp în O((2mn1) lg* n). Deoarece frecvenţelor celor două obiecte care au fost interclasate. drumuri pentru G. Desigur, acest arbore depinde
O(lg* n) O(log n) şi n1 m, acest timp este şi în O(m log n).
O(m) pentru restul operaţiilor.
de alegerea rădăcinii i şi el diferă, în general, de
Algoritmul Prim arborele parţial de cost minim al lui G.