Sunteți pe pagina 1din 3

Divide et Impera

Prezentare generala
Divide et Impera este o tehnic special prin care se pot rezolva anumite probleme. Ca i backtracking, divide et
impera se bazeaz pe un principiu extrem de simplu: descompunem problema n dou sau mai multe subprobleme !mai
uoare", care se rezolv, iar solu#ia pentru problema ini#ial se ob#ine combin$nd solu#iile problemelor n care a %ost
descompus. &e presupune c %iecare din problemele n care a %ost descompus problema ini#ial, se poate descompune
n alte subprobleme, la %el cum a %ost descompus problema ini#ial. Procedeul se reia p$n c$nd !n urma
descompunerilor repetate" se a'unge la probleme care admit rezolvare imediat.
(vident, nu toate problemele pot %i rezolvate prin utilizarea acestei tehnici. )r teama de a grei, putem a%irma
c numrul lor este relativ mic, tocmai datorit cerin#ei ca problema s admit o descompunere repetat.
Divide et impera este o tehnic ce admite o implementare recursiv. *m nv#at principiul general prin care se
elaboreaz algoritmii recursivi: ce se nt$mpl la un nivel, se nt$mpl la orice nivel !av$nd gri' s asigurm condi#iile
de terminare". +ot aa, se elaboreaz un algoritm prin divide et impera: la un anumit nivel avem dou posibilit#i:
," am a'uns la o problem care admite o rezolvare imediat, caz n care se rezolv i se revine din apel !condi#ia
de terminare"-
." nu am a'uns n situa#ia de la punctul ,, caz n care descompunem problema n dou sau mai multe
subprobleme, pentru %iecare din ele reapelm procedura !%unc#ia", combinm rezultatele si revenim din apel.
/axim dintr0un vector
&e citete un vector cu n componente numere naturale. &e cere s se tipreasc valoarea maxim.
Problema de mai sus este binecunoscut. Cum o rezolvm utiliz$nd divide et impera1
+rebuie tiprita valoarea maxima dintre numerele re#inute n vector de la i la ' !ini#ial i2,, '2n", Pentru aceasta
procedm ast%el:
3 dac i2', valoarea maxim va %i v 4 i 5-
3 contrar vom mpr#i vectorul n doi vectori !primul vector va con#ine componentele de la i la !i6'" div ., al
doilea va con#ine componentele de la !i6'" div .6, la ', rezolvm subproblemele !a%lm maximul pentru %iecare din
ele" iar solu#ia problemei va %i data de valoarea maxima dintre rezultatele celor dou subprobleme.
program maxim-
var v:arra74,..,85 o% integer-
n,i:integer-
%unction max !i,' :integer": integer-
var a,b:integer-
begin
i% i2' then max:2v4i5 else begin a:2max!i, !i6'"div ."- b:2max!!i6'" div .6,,'"-
i% a9b then max:2a else max:2b- end-
end-
begin
:rite!;n2;"-readln!n"-
%or i:2, to n do begin :rite !;v4;,i, ;52;"- readln !v4i5 " end-
:riteln !;max2;, max !,,n""
end.
*lgoritmul prezentat este exclusiv didactic, n practic se pre%er algoritmul clasic.
Cutare binar
&e citete un vector cu n componente numere ntregi, unde numerele se presupun ordonate cresctor i o
valoare ntreag !nr". & se decid dac nr se gsete sau nu printre numerele citite, iar n caz a%irmativ s se tipreasc
indicele componentei care con#ine acea valoare.
< rezolvare n care nr se compar pe r$nd cu cele n valori, este lipsit de valoare !nu exploateaz %aptul c cele n
valori sunt n secven# cresctoare". *lgoritmul care va %i propus este mult mai per%ormant i %ace parte din algoritmii
clasici.
program ackermann-
t7pe stiva2arra7 4,..,88,,...5 o% integer-
var st: stiva- m,n,k:integer-
begin
,
:rite !;m2;" - readln !m"- :rite !;n2;"- readln !n"-
k:2,- st4k,,5:2m- st4k,.5:2n-
:hile k98 do i% !st4k,,5=98" and !st4k,.5=98" then begin
k:2k6,- st4k,,5:2 st4k0,, ,5- st4k,.5:2st4k0,,.50, end
else i% st4k,.528 then
begin st4k,,5:2st4k,,50,- st4k,.5:2, end
else begin k:2k0,- i% k98 then
begin st4k,,5:2st4k,,50,- st4k,.5:2st4k6,,.56, end
end- :riteln!;ac!;,m, ;, ;,n,;"2;,st4,,.56,"
end.
> m2., n2?@
Ca i la problema anterioar, este interesant de urmrit modul n care a %ost ridicat recursivitatea din de%ini#ie.
Cele dou variante sunt echivalente din punct de vedere al timpului de calcul, dar cea recursiv este de pre%erat pentru
simplitatea cu care a %ost scris programul.
:rite!;nr2;"- readln!nr"- caut!,,n"- end.
+urnurile din Aanoi
&e dau ? ti'e simbolice prin a, b, c. Pe ti'a a se gsesc discuri de diametre di%erite, aezate n ordine
descresctoare a diametrelor privite de 'os n sus. &e cere s se mute discurile respect$nd urmtoarele reguli:
3 la %iecare pas se mut un singur disc:
3 nu este permis s se aeze un disc cu diametrul mai mare peste un disc cu diametrul mai mic.
Bezolvare:
Dac n2, se %ace mutarea ab, adic se mut discul de pe ti'a a pe ti'a b. Dac n2. se %ac mutrile ac, ab, cb.
Cn cazul n care n9. problema se complic. Dotm cu A!n,a,b,c" irul mutrilor celor n discuri de pe ti'a a pe
ti'a b, utiliz$nd ca ti'a intermediar, ti'a c.
Con%orm strategiei DIEID( (+ I/P(B* ncercm s descompunem problema n alte dou subprobleme de
acelai tip, urm$nd apoi combinarea solu#iilor. Cn acest sens, observm c mutarea celor n discuri de pe ti'a a pe ti'a b,
utiliz$nd ca ti' intermediar ti'a c, este echivalent cu:
3 mutarea a n0, discuri de pe ti'a a pe ti'a c, utiliz$nd ca ti' intermediar ti'a b-
3 mutarea discului rmas pe ti'a b-
3 mutarea a n0, discuri de pe ti'a c pe ti'a b, utiliz$nd ca ti' intermediar ti'a a.
Parcurgerea celor trei etape permite de%inirea recursiv a irului A!n,a,b,c" ast%el:

>
=
=
, " , , , , ! , ", , , , , !
, ,
" , , , !
n daca a b c n H ab b c a n H
n daca ab
c b a n H
(xemple:
Pentru n2. avem:
A!.,a,b,c"2A!,,a,c,b",ab,A!,,c,b,a"2ac,ab,cb.
Pentru n2? avem:
A!?,a,b,c"2A!.,a,c,b",ab,A!.,c,b,a"2
A!,,a,b,c",ac,A!,,b,c,a",ab,A!,,c,a,b",cb,A!,,a,b,c"2ab,ac,bc,ab,ca,ab.
program hanoi-
var a,b,c:char- n:integer-
procedure han !n:integer-a,b,c:char"-
begin
i% n2l then :riteln !a,b"
else begin han!n0l,a,c,b"- :riteln!a,b"- han!n0l,c,b,a" end -
end-
begin :rite!;D2;"-readln!n"- a:2;a;- b:2;b;-c:2;c;- han!n,a,b,c"
end.
.
?