Sunteți pe pagina 1din 24

Paradigma Divide et Impera

Prezentarea general a
metodei

Studii de caz simple

Studii de caz complexe

Studii de caz avansate

1. Produs de n factori
2. Determinarea minimului dintre n
numere
3. Turnurile din Hanoi
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
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

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 n atunci rezolva P prin metode elementare
divide-et-impera
divide P in a probleme P (n ),...,P (n ) cu n n/b, b>1
0

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.
procedure DivideEtImperaR(P, n, S)
begin
if (n <= n0)
then determina S prin metode elementare
else imparte P in P1, ..., Pa
DivideEtImperaR(P1, S1)
......................
DivideEtImperaR(Pa, Sa)
Asambleaza(S1, ..., Sa, S)
end

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 nin/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(nk). Complexitatea timp T(n) a
algoritmului Divide et impera este dat de urmtoare relaie de recuren:

O(1), daca n n0

T ( n)
n
k
a T ( ) O(n ), daca n n0
b

Teorem: Dac n>n0 atunci:


O(n logb a )
daca a b k ,

T (n) O(n k log b n) daca a b k ,


O(n k )
daca a b k .

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.

Studii de caz simple


Pe parcursul capitolului pentru fiecare studiu de caz se va analiza
problema urmrind aplicarea paradigmei1.
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:

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

Produs(x1,..x5)

Produs(x4,x5)

Produs(x1, x2, x3)

Produs(x1, x2)

Produs(x3)

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.

p5= p3p4

p4= x4x5

p3= p1p2

p= x1x2

p2= x3

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

Soluie:

divide-et-impera

divide: m = [(p + q)/2]


subprobleme: minim(a[p..m]),
asamblare: se combin

minim(a[m+1..q])

soluiile
minim(a[p..m]) i minim(a[m+1..q])

subproblemelor

"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(x1,..x5)

Minim(x4,x5)

Minim(x1, x2, x3)

Minim(x1, x2)

Minim(x3)

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

Astfel mina1,a2,..,am=minmina1, a2,..,am,minam+1,..,an.

min5= min(min3,min4)

min3= min(min1,min2)

min4= min(x4,x5

in1= min(x1,x2) min2= x3


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

complexitate: T(n) = O(n)

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 264-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

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(2n)


Analiza complexitii:
O mutare poate fi scris ca o pereche (i,j) cu (i,j)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 2n-1 mutri succesiunea corect fiind obinut prin
parcurgerea arborelui n inordine.
Pentru exemplul din figur succesiunea celor 23-1 mutri este: (1,2), (1,3),
(2,3), (1,2), (3,1), (3,2), (1,2).
(1,2)
(3)

(4)

(1,3)
(1)

(1,2)

(3,2)
(2)

(2,3)

(5)

(6)

(3,1)

(1,2)

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

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

indicat de nodul n care ne aflm. Evaluarea eficienei acestui algoritm este


dat de urmtoarea teorem, care poate fi demonstrat prin inducie dup
k.

(1,7)

(1,3)

(5,7)
2

(1,1)

(3,3)
1

(5,5)

f f

(7,7)
5

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:
2k-1n<2k 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-1log2n<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(n2) dar
vom arta c exist algoritmi mai performani.

10

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]

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
Sortare(1-3)

Sortare(4-6)

Interclasare

(14,86,35)

(16,50,25)

Sortare(4-5)
Interclasare

Sortare(1-2)

(16,50) (25)

(16,50)
Sortare(1)

Sortare(2)

Sortare(3)

(14,86) (35)

(25)

(14,86)
Sortare(4)

Interclaseaz[

16

(16) (50) (50)

Sortare(6)

Interclasare

35

Sortare(5)

Interclaseaz[

(14)

(14) (86)

(86)

Fig. 8: Arborele soluiei pentru sortarea prin interclasare a unui sir de n numere (n=5)
11

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 i k a[i] a[k]
-k < j q a[k] a[j]

subprobleme: a[p..k-1],
asamblare: nu exista;

a[k+1..q]

Fazele algoritmului se exprim astfel:


Pas 1. se selecteaz primul element ap care va fi numit pivot i se
realizeaz partiionarea tabloului n dou subtablouri care cuprind grupul
elementelor cu valori mai mici dect ale pivotului (a1..apoz-1),
respectiv, grupul elementelor cu valori mai mari sau egale cu ale pivotului
(apoz+1...aq).
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]


x
p

(ex. x a[p])

x
q

12

p; j q
pasul curent:

daca a[i] 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 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(n2). 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.

13

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 .
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, b1R,
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 , va trebui s calculm termenii irului cn pn la prima valoare a
lui n care satisface inegalitatea:

ba
, adic n=ln((b-a)/)/ln2+1.
2n

complexitate: T(n) = O(n)


y

f(a0)

f(a1)
x0

a= a0

x1

b= b0
x

f(b1)

a1

b1
x

Fig. 9 Determinarea soluiei unei ecuaii prin metoda biseciei


14

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)=anxn+..+a1x+a0. Vom calcula valoarea sa n punctul
y folosind exprimarea P(y)=Q(y)yn/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)

15

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, xn,yn,


dreptunghi[i,xj,yj,xs,ys]

Soluie:

divide-et-impera

subprobleme:

dreptunghii+1,xj,yj,xs,yi,
dreptunghii+1,xj,yi,xs,ys,
dreptunghii+1,xj,yj,xis,ys,
dreptunghii+1, xi,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

D3

D4

D2

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
16

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 ji+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).

17

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.

18

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


19

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 n3 nmuliri i (n-1)n2 adunri scalare, astfel c
timpul necesar pentru calcularea C este n O(n3). Intenia este s gsim un
algoritm de nmulire matriceal al crui timp s fie ntr-un ordin mai mic
dect n3. Pe de alt parte, este clar c O(n2) este o limit inferioar pentru
orice algoritm de nmulire matriceal, deoarece trebuie n mod necesar s
parcurgem cele n2 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:
A11

A21

A12 B11

A22 B21

B12 C11

B22 C 21

C12

C 22

C12=A11B12+A12B22
unde C11=A11B11+A12B21
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)7t(n/2)+(nlg7). Cum lg7<2.81,rezult c tO(n2.81), algoritmul lui
Strassen fiind mai eficient dect algoritmul clasic de nmulire matriceal.

20

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 n40, 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=10sw+x, v=10sy+z, unde 0x<10s, 0z<10s
u

z
n/2

n/2

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=102swy+10s(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 10s; xu mod 10s;
yv div 10s; zv mod 10s;
return nmulire(w,y)102s+(nmulire(w,z)+nmulire(x,y))10s+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
21

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 102sp+10s(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.

22

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)+xN/2p2(x), q(x)=q1(x)+xN/2q2(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))xN/2+r3(x)xN
Deoarece nmulirea polinoamelor necesit N2 pai, continund algoritmul
de mai sus, obinem nlogn pai.
6. Problema seleciei: Fie a un tablou de n elemente i k un numr ntreg,
1kn. 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
23

primele m-1 poziii se gsesc elemente mai mici sau egale dect am iar
dup poziia m se gsesc numai elemente mai mari dect am.
7. Problema punctului fix: Fie a un tablou ordonat cresctor de n numere
ntregi distincte. S se determine un indice m, (1mn), cu am=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.

24

S-ar putea să vă placă și