Documente Academic
Documente Profesional
Documente Cultură
DIVIDE ET IMPERA
CONTINUT
Caracteristici
Implementare in pseudocod
Implementare in C++
Studiu de caz
Fisa de lucru
INTRODUCERE
•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.
• 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 :
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 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
4 10
Z1=4 Z2=10
REZOLVAREA PROBLEMEI
#include<iostream.h>
int v[100], n;
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 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 main()
{ int z;
dei(1,20,z);
cout<<“suma=”<<z; }
VA MULTUMESC !