This is an old revision of the document!


Laboratorul 11: Divide et Impera și programare dinamică

1. Obiectivele laboratorului

  • Înțelegerea noțiunilor de bază legate metoda de programare divide et impera
  • Înțelegerea noțiunii de programare dinamică

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

  1. Aproximaţi, printr-o abordare de tip Divide et Impera, cu o eroare (relativă) de maxim 1e-6, funcţia sqrt(n) (extragerea rădăcinii pătrate a unui număr). Nu aveţi voie să folosiţi nicio funcţie din „math.h“. Încercaţi să extindeţi exerciţiul pentru extragerea radicalului de ordin 3.
  2. Aproximaţi, printr-o abordare de tip Divide et Impera, cu o eroare (relativă) de maxim 1e-3, funcţia lg(n) (extragerea logaritmului în baza 10). Aveţi voie să vă folosiţi de funcţia pow(bază, exp) din „math.h“.
sda-aa/laboratoare/12.1621828772.txt.gz · Last modified: 2021/05/24 06:59 by cristian.rusu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0