400 likes | 1.13k Views
Proiect Informatica. Metoda “Divide et impera ”.
E N D
Metoda “Divide et impera” Divide et impera se bazează pe principiul descompunerii problemei în două sau mai multe subprobleme (mai ușoare), care se rezolvă, iar soluția pentru problema inițială se obține combinând soluțiile subproblemelor. De multe ori, subproblemele sunt de același tip și pentru fiecare din ele se poate aplica aceeași tactică a descompunerii în (alte) subprobleme, până când (în urma descompunerilor repetate) se ajunge la probleme care admit rezolvare imediată.
#include<iostream> using namespace std; int suma(int a[100], int s, int d) { if(s==d) return a[s]; else return suma(a,s,(s+d)/2)+suma(a,(s+d)/2+1,d); }int main() {int a[100],n,i; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; cout<<suma(a,1,n); return 0;}
#include <iostream> using namespace std; int v[10],n; int max(int i, int j) { int a, b, m; if (i==j) return v[i]; else {m = (i+j)/2; a = max(i, m); b = max(m+1, j); if (a>b) return a;else return b; } } int main( ) { cout<<"n=";cin>>n; for (int i=1; i<=n; i++) {cout<<"v["<<i<<"]="; cin>>v[i]; } cout<<"max="<<max(1,n); return 0; }
include<iostream> int cmmdc(int a[20], int li, int ls) { if(li==ls) return a[li]; else { int x,y; x=cmmdc(a,li,(li+ls)/2); y=cmmdc(a,(li+ls)/2+1,ls); while(x!=y) if(x>y) x=x-y; else y=y-x; return x; } }int main() {int a[20],n,i; cout<<"n="; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; cout<<"cmmdc este: "<<cmmdc(a,1,n);}
Informeaza-te: Turnul din Hanoi sau Turnurile din Hanoi este un joc matematic. Este format din trei tije şi un număr variabil de discuri, de diferite mărimi, care pot fi poziţionate pe oricare din cele 3 tije. Jocul începe având discurile aşezate în stivă pe prima tijă, în ordinea mărimii lor, astfel încât să formeze un turn. Folosind metoda Divide et Impera problema va fi descompusă in subprobleme astfel: PAS1: Se mută primele n-1 discuri de pe tija sursă pe tija de manevră. PAS2: Se mută discul cu diametrul cel mai mare de pe tija sursă pe tija de destinaţie. PAS3: Se mută cele n-1 discuri de pe tija de manevră pe tija de destinaţie.
#include<iostream> using namespace std; void hanoi(intn,chara,charb,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() {int n; char a='a',b='b',c='c'; cin>>n; hanoi(n,a,b,c); return 0;}
Informeaza-te: Algoritmul de căutare binară este un algoritm de căutare folosit pentru a găsi un element într-o listă ordonată (tablou unidimensional/vector). Algoritmul funcționează pe baza tehnicii divide et impera. Valoarea căutată este comparată cu cea a elementului din mijlocul listei. Dacă e egală cu cea a acelui element, algoritmul se termină. Dacă e mai mare decât acea valoare, algoritmul se reia, de la mijlocul listei până la sfârșit, iar dacă e mai mică, algoritmul se reia pentru elementele de la începutul listei până la mijloc. Întrucât la fiecare pas cardinalul mulțimii de elemente în care se efectuează căutarea se înjumătățește, algoritmul are complexitate logaritmică.
#include<iostream> using namespace std; int v[100], n, nr; void caut(int p, int u) { int m = (p+u)/2; if (nr==v[m]) cout<<"gasit, indice="<<m; else if (p<u) if (nr<v[m]) caut(p, m-1); else caut(m+1, u); else cout<<"nu a fost gasit."; } int main( ) {cout<<"n="; cin>>n; for (int i=1; i<=n; i++) {cout<<"v["<<i<<"]=";cin>>v[i];} cout<<"nr="; cin>>nr; caut (1,n); return 0; }
Informeaza-te: Algoritmii de sortare prin insertie si prin selectie necesita timp patratic , atat in cazul mediu cat si in cazul nefavorabil. Cu toate ca acesti algoritmi sunt excelenti pentru cazuri mici (elemente putine ) , pentru cazuri mari (foarte multe elemente ) avem algoritmi mai eficienti. Cativa algoritmi de sortare sunt : merge sort si quick sort.
while (k < j) a[k++] = b[i++]; void merge(int a[],int st, int dr) if (st < dr) {int m = (st+dr)/2; merge(a,st, m); merge(a,m+1, dr); mergesort(a,st, m, dr); } } void mergesort(int a[],int st, int m, int dr) { int b[100]; int i, j, k; i = 0; j = st; // copiem prima jumatate a vectorului a in b while (j <= m) b[i++] = a[j++]; i = 0; k = st; // copiem inapoi cel mai mare element la fiecare pas while (k < j && j <= dr) if (b[i] <= a[j]) a[k++] = b[i++]; else a[k++] = a[j++]; // copiem elementele ramase daca mai exista
Informeaza-te: Quicksort efectuează sortarea bazându-se pe o strategie divide et impera. Astfel, el împarte lista de sortat în două subliste mai ușor de sortat Pașii algoritmului sunt: Se alege un element al listei, denumit pivot. Se reordonează lista astfel încât toate elementele mai mici decât pivotul să fie plasate înaintea pivotului și toate elementele mai mari să fie după pivot. După această partiționare, pivotul se află în poziția sa finală. Se sortează recursiv sublista de elemente mai mici decât pivotul și sublista de elemente mai mari decât pivotul. O listă de dimensiune 0 sau 1 este considerată sortată.
void QUICKSORT(int inf,int sup) { int x,i,j,t; i=inf; j=sup; x=A[(i+j)/2]; do{ while ((i<sup)&&(A[i]<x)) i++; while ((j>inf)&&(A[j]>x)) j--; if (i<=j) { t=A[i]; A[i]=A[j]; A[j]=t; i++; j--; } }while (i<=j); if (inf<j) QUICKSORT(inf,j); if (i<sup) QUICKSORT(i,sup); }
Au realizatacestproiect: Stoica Bianca Chirca Adrian VoicuCiprian ConstantinAlexandru