Sunteți pe pagina 1din 2

Metoda DIVIDE ET IMPERA

Metodă de rezolvare a unor probleme complexe


Caracteristici probleme
 pot fi descompuse în/reduse la probleme cu complexitate mai mică
 de același tip / cu soluție cunoscută (probleme primitive)
 descompunerea este finită – problemă primitivă / condiție de terminare
 pentru fiecare din problemele rezultate în urma descompunerii se aplică același procedeu de descompunere
 rezolvarea noilor probleme este mai ușoară
 soluțiile combinate  soluția problemei inițiale
Determinarea elementului maxim dintr-o mulțime
Maxim(a, n) Maxim(a, p, u)
x = Maxim(a, n-1) x1 = Maxim(a, p, (p+u)/2)
max = x>a[n-1] ? x : a[n-1] x2 = Maxim(a, (p+u)/2+1, u)
max = x1>x2 ? x1 : x2

METODA BISECTIEI
Suma cifrelor unui număr
unsigned SumCifRec1(unsigned n)
{
if (n / 10 == 0)
return n;
else
return n % 10 + SumCifRec1(n / 10);

Exemple
Probleme de parcurgere Probleme de sortare
Problema turnurilor din Hanoi prin interclasare
Problema tăieturilor prin inserare
Probleme de căutare rapidă (quick sort)
secvențială / binară metoda micșorării incrementului (Shell sort)

Probleme de parcurgere H(n-1, S, I, D)


o secvență finită a, cu n elemente => P(a, 0, n) mută un disc de pe S pe D
Problema primitivă: i==n H(n-1, I, D, S)
P(a, i, n) se descompune în void Hanoi(int n,char S,char D,char I)
prelucrare a[i] {
P(a, i+1, n) if(n>0){
void parcurge(float *v, int i, int n) Hanoi(n-1,S,I,D);
{ if( i!=n ) cout<<"Muta dicsul "<<n<<" de pe tija "
{ printf("%7.2f ",v[i]); //prelucrare v[i] <<S<<" pe tija “ <<D<<endl;
parcurgere(v,i+1,n); }} Hanoi(n-1,I,D,S);
}
}
Problema turnurilor din Hanoi hanoi( 5, ‘a’, ‘b’, ‘c’);
H(n, S, D, I)
void taietura(int x,int y,int a,int b,int c[2][50], int n, int *xmax, int *ymax,
int *amax, int *bmax)
{
int gasit=0;int i=0;
while((i<=n-1)&&!gasit)
if((c[0][i]>x) && (c[0][i]<x+a) && (c[1][i]>y) && (c[1][i]<y+b))
gasit=1;
else i++;
if(gasit){
taietura(x,y,a,c[1][i]-y,c,n,xmax,ymax,amax,bmax);
taietura(x,c[1][i],a,b-c[1][i]+y,c,n,xmax,ymax,amax,bmax);
taietura(x,y,c[0][i]-x,b,c,n,xmax,ymax,amax,bmax);
taietura(c[0][i],y,a-c[0][i]+x,b,c,n,xmax,ymax,amax,bmax);
}
else
if(a*b>(*amax)*(*bmax)){
*amax=a;*bmax=b;
*xmax=x;*ymax=y;
}}

Probleme de căutare dacă x==a[m] {


Secvențială  problemă de poz=m int m=(p+u)/2;
parcurgere altfel if(x==a[m]) return m;
(secvențe finite sortate sau daca x<a[m] else
nesortate) C(x, a, p, m-1, poz) if(x<a[m])
Binară (mulțimi sortate) altfel return cauta_bin(x,a,p,m-1);
C(x, a, p, u, poz) C(x, a, m+1, u, poz) else
dacă p>u int cauta_bin(double x ,double return
poz=-1 *a, int p, int u) cauta_bin(x,a,m+1,u);
altfel {if(p>u) return -1; }}
m=(p+u)/2 else

Sortare prin interclasare m=(p+u)/2 interclasează a[p:m] cu a[m+1:u]


S(a, n) => S(a, 0, n-1) S(a, p, m)
dacă p<u S(a, m+1, u)

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