Divide Et Impera
Divide Et Impera
Divide Et Impera
Prezentare general:
Divide et impera se bazeaz pe principiul descompunerii problemei n dou sau mai
multe subprobleme (mai uoare), care se rezolv, iar soluia pentru problema iniial se
obine combinnd soluiile subproblemelor. De multe ori, subproblemele sunt de acelai tip
i pentru fiecare din ele se poate aplica aceeai tactic a descompunerii n (alte)
subprobleme, pn cnd (n urma descompunerilor repetate) se ajunge la probleme care
admit rezolvare imediat.
Nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici. Se poate afirma c
numrul celor rezolvabile prin "divide et impera" este relativ mic, tocmai datorit cerinei ca
problema s admit o descompunere repetat.
Divide et impera este o tehnic ce admite o implementare recursiv. Principiul
general prin care se elaboreaz algoritmi recursivi este: "ce se ntmpl la un nivel, se
ntmpl la orice nivel" (avnd grij s asigurm condiiile de terminare). Aadar, un algoritm
prin divide et impera se elaboreaz astfel: la un anumit nivel avem dou posibiliti:
s-a ajuns la o problem care admite o rezolvare imediat (condiia de terminare), caz
n care se rezolv i se revine din apel;
nu s-a ajuns n situaia de la punctul 1, caz n care problema curent este descompus
n (dou sau mai multe) subprobleme, pentru fiecare din ele urmeaz un apel
recursiv al funciei, dup care combinarea rezultatelor are loc fie pentru fiecare
subproblem, fie la final, naintea revenirii din apel.
Aplicaii
Maximul dintr-un vector
Se citete un vector cu n componente, numere naturale. Se cere s se tipreasc valoarea
maxim.
Funcia cutat va genera valoarea maxim dintre numerele reinute n vector pe o poziie
dintre i i j (iniial, i=1, j=n). Pentru aceasta, se procedeaz astfel:
Cutare binar
Se citete un vector cu n componente numere ntregi (numerele se presupun ordonate
cresctor) i o valoare ntreag ("nr"). S se decid dac nr se gsete sau nu printre
numerele citite, iar n caz afirmativ s se tipreasc indicele componentei care conine
aceast valoare.
O rezolvare n care nr se compar pe rnd cu toate cele n componente reperzint o
pierdere de performan (nu exploateaz faptul c cele n valori sunt n secven
cresctoare). Algoritmul care va fi propus este optim i se poate spune c face parte dintre
algoritmii "clasici".