Sunteți pe pagina 1din 2

Metoda Divide et impera Descrierea generala a metodei: Divide et Impera este o metoda generala de elaborare a algoritmilor ce consta in doua

etape: Divide: Problema data este in doua sau mai multe subprogram de acelasi tip,dar de dimensiuni mai mici. Subproblemele se rezolva direct, daca dimensiunea lor permite aceasta (cazuri elementare), sau, fiind de acelasi tip, se rezolva in mod recursive, prin acelasi procedeu. Impera: Se combina solutiile pentru a obtine Solutia problemei initiale. Pentru a intuit mai bine cum functioneaza aceasta metoda, sa ne gandim la modul de organizare al unui turneu de tenis. Concurentii participant sunt impartiti in doua grupe. Se organizeaza turneul in cadrul fiecarei grupe, iar finala se va disputa intre cei doi castigatori ai turneului pe grupe. Castigatorul finale este castigatorul intregului turneu. Organizarea turneului pe grupe se face dupa acelasi procedeu: se impart concurentii din cadrul grupei pe semigrupe, se organizeaza turneul pe semigrupe, iar castigatorul grupei se decide intr-un meci de semifinal intre cei doi castigatori din cele doua semi grupe s.a.m.d. Impartirea se repeat pana cand avem doar doi jucatori, care joaca un meci direct. Pentru a descrie intr-un mod cat mai general aceasta metoda, sa consideram ca functia Divide_et_impera() trebuie sa resolve o problema de dimensiune d sis a obtina Solutia problemei in parametrul SolP. Pentru aceasta, se impart problema data in n s subprobleme. Cum nu este obligatoriu ca subproblemele sa aiba aceeasi dimensiune,retinem in vectorul ds dimensiunile celor ns subprobleme. Rezolvam cele ns subprobleme, apeland pentru fiecare dintre ele functia Divide_et_impera() si retinem solutiile obtinute in vectorul s. Prin combinarea solutiilor subproblemelor din vectorul s, obtinem Solutia problemei date. Void Divide_et_impera(int d; solutie &SolP) { /*functia rezolva o problema de dimensiune d, retinand Solutia in parametrul de tip variabila SolP*/ Int ds[NMaxSubprobleme],ns,i; Solutie d[NmaxSubprobleme]; If (d<e) //problema se poate rezolva direct Prelucrare(d,SolP); Else

{ Divide(d,SolP); /*imparte problema in ns subprobleme, ale caror dimensiuni sunt retinute in vectorul ds*/ For (i=0; i<=ns; i++) Divide_et_Impera(ds[i],s[i])); //rezolva cele ns subprobleme in acelasi mod Combina(ns,s,SolP); //combina solutiile subproblemelor, pentru a obtine Solutia problemei initiale Metoda pare destul de complicate, dar in realitate este mult mai simplu. In cele mai multe situatii, problema se imparte in doua subprobleme de dimensiuni aproximativ egale.

Expresia Divide Et Impera provine din limba latina si a constituit unul dintre principiile de guvernare ale imparatului roman, Iulius Caesar. In traducere inseamna dezbina si cucereste si exprima un adevar, din pacate valabil si in ziua de azi: o masa de oameni poate fi mai usor stapanita, atunci cand este dezbinata! Numele acestei metode de programare arata foarte clar in ce consta ea: prin analogie cu exemplul din istorie, o problema poate fi mult mai usor stapanita si astfel rezolvata, daca este despicata in mai multe parti.

Observatii: Algoritmii Divide et Impera sunt in general rapizi, deoarece prin descompunere, de cele mai multe ori, se obtin problem pentru care rezolvarea si combinarea solutiilor au un grad de complexitate mai mic decat problema initiala. Algoritmii Divide et Impera se implementeaza, de obicei, intr-un subprogram recursiv.

S-ar putea să vă placă și