110 likes | 370 Views
Divide et Impera. De Cacior Mihai. Divide et impera provine din latina , inseamna divide si cucereste .
E N D
Divide et Impera De CaciorMihai Divide et imperaprovine din latina, inseamna divide sicucereste. Divide et impera se bazează pe principiul descompunerii problemei în două sau mai multe subprobleme, care se rezolvă, iar soluția pentru problema inițială se obține combinând soluțiile subproblemelor.
#include<iostream> using namespace std; int v[20]; intsuma(inta,int z) {int m,d1,d2; if(a!=z) {m=(a+z)/2; d1=suma(a,m); d2=suma(m+1,z); return d1+d2;//pentrusuma return d1*d2;//pentruprodus } else return v[a]; } int main() { int n; cout<<"n="; cin>>n; for(int i=1;i<=n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } cout<<"sumaeste "<<suma(1,n); } Suma/Produluselementelorunui vector Metodapresupunedescompunereavectorului v in subvectorisiacestiasuntimpartiti la randullorpanacandfiecare vector are un element. Elementelevectorilorsuntadunatisauinmultitipe rand doicatedoipanarezultasolutiafinala.
Elementul maxim sau minim dintr-un vector #include<iostream> using namespace std; int v[20]; intmaxmin(int a, int z) { intx,y,m; m=(a+z)/2; if (a<z) //pentru maxim if(a>z) //pentru minim { x = maxmin(a,m); y = maxmin(m+1,z); if (x<y) return y; else return x; } else return v[a]; } int main() { int n; cout<<"n="; cin>>n; for(int i=1;i<=n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } cout<<"max/min este "<<maxmin(1,n); } Cmmdcsicmmmc-ul a douanumere. #include <iostream> using namespace std; intcmmdc(inta,int b) { int r; r=a%b; while(r!=0) { a=b; b=r; r=a%b; } return b; } intcmmmc(int a, int b) { return(a*b/cmmdc(a,b)); } int main() { intx,y; cout<<"x="; cin>>x; cout<<"y="; cin>>y; cout<<"C.m.m.d.ceste "<<cmmdc(x,y)<<endl; cout<<"C.m.m.m.ceste "<<cmmmc(x,y)<<endl; }
Turnurile din hanoi • Se dau 3 tijesimbolizateprina,b,c. Petija a se gasesc n discuri de diametrediferite, asezate in ordinedescrescatoare a diametrelor. Se ceresa se mute de petija a pe b, utilizandcatijaintermediaratija c, toatecele n discuri. • Rezolvare: • Daca n=1 se face mutarea a-b. • Daca n=2 se facmutarile a-c,a-b,c-b. • Daca n>2 descompunemprogramul in subprograme in care n<2 sirezolvam. #include<iostream> using namespace std; char a,b,c; int n; inthanoi(intn,chara,char b, char c) { if(n==1) cout<<a<<b<<" "; else { hanoi(n-1,a,c,b); cout<<a<<b<<" "; hanoi(n-1,c,b,a); } } int main() { cout<<"n=";cin>>n; hanoi(n,'a','b','c'); }
Cautareabinaraintr-un vector #include<iostream> using namespace std; intn,x,v[10],m; intcaut(ints,int d) { if(s>d) return -99; else { m=(s+d)/2; if(x==v[m]) return m; if(x<v[m]) return caut(s,m-1); else return caut(m+1,d); } } int main() { cout<<"n= ";cin>>n; cout<<"x= ";cin>>x; cout<<"dati "<<n<<" elemente (in ordinecrescatoare)"<<endl; for(int i=1;i<=n;i++) cin>>v[i]; cout<<"elementul "<<x<<" a fostgasitpepozitia: "<<caut(1,n); return 0; } Se cauta un element datintr-un vector cu elementecrescatoare. Cu metoda divide et imperavectorulesteinpartit, elementulcautatestecomparat cu mijloculvectoruluidacaestemai mare se cauta in jumatareavectorului de dupamijloc, iardacaestemaimic se cauta in jumatateadinainteamijlocului. Dacelementul nu estegasit se afiseaza -99.
Sortareaprininterclasare, Mergesort #include<iostream> using namespace std; int a[100],n; intinterclasare(inti,intm,int j) { int b[100]; int x=i; int k=1; int y=m+1; while(x<=m && y<=j) if (a[x]<a[y]) b[k++]=a[x++]; else b[k++]=a[y++]; while (x<=m) b[k++]=a[x++]; while (y<=j) b[k++]=a[y++]; int t=i; for (k=1;k<=(j-i)+1;k++) a[t++]=b[k]; } intdei(inti,int j) { if (i<j) { int m=(i+j)/2; dei(i,m); dei(m+1,j); interclasare(i,m,j); } Vectorul se desparte cu metoda divide et imperapanacandfiecare vector are un singur element. Acestivectorisuntordonatisicompunsolutia. int main() { int i; cout<<"n="; cin>>n; for(int i=1;i<=n;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } dei(1,n); for(i=1;i<=n;i++) cout<<a[i]<<' '; return 0; }
Metoda Quicksort SortareRapida • Quicksort efectueazasortareabazandu-se pe o strategie divide et impera. Astfel, el impartelista de sortatindouasublistemaiusor de sortat. • Pasiialgoritmuluisunt: • Se alege un element al listeinumit pivot • Se reordoneazalistaastfelincattoateelementalemaimicidacatpivotulsa fie plasateinainteapivotuluisitoateelementalemaimarisa fie dupa pivot. • Se sorteazarecursizsublista de elementemaimicidecatpivotulsisublista de elementemaimaridecatpivotul.