Documente Academic
Documente Profesional
Documente Cultură
Metoda Divide Et Impera
Metoda Divide Et Impera
Prezentarea general a
metodei
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:
O(1), daca n n0
T ( n)
n
k
a T ( ) O(n ), daca n n0
b
1. Produs de n factori
Enun: S se calculeze produsul a n numere reale.
Schema problemei:
Soluie:
divide-et-impera
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)
Produs(x3)
p5= p3p4
p4= x4x5
p3= p1p2
p= x1x2
p2= x3
generalizare: minim(a[p..q])
baza: p q
Soluie:
divide-et-impera
minim(a[m+1..q])
soluiile
minim(a[p..m]) i minim(a[m+1..q])
subproblemelor
Minim(x4,x5)
Minim(x1, x2)
Minim(x3)
min5= min(min3,min4)
min3= min(min1,min2)
min4= min(x4,x5
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
(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)
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
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
(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
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
generalizare: sorteaz(a[p..q])
baza: p q
Soluie:
divide-et-impera
a[m+1..q]
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
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
generalizare: a[p..q]
baza: p q
Soluie:
divide-et-impera
divide: determin k
subprobleme: a[p..k-1],
asamblare: nu exista;
a[k+1..q]
(ex. x a[p])
x
q
12
p; j q
pasul curent:
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
generalizare: [a..b]
baza: a b
Soluie:
divide-et-impera
ba
, adic n=ln((b-a)/)/ln2+1.
2n
f(a0)
f(a1)
x0
a= a0
x1
b= b0
x
f(b1)
a1
b1
x
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.
15
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
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:
asamblare: nu exist;
17
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
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
z
n/2
n/2
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