Sunteți pe pagina 1din 24

1

Paradigma Divide et Impera



Prezentarea general a
metodei





Studii de caz simple
1. Produs de n factori
2. Determinarea minimului dintre n
numere
3. Turnurile din Hanoi




Studii de caz complexe
1. Algoritmul de cutare binar
2. Algoritmi de sortare proiectai prin
metoda divide et impera:
- Algoritmul de sortare prin interclasare
- Algoritmul de sortare rapid
3. Determinarea rdcinilor unei ecuaii
4. Evaluarea polinoamelor


Studii de caz avansate

1. Problema plierilor
2. Dreptunghi de arie maxim
3. Generarea fractalilor
- Triunghiul lui Sierpinski
- Problema ptratului
4. Algoritmul lui Strassen de nmulire a
marticilor
5. Algoritm de nmulire a numerelor
foarte mari


Aplicaii propuse



Concluzii

2
Prezentare general

Paradigma "divide et impera" se poate aplica problemelor care
permit descompunerea lor n subprograme independente. Numele metodei
exprim concis aceast modalitate de rezolvare (divide et impera se poate
traduce prin mparte i stpnete) iar rezolvarea unei astfel de probleme
solicit trei faze:
Divide problema ntr-un numr de subprobleme independente,
similare preoblemei iniiale, de dimensiuni din ce n ce mai mici;
descompunerea subproblemelor se oprete la atingerea unor dimensiuni
care permit o rezolvare simpl;
Stpnete subproblemele prin rezolvarea acestora n mod recursiv.
Dac dimensiunile acestora snt suficient de mici, rezolv problemele n
mod uzual, nerecursiv;
Combin soluiile tuturor subproblemelor n soluia final pentru
problema iniial.
Modelul matematic:
P(n): problema de dimensiune n
baza
daca n s n0 atunci rezolva P prin metode elementare
divide-et-impera
divide P in a probleme P1(n1),...,Pa(na) cu na s n/b, b>1

rezolva P1(n1), ..., Pa(na) in aceeai maniera i obine


soluiile S1, ..., Sa

asambleaz S1, ..,Sa pentru a obine soluia S a problemei P



Paradigma divide-et-impera: algoritm
Pentru aceati algoritmi exist att implementarea recursiv ct i
iterativ, cea mai flexibil i cea mai utilizat fiind varianta recursiv.
pr ocedur e DivideEtImperaR(P, n, S)
begi n
i f (n <= n
0
)
t hen determina S prin metode elementare
el se imparte P in P1, ..., Pa
DivideEtImperaR(P1, S1)
......................
DivideEtImperaR(Pa, Sa)
Asambleaza(S1, ..., Sa, S)
end
3

Paradigma divide-et-impera: complexitate

Aceast paradigm conduce n general la un timp de calcul
polinomial.
Vom presupune c dimensiunea ni a subproblemei Pi satisface nisn/b,
unde b>1, n acest fel pasul de divizare reduce o subproblem la altele de
dimensiuni mai mici, ceea ce sigur proprietatea de terminare a
subprogramului recursiv. Divizarea problemei n subprobleme i
asamblarea soluiilor necesit timpul O(n
k
). Complexitatea timp T(n) a
algoritmului Divide et impera este dat de urmtoare relaie de recuren:

> +
s
=
0
0
), ( ) (
), 1 (
) (
n n daca n O
b
n
T a
n n daca O
n T
k

Teorem: Dac n>n0 atunci:

Algoritmii divide et impera au o bun comportare n timp, dac
dimensiunile subproblemelor n care se mparte subproblema snt
aproximativ egale. Dac lipsesc fazele de combinare a soluiilor, viteza
acestor algoritmi este i mai mare (ex. cutarea binar). n majoritatea
cazurilor, descompunerile njumtesc dimensiunea problemei, un
exemplu tipic reprezentndu-l sortarea prin interclasare.

<
=
>
=
. daca ) (
, daca ) log (
, daca ) (
) (
log
k k
k
b
k
k a
b a n O
b a n n O
b a n O
n T
b
4

Studii de caz simple

Pe parcursul capitolului pentru fiecare studiu de caz se va analiza
problema urmrind aplicarea paradigmei
1
.
Pentru a fi neleas esena metodei vor fi expuse cteva exemple
simple, prezentate din motive didactice.


1. Produs de n factori

Enun: S se calculeze produsul a n numere reale.

Schema problemei:
generalizare: produs (a[p..q])
baza: p > q

Soluie:
divide-et-impera
divide: m = [(p + q)/2]
subprobleme: produs(a[p..m]), produs(a[m+1..q])
asamblare: nmulete rezultatele subsecvenelor
produs(a[p..m]) i produs(a[m+1..q])

ntruct la un moment dat nu putem calcula dect produsul a doi
factori, produsul va trebui descompus n subproduse. O posibilitate de
descompunere ar fi s mprim numrul factorilor n jumtate, i s
considerm produsele factorilor din cele dou jumti, procednd apoi la
fel n continuare cu fiecare jumtate pn ajungem la produse de doi
factori. Acest mod de descompunere este ilustrat n figura urmtoare:

1
In Anexa sint prezentate implement[rile Pascal/C ]nso`ite de comentarii \i parte grafic[ (acolo unde este
necesar) pentru to`i algoritmii aborda`i

5
Produs(x
1
,..x
5
)
Produs(x
4
,x
5
)
Produs(x
1
, x
2
, x
3
)
Produs(x
1
, x
2
) Produs(x
3
)

Fig. 1: Arborele descompunerii pentru un produs de n numere (n=5)

Produsul calculat conform acestei scheme de descompunere este
redat n figura urmtoare; p5 este produsul celor 5 factori, ordinea n care
s-au calculat produsele este specificat de indicii produselor pi.

p
5
=p
3
-p
4
p
4
=x
4
-x
5
p=x
1
-x
2
p
2
=x
3
p
3
=p
1
-p
2

Fig. 2: Arborele soluiei pentru un produs de n numere (n=5)

complexitate: a = 2, b = 2, k = 1,T(n) = O(n)


2. Minim prin divide et impera

Enun: S se determine valoarea minim dintr-un ir de n numere ntregi

Schema problemei:
generalizare: minim(a[p..q])
baza: p > q

6

Soluie:
divide-et-impera
divide: m = [(p + q)/2]
subprobleme: minim(a[p..m]), minim(a[m+1..q])
asamblare: se combin soluiile subproblemelor
minim(a[p..m]) i minim(a[m+1..q])

"Divide et Impera" const n mprirea irului de elemente n dou
subiruri {a1, a2,..,am}, respectiv {am+1,..,an} unde m reprezint mijlocul
irului.
Minim(x
1
,..x
5
)
Minim(x
4
,x
5
)
Minim(x
1
, x
2
, x
3
)
Minim(x
1
, x
2
) Minim(x
3
)

Fig. 3: Arborele descompunerii pentru determinarea minimului din n numere (n=5)

Astfel min{a1,a2,..,am}=min{min{a1, a2,..,am},min{am+1,..,an}}.

min
5
= min(min
3
,min
4
)
min
4
= min(x
4
,x
5
in
1
= min(x
1
,x
2
) min
2
=x
3
min
3
= min(min
1
,min
2
)

Fig. 4: Arborele soluiei pentru minim din n numere (n=5)

complexitate: T(n) = O(n)

7

3. Turnurile din Hanoi

Enun: Avnd un turn cu 8 discuri pstrate n ordinea descresctoare a
diametrelor pe una din cele trei tije, realizai mutarea acestui turn pe o
alt tij respectnd urmtoarele reguli:
se mut cte un singur disc;
pe nici o tij nu se poate aeza un disc deasupra altuia de diametru mai
mic;
din cele trei tije, cea de-a doua reprezint "tija auxiliar" putnd fi
folosit pentru pstrarea intermediar a discurilor.
Fig. 5: Reprezentarea turnurilor din Hanoi (n=8)

Problema "Turnurilor din Hanoi" inventat de matematicianul
francez Edouard Lucas in 1883 este inspirat din legendele orientale fiind
un exemplu clasic n studierea paradigmei divide et impera.
Iniial era un joc i a fost gsit pentru prima dat printre scrierile
ilustrului Mandarin FER-FER-TAM-TAM, publicate mai trziu din ordinul
guvernului din China. Turnul din Hanoi era compus de 8 discuri de lemn,
n ordinea descresctoare a diametrelor iar n Japonia, n China i Tonkin,
acestea erau din porelan. Jocul const n demolarea turnului nivel cu nivel
i reconstituirea sa ntr-un loc apropiat conform regulii c nu se poate
aeza un disc deasupra altuia de diametru mai mic. Amuzant i instructiv,
uor de nvat i jucat este foarte util n popularizarea problemei
tiinifice.
Conform unei vechi legende indiene, brahmanii urmeaz fiecare de o
lung perioad de timp paii schimbrii n Templul din Benares realiznd
mutarea turnului sacru al lui Brahma cu 64 discuri de aur mpodobite cu
diamante de Golconde dup aceleai reguli, mutnd un singur disc ntr-o zi.
n ziua cnd totul va fi gata stelele vor disprea, turnul va cdea iar
lumea ntreag se va sfri. Previziunea este destul de optimist deoarece
astzi se cunoate c sunt necesare 2
64
-1 mutri (zile) 18 446 744 073 709
551 615 mutri ceea ce nseamn mai mult de 5 bilioane de secole!

Schema problemei:
generalizare: TH(n), n>0
a b c
8



Soluie:
divide-et-impera
subprobleme: TH(n-1,a,c,b),TH(1),TH(n-1,c,b,a);
asamblare: nu exist, deoarece soluia problemei iniiale a fost
obinut simultan cu etapele de descompunere
complexitate: T(n) = O(2
n
)
Analiza complexitii:
O mutare poate fi scris ca o pereche (i,j) cu (i,j)e{1,2,3}
semnificnd c se mut discul de pe tija i pe tija j. Vom nota H(m,i,j) irul
mutrilor necesare pentru a muta primele m discuri de pe tija i pe tija j,
folosind i tija de manevra k=6-i-j astfel c problema revine la a determina
H(n,1,2). Mutrile pot fi reprezentate prin etichetele unui arbore binar
complet avnd n nivele, construit astfel:
-rdcina e etichetat (1,2).
-fiecare vrf aflat pe un nivel <n i etichetat (i,j) are descendent stng
nodul (i,k) iar descendent drept nodul (k,j).
Astfel snt 2
n
-1 mutri succesiunea corect fiind obinut prin
parcurgerea arborelui n inordine.
Pentru exemplul din figur succesiunea celor 2
3
-1 mutri este: (1,2), (1,3),
(2,3), (1,2), (3,1), (3,2), (1,2).
(1,2)
(1,3) (3,2)
(1,2) (2,3)
(3,1) (1,2)
(1) (2)
(3) (4)
(5) (6)

Fig.6. Parcurgerea n inordine a arborelui binar pentru mutrile celor n discuri (n=3)

9
Studii de caz complexe

1. Cutarea binar

Problema regsirii informaiei stocate n memorie e o problem
foarte frecvent i care poate solicita un timp mare atunci cnd numrul
nregistrrilor este ridicat.

Enun: Fiind dat un ir de n numere ntregi, ordonat strict cresctor, s se
determine poziia pe care se afl n ir o anumit valoare x citit de la
tastatur. n cazul n care valoarea nu se afl n ir, s se specifice acest
lucru printr-un mesaj.

Schema problemei:
generalizare: caut (a[p..q],x)
baza: p > q

Soluie:
Observaie: prin rezolvarea clasic (comparnd pe rnd valoarea cutat cu
fiecare component a vectorului) n cazul unei cutri cu succes numrul
mediu de comparaii este n/2 iar n cazul unei cutri fr succes numrul
de comparaii este egal cu n. De aceea este mult mai eficient s se
ordoneze elementele vectorului iar apoi s se aplice algoritmul urmtor.
divide-et-impera
divide: m = [(p + q)/2]
subprobleme: caut (a[p..m],x), caut (a[m+1..q],x)
asamblare: nu exist, deoarece soluia unei subprobleme
reprezint soluia problemei iniiale

complexitate: T(n) = O(log2n)

Analiza complexitii
Reprezentarea strategiei de cutare printr-un arbore de decizie binar
(ilustrat n fig. 7) ajut la evaluarea performanelor algoritmului. Decizia
de continuare a procesului de cutare, adic fie oprirea cutrii, fie
cutarea pe ramura din stnga, fie cutarea pe ramura din dreapta a unui
nod, depind de rezultatul comparaiei numrului cutat cu numrul din ir
10
indicat de nodul n care ne aflm. Evaluarea eficienei acestui algoritm este
dat de urmtoarea teorem, care poate fi demonstrat prin inducie dup
k.

4
1 3
2
6
5 7
(1,7)
(1,3)
(5,7)
(1,1) (3,3) (5,5) (7,7)
f f f f
f f f f
Fig.7 Arborele de cutare binar: n=7 i valorile 3, 5, 12, 14, 15, 18, 24
Traseul din stnga ilustreaz cutarea fr succes a numrului x=13 iar
traseul din dreapta ilustreaz cutarea cu succes a numrului x=24

Teorem: Dac efectum o cutare ntr-un ir ordonat de n numere cu
algoritmul de cutare binar i dac n verific inegalitile:
2
k-1
sn<2
k
atunci:
a) o cutare cu succes necesit cel mult k comparaii;
b) o cutare fr succes necesit k-1 sau k comparaii;
Logaritmnd relaia precedent obinem: k-1slog2n<k, deci k=|log2n|+1
De exemplu, dac vrem s cutm un numr printre 1000 de
nregistrri cu algoritmul clasic de comparare ar trebui efectuate n medie
500 de operaii n cazul unei cutri cu succes i 1000 de cutri n cazul
fr succes. Dac ins nregistrrile sunt sortate, aplicnd teorema
anterioar rezult k=|log21000|+1=10, iar cutarea fr succes necesit 9
sau 10 comparaii, obinndu-se astfel o important reducere a numrului
de comparaii deci i a timpului de cutare.


2. Algoritmi de sortare

Sortarea unui ir de elemente este o operaie foarte important i
pentru aceasta se pot folosi mai muli algoritmi. Metodele cunoscute de
sortare "Inserie", "Selecie", "Interschimbare" au complexitatea O(n
2
) dar
vom arta c exist algoritmi mai performani.

11
2.1. Sortare prin interclasare (Merge sort)

Strategia acestui algoritm de sortare se bazeaz pe mprirea irului
iniial n dou subiruri de lungimi aproximativ egale, sortarea cresctoare
a ambelor subiruri i apoi interclasarea lor. Pentru cele dou subiruri se
aplic aceeai metod. Procesul de njumtire continu pn cnd se obin
iruri de lungime 1 (ordonate) sau 2, acestea din urm tratndu-se direct.

Schema problemei:
generalizare: sorteaz(a[p..q])
baza: p > q
Soluie:
divide-et-impera
divide: m = [(p + q)/2]
subprobleme:sorteaz(a[p..m]), sorteaz(a[m+1..q])
asamblare: interclaseaza subsecvenele sortate a[p..m] i
a[m+1..q]
complexitate: T(n) = O(n log n)

Analiza complexitii:
Pentru analiza complexitii urmrim diagrama care descrie modul
de sortare al unui ir de numere (valorile 16, 50, 25,14, 86, 35). Observm
c operaia de interclasare necesit O(n) comparaii pe fiecare nivel al
diagramei, unde n reprezint lungimea vectorului iniial. Cum numrul de
nivele este log2n, concluzia este c acest algoritm are complexitatea
O(nlogn), fiind una din cele mai eficiente metode de sortare.
16,50,25,14,86,35
(16,50) (25)
(16,50,25)
16 (50)
(14,86,35)
(14,86) 35
(14) (86)
Sortare(1-3)
Sortare(1-2)
Sortare(1)
Interclasare
(16) (50)
Sortare(2)
Sortare(3)
(16,50) (25)
Interclaseaz[
Sortare(4-6)
Sortare(6) Sortare(4-5)
Sortare(4) Sortare(5)
Interclaseaz[
(14) (86)
Interclasare
(14,86) (35)
Interclasare

Fig. 8: Arborele soluiei pentru sortarea prin interclasare a unui sir de n numere (n=5)
12
2.2. Sortare rapida (Quick sort)

Algoritmul Quicksort a fost realizat de C.A.R. Hoare n 1962,
strategia prin care elementele tabloului sunt ordonate bazndu-se pe
paradigma divide et impera.

Schema problemei:
generalizare: a[p..q]
baza: p > q
Soluie:
divide-et-impera
divide: determin k intre p si q prin interschimbri astfel c
dup determinarea lui k avem:
-p s i s k a[i] s a[k]
-k < j s q a[k] s a[j]
subprobleme: a[p..k-1], a[k+1..q]
asamblare: nu exista;
Fazele algoritmului se exprim astfel:
Pas 1. se selecteaz primul element a|p| care va fi numit pivot i se
realizeaz partiionarea tabloului n dou subtablouri care cuprind grupul
elementelor cu valori mai mici dect ale pivotului (a|1|..a|poz-1|),
respectiv, grupul elementelor cu valori mai mari sau egale cu ale pivotului
(a|poz+1|...a|q|).
mprirea este realizat prin intermediul pivotului, el fiind plasat pe poziia
final, poz ocupat n tabloul sortat, adic dup elementele mai mici ca el
i naintea grupului de elemente mai mari sau egale cu el.
Pas 2. sortarea celor dou subtablouri obinute reprezint subproblemele n
care a fost descompus problema iniial, ele fiind rezolvate prin
descompuneri succesive pn la obinerea unor subtablouri de dimensiune 1
(cazul de baz).
Quick sort: partiionare
iniial:
alege x din a[p..q] (ex. x a[p])
x

k
p q
s x
> x
13
i p; j q
pasul curent:
daca a[i] s x atunci i i+1
daca a[j] > x atunci j j-1
daca a[i] > x > a[j] si i < j atunci
swap(a[i], a[j])
i i+1
j j-1
pasul curent se execut atit timp ct i s j.

Faza de combinare a soluiilor subproblemelor lipsete, deoarece n
cadrul fiecreia un element desemnat ca pivot este plasat pe poziia final
n tabloul sortat, deci soluia problemei iniiale se construiete simultan cu
descompunerea ei n subprobleme.
complexitate medie = O(n log n)
Analiza complexitii
Pentru analiza complexitii acestui algoritm se pleac de la dou
situaii, generate de poziia pe care o ocup pivotul n urma operaiei de
partiionare. Astfel, n cel mai favorabil caz, pivotul este plasat n cadrul
fiecrei subprobleme pe poziia din mijloc a subtabloului, n aceast situaie
problema fiind descompus n dou subprobleme de aceeai dimensiune.
Cum fiecare subtablou de m elemente necesit maxim m comparaii, este
clar c pentru un numr de m autoapeluri pentru subtablouri de dimensiune
n div m vor fi necesare O(n) comparaii. Cum exist log2n nivele, rezult
c algoritmul Quicksort are o complexitate O(nlogn) n cazul cel mai
favorabil.
Exist ns situaii cnd aceast complexitate este deteriorat: de
exemplu un tablou care are deja elementele sortate-cazul cel mai
defavorabil. La descompunerea problemei iniiale se va obine o singur
subproblem care urmrete sortarea unui tablou cu n-1 elemente.
Deoarece numrul de nivele din recursivitate este n, complexitatea
algoritmului degenereaz ctre O(n
2
). Pentru a evita aceast deteriorare a
complexitii Knuth D.E. a propus efectuarea unei permutri aleatoare a
tabloului iniial, naintea aplicrii algoritmului Quicksort.
De asemenea trebuie reinut c acest algoritm de sortare presupune
alocarea implicit a unei stive (datorat recursivitii) de lungime ce variaz
ntre log2n i n.

14


3. Determinarea rdcinilor unei ecuaii

Enun: Se d o funcie continu care are semne contrare n cele dou
capete ale intervalului |a,b|, F(a)F(b)<0. Determinai o rdcin a lui F
din intervalul |a, b|, cu eroarea c.

Schema problemei:
generalizare: [a..b]
baza: a > b

Soluie:
divide-et-impera
divide: m = [(a + b)/2[
subprobleme: a[a..m], a[m+1..b]
asamblare: nu exist

Notm c mijlocul intervalului |a, b|, adic c=(a+b)/2 i definim
a1=a i b1=c, dac f(c)>0 respectiv a1=c i b1=b, dac f(c)<0. Dac
f(c)=0 atunci soluia ecuaiei este c. n caz contrar, funcia f: |a1, b1|R,
satisface ipotezele dar lungimea intervalului de definiie este redus la
jumtate. Metoda poate fi continuat prin alegerea mijlocului intervalului
|a1, b1| iar noul interval |a2, b2| va fi definit exact n acelai mod ca cel
precedent, procedeul continund pentru intervalul |an, bn|.
Dac vrem s obinem soluia aproximativ a ecuaiei f(x)=0 cu
eroarea c, va trebui s calculm termenii irului cn pn la prima valoare a
lui n care satisface inegalitatea: c <

n
a b
2
, adic n=|ln((b-a)/c)/ln2|+1.
complexitate: T(n) = O(n)
y
x
f(a
0
)
a=a
0
x
0
b=b
0
y
f(a
1
)
a
1
b
1
x
1
x
f(b
1
)

Fig. 9 Determinarea soluiei unei ecuaii prin metoda biseciei
15
4. Evaluarea polinoamelor

Enun: Scriei un algoritm divide et impera care s calculeze valoarea unui
polinom ntr-un punct.

Schema problemei:
generalizare: a[p..q]
baza: p > q

Soluie:
divide-et-impera
divide: m = [n/2]
subprobleme: a[p..m], a[m+1..q]
asamblare: determin valoarea final prin combinare rezultatelor
subsecvenelor
Fie polinomul P(x)=anx
n
+..+a1x+a0. Vom calcula valoarea sa n punctul
y folosind exprimarea P(y)=Q(y)-y
|n/2|
+T(y), urmnd s evalum
polinoamele Q i T n x. Pentru Q i T folosim o scriere analoag, pn
cnd gradul lor este 0 sau 1.

complexitate: T(n) = O(n)
16
Studii de caz avansate

1. Dreptunghi de arie maxim

Enun: Se dau coordonatele vrfurilor stnga-jos i dreapta-sus ale unui
dreptunghi cu laturile paralele cu axele de coordonate. Se dau
coordonatele a n puncte din plan. S se determine un dreptunghi de arie
maxim, cu laturile paralele cu axele, cuprins n dreptunghiul iniial, cu
proprietatea c punctele date nu se afl n interiorul dreptunghiului.

Schema problemei:
generalizare: xj,yj,xs,ys (coordonatele dreptunghuilui), n, x|n|,y|n|,
dreptunghi[i,xj,yj,xs,ys]

Soluie:
divide-et-impera
subprobleme:
dreptunghi|i+1,xj,yj,xs,y|i||,
dreptunghi|i+1,xj,y|i|,xs,ys|,
dreptunghi|i+1,xj,yj,x|i|s,ys|,
dreptunghi|i+1, x|i|,yj,xs,ys|.
asamblare: nu exist.
Dac toate punctele sunt exterioare dreptunghiului dat sau se afl pe laturile
sale, dreptunghiul cutat este chiar cel iniial.
Dac exist un singur punct interior dreptunghiului, ducnd prin punctul
respectiv o paralel la una din axele de coordonate se obin alte dou
dreptunghiuri care nu mai conin punctul interior (fig. 10).
D1
D2
D4 D3

Fig.10 Exemplu pentru problema dreptunghiului

Din cele patru dreptunghiuri formate va trebui reinut cel de arie
maxim. Dac exist dou puncte interioare dreptunghiului, al doilea punct
ar putea fi punct interior la doar unul dintre dreptunghiurile D1, D2,
respectiv D3, D4, regsim astfel problema iniial pentru dreptunghiurile
D1, D2, D3, D4 i punctul al doilea, toate acestea conducnd la o abordare
17
divide et impera. Problema iniial se descompune n patru subprobleme
corespunztoare celor patru dreptunghiuri formate prin trasarea celor dou
paralele prin primul punct interior al dreptunghiului. Fie acesta punctul i de
coordonate (xi,yi). n continuare, punctele interioare vor putea fi numai
punctele je{i+1,.., n}. Descompunerea continu n acelai mod, pn se
ajunge la dreptunghiuri fr puncte interioare ale cror arii se calculeaz i
se reine maximul. Observm c nu este necesar o etap de combinare a
soluiilor.

2. Problema plierilor

Enun: Se consider un vector de lungime n. definim plierea vectorului
prin suprapunerea unei jumti, numit donatoare, peste cealalt
jumtate, numit receptoare, cu precizarea c dac numrul de elemente
este impar, elementul din mijloc este eliminat. Prin pliere, elementele
subvectorului obinut vor avea numerotarea jumtii receptoare. Plierea
se poate aplica n mod repetat, pn cnd se ajunge la un subvector format
dintr-un singur element, numit element final. Scriei un program care s
afieze toate elementele finale posibile i s se figureze pe ecran pentru
fiecare element final o succesiune de plieri.

Schema problemei:
generalizare: pliaz[p..q]
baza: p > q

Soluie:
divide-et-impera
divide: m = [n/2]
subprobleme:
dac (q-p+1) mod 2=1 atunci Ls=(p+q)div 2-1 altfel Ls=(p+q)
div 2; Ld=(p+q) div 2 +1;
pliaz[p..Ls], pliaz[Ld..q]
asamblare: nu exist;
Pentru determinarea tuturor elementelor finale i succesiunile de plieri
corespunztoare pentru un vector cu numerotarea elementelor p..q, vom
utiliza o procedur Pliaza(p,q). Dac p=q, atunci vectorul este format
dintr-un singur element, deci final. Dac p<q, calculm numrul de
elemente din vector (q-p+1).
18
Dac numrul de elemente din vector este impar, elementul din
mijloc ((p+q)div2) este eleminat, plierea la stnga se face de la poziia
(p+q)div2 -1, iar plierea la dreapta de la poziia (p+q) div2+1.
Dac numrul de elemente din vector este par, plierea la stnga se
poate face de la poziia (p+q) div 2 iar plierea la dreapta de la poziia
(p+q)div2+1. Vom codifica plierea la stnga reinnd irul mutrilor
simbolul 'S' urmat de poziia Ls, de la care se face plierea spre stnga, iar
o pliere la dreapta prin simbolul 'D', urmat de poziia Ld de la care se face
plierea spre dreapta. Pentru a determina toate elementele finale din
intervalul p..q, apelm recursiv procedura Pliaza pentru prima jumtate a
intervalului, precednd toate succesiunile de plieri cu o mutare spre stnga,
apoi apelm procedura Pliaza pentru cea de-a doua jumtate a intervalului,
precednd toate succesiunile de plieri corespunztoare de o pliere la
dreapta.
Exemplu, pentru n=7, elementele finale i plierile corespunztoare snt:
1: S3 S1
3: S3 D3
5: D5 S5
7: D5 D7

3. Fractali

Figuri ciudate i aparent paradoxale, fractalii exercit o adevrat
fascinaie pentru matematicieni i informaticieni.
Noiunea de fractal a aprut ca urmare a studiului vieii reale, n care
informaia genetic coninut n nucleul unei celule se repet la diferite
scri.
Fractalii sunt forme caracterizate printr-o extrem fragmentare,
neregularitate, asemnarea detaliului cu ntregul indiferent de scara de
observaie, n ultimul timp acetia jucnd un rol vital n toate ramurile
tiinelor moderne. Primii fractali au fost creai de matematicienii Waclaw
Sierpinski, David Hilbert, George Cantor sub forma unor exerciii
abstracte.
Dincolo de spectaculosul imediat al reprezentrilor, fractalii i-au gsit
aplicaii nu doar n programele de grafic ci i n domenii cum ar fi
compresia datelor sau criptografie.

Iterarea ptratului. Realizai un program recursiv care s afieze pe ecran
n mod grafic un fractal simplu obinut prin iterarea unui ptrat. Latura
unui ptrat se citete de la tastatur (0<L<260) iar iterarea se face pna
la obinerea ptratelor de latur 1.

19
Indicaie: Paradigma divide et impera ne permite s desenm mai nti
ptratele cu cele mai mici laturi i apoi, pe rnd pe celelalte. Pentru
aceasta, desenul unui ptrat trebuie s se afle la sfritul procedurii
recursive, executndu-se dup revenirea din activrile ulterioare ale
procedurii n care s-au desenat ptratele cu laturile mai mici dect latura
ptratului curent.

Fig. 11. Iterarea ptratului

Triunghiul lui Sierpinski: Fie un triunghi iniial care se mparte n 4
triunghiuri egale. Fiecare din cele 4 triunghiuri obinute se mparte la
rndul lui n 4 triunghiuri egale, procedeul continund la infinit. Realizai
un program recursiv care citind de la tastatur coordonatele vrfurilor
triunghiului iniial i n- numrul iteraiilor afieaz n mod grafic un
triunghi Sierpinski dup n iteraii.

Indicaie: Aplicnd paradigma divide et impera, pentru a putea genera
fractalul vom determina mijloacele laturilor triunghiului, le vom uni prin
linii, determinnd astfel cele 4 triunghiuri incluse n triunghiul iniial, apoi
procedeul se repet pentru fiecare din cele 4 triunghiuri nou obinute.

Fig. 12 Triunghiul lui Sierpinski
20

4. nmulirea matricelor

Pentru matricile A i B de nn elemente, dorim s obinem matricea
produs C=AB. Algoritmul clasic provine direct din definiia nmulirii a
dou matrici i necesit n
3
nmuliri i (n-1)n
2
adunri scalare, astfel c
timpul necesar pentru calcularea C este n O(n
3
). Intenia este s gsim un
algoritm de nmulire matriceal al crui timp s fie ntr-un ordin mai mic
dect n
3
. Pe de alt parte, este clar c O(n
2
) este o limit inferioar pentru
orice algoritm de nmulire matriceal, deoarece trebuie n mod necesar s
parcurgem cele n
2
elemente ale lui C.
Paradigma divide et impera sugereaz un alt mod de calcul al
matricii C. Vom presupune c n este o putere a lui 2. Partiionm pe A i B
n cte patru submatrici de n/2 n/2 elemente fiecare. Matricea produs C
se poate calcula conform formulei pentru produsul matricilor de 22
elemente:
|
|
.
|

\
|
=
|
|
.
|

\
|
|
|
.
|

\
|
22 21
12 11
22 21
12 11
22 21
12 11
C C
C C
B B
B B
A A
A A

unde C11=A11B11+A12B21 C12=A11B12+A12B22
C21=A21B11+A22B21 C22=A21B12+A22B22
Pn aici nu am ctigat nimic fa de metoda clasic: este de dorit ca n
calcularea submatricilor C s folosim mai puine nmuliri, chiar dac prin
aceasta mrim numrul de adunri (adunarea matricilor necesit un timp
ptratic, n timp ce nmulirea matricilor necesit un timp cubic). Astfel, n
1969, Strassen a descoperit o metod de calculare a submatricilor Cij, care
pentru n=2 utilizeaz 7 nmuliri i 18 adunri i scderi. Pentru nceput se
calculeaz apte matrici de n/2 n/2 elemente:
P=(A11+A22)(B11+B22)
Q=(A21+A22)B11
R=A11(B12-B22)
S=A22(B21-B11)
T=(A11+A12)B22
U=(A21-A11)(B11+B22)
V=(A12-A22)(B21+B22)
Este uor de verificat c matricea produs C se obine astfel:
C11=P+S-T+V C12=R+T
C21=Q+S C22=P+R-Q+U
Timpul total pentru noul algoritm divide et impera este
t(n)e7t(n/2)+O(n
lg7
). Cum lg7<2.81,rezult c teO(n
2.81
), algoritmul lui
Strassen fiind mai eficient dect algoritmul clasic de nmulire matriceal.
21
Metoda lui Strassen nu este unic: s-a demonstrat c exist exact 36 de
moduri diferite de calcul a submatricilor Cij, fiecare din aceste metode
utiliznd 7 nmuliri.
Practic, la calculator s-a putut observa c, pentru n>40, algoritmul
lui Strassen este mai eficient dect metoda clasic dar n schimb folosete
memorie suplimentar.


5. nmulirea numerelor ntregi mari

Pentru anumite aplicaii, trebuie s lucrm cu numere ntregi foarte
mari, care nu mai pot fi reprezentate prin tipurile standard existente. Astfel
vom da un algoritm divide et impera pentru nmulirea ntregilor foarte
mari.
Fie u i v doi ntregi foarte mari, fiecare de n cifre zecimale. Dac
s=n/2, reprezentm pe u i v astfel:
u=10
s
w+x, v=10
s
y+z, unde 0sx<10
s
, 0sz<10
s

u
v
u
n/2( n/2
w x
y z

Fig. 13 Reprezentarea numerelor u i v la nmulirea ntrgilor foarte mari

ntregii w i y au cte n/2( cifre, iar ntregii x i z au cte n/2
cifre. Din relaia uv=10
2s
wy+10
s
(wz+xy)+xz obinem urmtorul algoritm
divide et impera de nmulire a dou numere ntregi mari:

function nmulire(u,v)
ncel mai mic ntreg astfel nct u i v s aib fiecare n cifre
if n este mic then calculeaz n mod clasic produsul uv
return produsul uv calculat
sn div 2
wu div 10
s
; xu mod 10
s
;
yv div 10
s
; zv mod 10
s
;
return nmulire(w,y)10
2s
+(nmulire(w,z)+nmulire(x,y))10
s
+nmulire(x,z)

Deoarece nmulirea ntregilor mari este mult mai lent dect
adunarea, ncercm s reducem numrul nmulirilor, chiar dac prin
aceasta mrim numrul adunrilor. Astfel, ncercm s calculm
22
wy,wz+xy i xz prin mai puin de patru nmuliri. Considernd produsul
r=(w+x)(y+z)=wy+(wz+xy)+xz
observm c putem nlocui ultima linie din algoritm cu
rnmul(w+x,y+z)
pnmul(w,y); qnmul(x,z);
return 10
2s
p+10
s
(r-p-q)+q
Ca i la metoda lui Strassen, datorit constantelor multiplicative implicate,
acest algoritm este interesant n practic doar pentru valori mari ale lui n.
23

Aplicaii propuse

Probleme pentru consolidarea cunotinelor i
lucrri de verificare

1. Cel mai mare divizor comun a n numere. Fie n valori naturale nenule a1,
a2,..,an. determinai cel mai mare divizor comun al lor cmmdc((a1, a2,..,an))
Indicaie: Soluia "Divide et Impera" const n mprirea irului de
elemente n dou subiruri {a1, a2,..,am}, respectiv {am+1,..,an} unde m
rerpezint mijlocul irului.
Astfel: cmmdc(a1,a2,..,am)=cmmdc(cmmdc(a1,a2,..,am),cmmdc(am+1,..,an))

2. Min-Max. Realizati un subprogram care folosind tehnica "Divide et
impera" s determine simultan minimul i maximul unui ir de numere

3. Detaliu. Avnd tabloul de numere ntregi (3,2,5,4,7,6,8,2,12) care va fi
configuraia lui dup efectuarea a trei partiionri specifice algoritmului
Quicksort?
4. Calculul factorialului. Fie n natural. S se calculeze n! printr-un
algoritm Divide et Impera

5. nmulirea polinoamelor: Fie P(x) i Q(x) dou polinoame de grad n, cu
coeficieni reali. S se nmuleasc cele dou polinoame, utiliznd metoda
"Divide et Impera". Comparai aceast metod de nmulire a polinoamelor
cu varianta "clasic"
Indicaie: Vom grupa termenii celor dou polinoame n felul urmtor:
p(x)=p1(x)+x
N/2
p2(x), q(x)=q1(x)+x
N/2
q2(x)
Vom calcula urmtoarele produse pariale, observnd c se nmulesc
polinoame avnd gradul N/2:
r1(x)=p1(x)- q1(x), r2(x)=(p1(x)+ p2(x))-(q1(x)+q2(x)), r3(x)=p2(x)-q2(x)
Atunci polinomul produs se scrie:
r(x)=r1(x)+(r2(x)-r1(x)-r3(x))-x
N/2
+r3(x)-x
N

Deoarece nmulirea polinoamelor necesit N
2
pai, continund algoritmul
de mai sus, obinem n-logn pai.

6. Problema seleciei: Fie a un tablou de n elemente i k un numr ntreg,
1sksn. S se gseasc elementul care se afl pe locul k n irul ordonat
cresctor, fr a efectua ordonarea |11|.
Indicaie: Folosim ideea algoritmului quicksort care aeaz un element pe
locul m, poziia lui corect n irul ordonat cresctor, astfel nct pe
24
primele m-1 poziii se gsesc elemente mai mici sau egale dect a|m| iar
dup poziia m se gsesc numai elemente mai mari dect a|m|.

7. Problema punctului fix: Fie a un tablou ordonat cresctor de n numere
ntregi distincte. S se determine un indice m, (1smsn), cu a|m|=m, dac
este posibil |11|.
Indicaie: Folosim ideea de la cutarea binar.

Concluzii

Tipuri de greeli ce pot interveni n implementarea
paradigmei divide et impera

Greelile care pot aprea la realizarea i implementarea algoritmilor
bazai pe paradigma divide-et-impera se pot impri n dou categorii:
greeli care in de o strategie incorect proiectat;
greeli care apar n etapa de programare datorit implementrii
defectuoase a recursivitii;
Pornind de la presupunerea c problema creia i se caut soluia
accept rezolvare prin paradigma divide et impera, trebuie avute n vedere
urmtoarele situaii care conduc la greeli de fond ale algoritmului:

Descompunerea incorect a problemei:
exemplu: sunt generate n general de obinerea unor subprobleme care nu
sunt disjuncte;
Identificarea greit a dimensiunii problemei care accept rezolvarea
imediat (cazul de baz);
Parametrii care indic dimensiunea subproblemelor nu tind ctre cazul
de baz;
programul fiind recursiv, dac nu este prezent condiia de oprire, va
conduce la ntreruperea execuiei programului i afiarea mesajului de
eroare: "Stack overflow" (depirea stivei);
Faza de combinare a soluiilor subproblemelor nu este prezent, iar
soluia problemei iniiale nu se construiete simultan cu descompunerea
sa i nici nu se reprezint soluia vreunei subprobleme;
Proiectarea greit a fazei de combinare a soluiilor.