This is an old revision of the document!
Laboratorul 11: Divide et Impera și programare dinamică
1. Obiectivele laboratorului
2. Metoda Divide et Impera
2.1 Prezentare generală
Această metodă se poate aplica problemelor care permit descompunerea lor în subprograme independente (numele procedurii traducându-se prin împarte și stăpânește.) Așadar obținem 3 faze principale:
Divide - împarte problema în una/mai multe probleme similare de dimensiuni mai mici.
Stăpânește - rezolvă subproblemele recursiv (dacă dimensiunea subproblemelor este mică, se rezolvă iterativ).
Combină - combină soluțiile sub-problemelor pentru a obține soluția problemei inițiale.
2.2 Implementare
void divide_et_impera(int P[],int n,int S[]{
if(n <= n0 )
Determină S prin metode elementare;
else {
Împarte P in:P1,P2,...,Pa
divide_et_impera(P1,S1);
................................................
divide_et_impera(Pa,Sa);
Asamblează (S1,...,Sa,S);\
}
}
2.3 Probleme tip rezolvate cu acest algoritm
2.3.1 Determinarea rădăcinilor unei ecuații
Se dă o funcție care are semne contrare în cele doua capete ale intervalului [a,b],f(α) * f(β) < 0.
Determinați o rădăcină a lui f din intervalul [a,b] cu o eroare ε.
Pentru rezolvarea problemei folosim următoarea strategie: împărțirea repetată a intervalului inițial [α,β] în jumătăți ale acestuia și selectarea intervalului jumătății în care se află soluția (Metoda bisecției)
Fie funcția f:[α,β] → R, continuă. Determinarea aproximației Δ', a rădăcinii exacte Δ, cu eroarea ε.
Notăm cu m mijlocul intervalului ( m=(α+β)/2 )
Verificăm dacă f(m) * f(b) < 0, ceea ce înseamnă că soluția se află în a doua jumătate a intervalului și îi atribuim lui α valoarea lui m.
Altfel daca f(m) * f(b) > 0, soluția se află în prima jumătate a intervalului și ii atribuim lui β valoarea lui m.
Acest procedeu se aplică în mod repetat până când lungimea intervalului scade cu 2*ε(β - α < 2*ε)
3. Programare dinamică
3.1 Definiție
3.2 Algoritm
4. Exerciții laborator