IMPLEMENTAREA METODEI DIVIDE ET IMPERA CONTINUT Caracteristici Implementare

  • Slides: 12
Download presentation
IMPLEMENTAREA METODEI DIVIDE ET IMPERA

IMPLEMENTAREA METODEI DIVIDE ET IMPERA

CONTINUT § Caracteristici § Implementare in pseudocod § Implementare in C++ § Studiu de

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

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

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

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) inceput daca dimensiunea d corespunde unui caz de baza

IMPLEMENTAREA IN PSEUDOCOD divide_et_impera(d, s) inceput 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. d=dimensiunea problemei s=solutia problemei

IMPLEMENTAREA IN LIMBAJUL C++ /*declaratii globale pentru datele de intrare, ce vor fi divizate

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

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 Z 12345=40*28=1120 4 4 10 Z 1=4 28 31 m=(1+3)/2=2 m=(4+5)/2=4 Z 123=40*1=40 Z 45=28*1=28 10 15 Z 12=4*10=40 4 15 Z 3=1 10 Z 2=10 28 Z 4=28 31 Z 5=1

REZOLVAREA PROBLEMEI #include<iostream. h> int v[100], n; void divizeaza(int s, int d, int &m)

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, x 1, x 2; if(d==s) if(v[s]%2==0) z=v[s]; else z=1; else {divizeaza(s, d, m); dei(s, m, x 1); dei(m+1, d, x 2); combina(x 1, x 2, 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

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 x 1, int y 1, int &z 1, int x 2, int y 2, int &z 2) {if(x 1>y 1) z 1=y 1; else z 1=x 1; if(x 2>y 2) z 2=x 2; else z 2=y 2; } void dei(int s, int d, int &z 1, int &z 2) // z 1= minim, z 2=maxim {int m, x 1, x 2, y 1, y 2; if(d==s) z 1=z 2=v[s]; else {divizeaza(s, d, m); dei(s, m, x 1, x 2); dei(m+1, d, y 1, y 2); combina(x 1, y 1, z 1, x 2, y 2, z 2); } } void main() { int i, z 1, z 2; cout<<“n=”; cin>>n; for(i=1; i<=n; i++) { cout<<“v[“<<i<<“]=“; cin>>v[i]; } dei(1, n, z 1, z 2); cout<<“minimul=”<<z 1<<endl<<“maximul=”<<z 2<<endl; }

FISA DE LUCRU § Fie urmatorul program: § Determinati ce calculeaza programul. Explicati cum

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, x 1, x 2; if(d==s) if(s%2==0) z=-s*5; else z=s*5; else {divizeaza(s, d, m); dei(s, m, x 1); dei(m+1, d, x 2); combina(x 1, x 2, z); } } void main() { int z; dei(1, 20, z); cout<<“suma=”<<z; }

VA MULTUMESC !

VA MULTUMESC !