Proiect Informatica Metoda Divide et impera Divide et

  • Slides: 22
Download presentation
Proiect Informatica

Proiect Informatica

Metoda “Divide et impera” Divide et impera se bazează pe principiul descompunerii problemei în

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ă.

Determinarea sumei elementelor unui vector

Determinarea sumei elementelor unui vector

#include<iostream> using namespace std; int suma(int a[100], int s, int d) { if(s==d) return

#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; }

Determinarea elementului maxim”

Determinarea elementului maxim”

#include <iostream> using namespace std; int v[10], n; int max(int i, int j) {

#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; }

Determinarea cmmdc-ului:

Determinarea cmmdc-ului:

include<iostream> int cmmdc(int a[20], int li, int ls) { if(li==ls) return a[li]; else {

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

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: PAS 1: Se mută primele n-1 discuri de pe tija sursă pe tija de manevră. PAS 2: Se mută discul cu diametrul cel mai mare de pe tija sursă pe tija de destinaţie. PAS 3: Se mută cele n-1 discuri de pe tija de manevră pe tija de destinaţie.

Problema turnurilor din Hanoi:

Problema turnurilor din Hanoi:

#include<iostream> using namespace std; void hanoi(int n, char a, char b, char c) {

#include<iostream> using namespace std; void hanoi(int n, char a, 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() {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

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ă.

Cautare binara:

Cautare binara:

#include<iostream> using namespace std; int v[100], n, nr; void caut(int p, int u) {

#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

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.

Metoda Mergesort:

Metoda Mergesort:

void mergesort(int a[], int st, int m, int dr) while (k < j) {

void mergesort(int a[], int st, int m, int dr) while (k < j) { a[k++] = b[i++]; int b[100]; int i, j, k; i = 0; j = st; void merge(int a[], int st, int dr) // copiem prima jumatate a vectorului a in b while (j <= m) if (st < dr) b[i++] = a[j++]; {int m = (st+dr)/2; i = 0; k = st; // copiem inapoi cel mai mare elementmerge(a, st, la fiecare pasm); while (k < j && j <= dr) merge(a, m+1, dr); if (b[i] <= a[j]) a[k++] = b[i++]; mergesort(a, st, m, dr); 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

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ă.

Metoda Quicksort

Metoda Quicksort

void QUICKSORT(int inf, int sup) { int x, i, j, t; i=inf; j=sup; x=A[(i+j)/2];

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 realizat acest proiect: Stoica Bianca Chirca Adrian Voicu Ciprian Constantin Alexandru

Au realizat acest proiect: Stoica Bianca Chirca Adrian Voicu Ciprian Constantin Alexandru

Va multumim pentru atentie!

Va multumim pentru atentie!