Sunteți pe pagina 1din 12

IMPLEMENTAREA METODEI

DIVIDE ET IMPERA
CONTINUT

 Caracteristici
 Implementare in pseudocod
 Implementare in C++
 Studiu de caz
 Fisa de lucru
INTRODUCERE

•Divide et impera este o tehnică de programare prin intermediul


căreia se pot rezolva anumite probleme care pot fi descompuse în
subprobleme de aceiaşi natură, de dimensiuni mai mici.

•Expresia ”Divide et Impera” provine din limba latină şi este atribuită lui
Filip al II-lea, rege al Macedoniei (382 - 336 Î.C.), descriind politica
sa de administrare a oraşelor-state greceşti.

•Traducerea ei în limba română este cunoscută drept ”dezbină si


stăpâneşte”, dar pentru aplicarea ei în domeniul programării, vom
păstra expresia originală din limba latină.
INTRODUCERE

• Definitie
Metoda de programare Divide et Impera se bazează pe descompunerea unei
probleme in două sau mai multe subprobleme similare. Descompunerea are loc
până cînd dimensiunea acestora permite o rezolvare imediată. După rezolvarea
subproblemelor, se combină soluţiile obţinute în vederea determinării soluţiei
problemei iniţiale.
Paşii algoritmului :

 Pas 1: descompunerea problemei in subprobleme similare problemei iniţiale, de


dimensiuni mai mici, independente unele de altele

 Pas 2: Dacă subproblema permite o rezolvare imediată atunci se rezolvă altfel se


revine la pasul 1.

 Pas 3: Combinarea soluţiilor subproblemelor până când se obţine soluţia problemei


iniţiale.
CARACTERISTICI

 Metoda admite o implementare recursiva.


 Se va utiliza un subprogram recursiv in care se vor trata cele doua
situatii:
- s-a ajuns la o (sub)problemă simplă ce admite o rezolvare
imediată – se obtine solutia
- s-a ajuns la o (sub)problemă care nu admite o rezolvare imediată
- o descompunem in două sau mai multe subprobleme şi pentru fiecare
din ele se continuă apelurile recursive
 În etapa finală a metodei Divide Et Impera se produce combinarea
subproblemelor (rezolvate deja) prin secvenţele de revenire din

apelurile recursive.
IMPLEMENTAREA IN PSEUDOCOD

divide_et_impera(d,s)
d=dimensiunea problemei
inceput
s=solutia problemei
daca dimensiunea d corespunde unui caz de baza
atunci se determina solutia s a problemei;
altfel
pentru i=1,n executa
se determina dimensiunea d_i a subproblemei P_i;
se determina solutia s_i a problemei P_i prin
apelul divide_et_impera(d_i,s_i);
sfarsit_pentru;
se combina solutiile s_1, s_2, s_3,…..s_n;
sfarsit_daca;
sfarsit.
IMPLEMENTAREA IN LIMBAJUL C++
/*declaratii globale pentru datele de intrare, ce vor fi divizate in submultimi disjuncte pentru
subproblemele in care se descompune problema*/

void divizeaza(<parametri: submultimile>)


{//se divizeaza multimea de date de intrare in submultimi disjuncte d_i}

void combina(<paramtri: solutiile s_i care se combina>)


{//se combina solutiile obtinute s_i}

void dei(<parametri: multimea de date d si solutia s>)


{//declaratii de variabile locale
if(<este caz de baza>) {se obtine solutia corespunzatoare subproblemei}
else
{divizeaza (parametri: k submultimi>);
for(i=1;i<=k; i++)
dei(<parametri: multimea de date d_i si solutia s_i>);
combina(<parametri: solutiile s_i>);} }

void main()
{// declaratii de variabile locale
// se citesc datele de intrare ale problemei –multimea d
dei(<parametri: multimea de date d si solutia s>);
// se afiseaza solutia problemei s}
EXEMPLIFICAREA METODEI

•Sa se calculeze produsul elementelor pare dintr-un vector v care contine numere intregi.
Numarul de elemente ale vectorului (n) si elementele lui se citesc de la tastatura.

4 10 15 28 31

m=(1+5)/2=3
Z12345=40*28=1120

4 10 15 28 31

m=(1+3)/2=2 m=(4+5)/2=4
Z123=40*1=40 Z45=28*1=28
4 10 15 28 31

Z12=4*10=40 Z3=1 Z4=28 Z5=1

4 10

Z1=4 Z2=10
REZOLVAREA PROBLEMEI

#include<iostream.h>
int v[100], n;

void divizeaza(int s, int d, int &m)


{m=(s+d)/2;}

void combina(int x, int y, int &z)


{z=x*y;}

void dei(int s, int d, int &z)


{int m, x1, x2;
if(d==s)
if(v[s]%2==0) z=v[s]; else z=1;
else
{divizeaza(s,d,m); dei(s,m,x1); dei(m+1,d,x2); combina(x1,x2,z); } }

void main()
{ int i,z; cout<<“n=”; cin>>n;
for(i=1; i<=n; i++)
{ cout<<“v[“<<i<<“]=“; cin>>v[i]; }
dei(1,n,z);
cout<<“produsul=”<<z;}
FISA DE LUCRU

 Programul urmator determina simultan, valoarea minima si valoarea maxima dintr-un vector care contine
numere intregi. Explicati cum a fost folosita metoda divide et impera pentru rezolvarea problemei

#include<iostream.h>
int v[100], n;

void divizeaza(int s, int d, int &m)


{m=(s+d)/2;}

void combina(int x1, int y1, int &z1, int x2, int y2, int &z2)
{if(x1>y1) z1=y1; else z1=x1;
if(x2>y2) z2=x2; else z2=y2;}

void dei(int s, int d, int &z1, int &z2) // z1= minim, z2=maxim
{int m, x1, x2, y1, y2;
if(d==s)
z1=z2=v[s];
else
{divizeaza(s,d,m); dei(s,m,x1,x2); dei(m+1,d,y1,y2); combina(x1,y1,z1,x2,y2,z2); } }

void main()
{ int i,z1,z2; cout<<“n=”; cin>>n;
for(i=1; i<=n; i++)
{ cout<<“v[“<<i<<“]=“; cin>>v[i]; }
dei(1,n,z1,z2);
cout<<“minimul=”<<z1<<endl<<“maximul=”<<z2<<endl;}
FISA DE LUCRU
 Fie urmatorul program:

 Determinati ce calculeaza programul. Explicati cum a fost folosita metoda divide et impera pentru a rezolva problema

 Modificati programul astfel incat sa afiseze suma patratelor numerelor impare din acelasi set de valori

#include<iostream.h>
void divizeaza(int s, int d, int &m)
{m=(s+d)/2;}

void combina(int x, int y, int &z)


{z=x+y;}

void dei (int s, int d, int &z)


{int m, x1, x2;
if(d==s)
if(s%2==0) z=-s*5; else z=s*5;
else
{divizeaza(s,d,m); dei(s,m,x1); dei(m+1,d,x2); combina(x1,x2,z); } }

void main()
{ int z;
dei(1,20,z);
cout<<“suma=”<<z; }
VA MULTUMESC !

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