This shows you the differences between two versions of the page.
sda-aa:laboratoare:12 [2021/05/23 23:52] cristian.rusu |
sda-aa:laboratoare:12 [2021/05/26 11:58] (current) cristian.rusu [4. Exerciții laborator] |
||
---|---|---|---|
Line 14: | Line 14: | ||
* Divide - împarte problema în una/mai multe probleme similare de dimensiuni mai mici. | * 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). | + | * 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. | * Combină - combină soluțiile sub-problemelor pentru a obține soluția problemei inițiale. | ||
Line 39: | Line 39: | ||
Se dă o funcție care are semne contrare în cele doua capete ale intervalului [a,b],f(α) * f(β) < 0. | 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 ε. | 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) | + | 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 ε. | + | * Fie funcția f:[α,β] → R, continuă. Determinarea aproximației Δ', a rădăcinii exacte Δ, cu eroarea ε. |
* Notăm cu m mijlocul intervalului ( m=(α+β)/2 ) | * 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. | + | * 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. | + | * 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*ε) | * Acest procedeu se aplică în mod repetat până când lungimea intervalului scade cu 2*ε(β - α < 2*ε) | ||
Line 53: | Line 53: | ||
=== 3.1 Definiție === | === 3.1 Definiție === | ||
+ | |||
+ | Programarea dinamică presupune rezolvarea unei probleme prin descompunea ei în subprobleme și rezolvarea acestora. Spre deosebire de divide et impera, subprogramele nu sunt disjuncte, ci se suprapun. | ||
+ | |||
+ | Pentru a evita recalcularea porțiunilor care se suprapun, rezolvarea se face pornind de la cele mai mici subprograme și folosindu-ne de rezultatul acestora calculăm subproblema imediat mai mare. Cele mai mici subprobleme sunt numite subprobleme unitare, acestea putând fi rezolvate într-o complexitate constantă, ex:cea mai mare secvență dintr-o mulțime de un singur element. | ||
=== 3.2 Algoritm === | === 3.2 Algoritm === | ||
+ | <note important>Pași ce trebuie urmați: | ||
+ | * Identificarea structurii și a matricilor utilizate în caracterizarea soluției optime | ||
+ | * Determinarea unei metode de calcul recursiv pentru a afla valoarea fiecărei subprobleme | ||
+ | * Calcularea „bottom-up“ a acestei valori (de la subprogramele cele mai mici la cele mai mari) | ||
+ | * Reconstrucția soluției optime pornind de la rezultatele obținute anterior | ||
+ | </note> | ||
==== 4. Exerciții laborator ==== | ==== 4. Exerciții laborator ==== | ||
- | - | + | - 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. |
+ | - 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“. | ||
+ | - Construiți o funcție care calculează f(n), unde f = șirul lui Fibonacci (cu și fără memoizare). Comparați timpii de rulare. n este numar intreg (pozitiv si negativ). | ||
+ | - Aveți la dispoziție monedele 25, 10, 5 și 1 RON. Calculați cu PD toate posibilitățile de rest (cu și fără memoizare). |