Tehnike dinamikog programiranja ta je dinamiko programiranje Dinamiko

  • Slides: 11
Download presentation
Tehnike dinamičkog programiranja

Tehnike dinamičkog programiranja

Šta je dinamičko programiranje? Dinamičko programiranje je naziv za tehniku rešavanja složenih algoritamskih problema

Šta je dinamičko programiranje? Dinamičko programiranje je naziv za tehniku rešavanja složenih algoritamskih problema kojom značajno možemo smanjiti složenost algoritama. Ovom tehnikom početni složeni problem rastavljamo na podprobleme (eng. Subproblems) manje složenosti koji su međusobno zavisni. Svaki podproblem se rešava najviše jednom, čime možemo izbeći višestruko računanje numeričkih karakteristika istog stanja. Osnovna ideja na koju se oslanjaju algoritmi dinamičkog programiranja je da se svaki dobijeni međurezultat, odnosno rešenje podproblema, spremi te zatim kada se sledeći put naiđe na taj isti podproblem, izbegne njegovo ponovno rešavanje. Postoji veliki broj problema koji možemo rešiti na ovaj način te je ova tehnika široko primenjiva u praksi. Pre samog rešavanja određenog problema vrlo je važno utvrditi možemo li za njegovo rešavanje primeniti tehniku dinamičkog programiranja. Kao što je ranije rečeno dva osnovna uslova za primenu ove tehnike su da problem ima optimalnu podstrukturu te da su podproblemi glavnog problema međusobno povezani(zavisni).

Glavni problem(zadatak) dinamičkog programiranja je podeliti na više problema manje složenosti koji su međusobno

Glavni problem(zadatak) dinamičkog programiranja je podeliti na više problema manje složenosti koji su međusobno povezani te nakon toga svaki od tih problema rešiti najviše jednom kako bi se došlo do konačnog rešenja. Rešavanje svakog podproblema najviše jednom postiže se pomoću dva osnovna pristupa rešavanju problema: • pristup „Odozgo prema dole“ (eng. Top-down approach) • te pristup „Odozdo prema gore“ (eng. Bottom-up approach). Pristup „Odozgo prema dole“ temelji se na tome da se osnovni problem rastavi na podprobleme te da se ti podproblemi reše i pamte se njihova rešenja. U slučaju kada se naiđe na problem koji je već prethodno rešen, samo se očita spremljeno rešenje tog problema iz tablice rešenja. Ovakva tehnika čuvanja rešenja podproblema naziva se memoizacija. Kod pristupa „Odozdo prema gore“ najpre se rešavaju najjednostavniji podproblemi te se zatim njihova rešenja koriste za nalaženje složenijih i tako sve dok se ne dođe do konačnog rešenja. Ovaj pristup u nekim slučajevima može biti efikasniji u kontekstu potrošnje memorije, ali je ponekad teško odrediti koji su podproblemi potrebni za rešavanje datog problema.

Za razliku od nekih algoritama u kojima se pojavaljuju potproblemi koji se ponavljaju, kod

Za razliku od nekih algoritama u kojima se pojavaljuju potproblemi koji se ponavljaju, kod dinamičkog programiranja, jedan potproblem se rešava samo jednom. Na primer, u Fibonačijevom nizu F 3 = F 1 + F 2 i F 4 = F 2 + F 3 - računanje svakog broja zahteva nalaženje F 2. Kako su F 3 i F 4 potrebni za nalaženje F 5, naivnim pristupom bi za računanje F 5 bilo potrebno nalaženje F 2 nekoliko puta. Kada se potproblemi ponavljaju više puta, naivnim pristupom se često izgubi dosta vremena na traženje njihovih otimalnih rešenja, koji su već rešeni. Kako bi se ovo izbeglo, potrebno je sačuvati rešenja onih problema koji su već rešeni, kako bi se mogli kasnije iskoristiti. Ovo se još naziva i memoizacija. Ukoliko je očigledno da rešeni potproblemi nisu više potrebni, mogu se odbaciti kako bi se sačuvao memorijski prostor. Dinamičko programiranje se koristi kod: • Potproblema koji se ponavljaju • Optimalne podstrukture • Memoizacije.

Zadatak: Fibonačijev niz Napisati: a) rekurzivnu verziju, b) iterativni verziju funkcija koje računaju n-ti

Zadatak: Fibonačijev niz Napisati: a) rekurzivnu verziju, b) iterativni verziju funkcija koje računaju n-ti član Fibonačijevog niza c) rekurzivnu verziju sa memoizacijom

Rešenje: REKURZIVNO i NEEFIKASNO REŠENJE

Rešenje: REKURZIVNO i NEEFIKASNO REŠENJE

ITERATIVNO REŠENJE, EFIKASNIJE OD PRETHODNOG

ITERATIVNO REŠENJE, EFIKASNIJE OD PRETHODNOG

REKURZIVNO EFIKASNIJE REŠENJE SA MEMOIZACIJOM Analiza rešenja: U slučaju da se rekurzijom problem svodi

REKURZIVNO EFIKASNIJE REŠENJE SA MEMOIZACIJOM Analiza rešenja: U slučaju da se rekurzijom problem svodi na više manjih podproblema koji se mogu preklapati, postoji opasnost da se pojedini podproblemi manjih dimenzija rešavaju veći broj puta. Na primer, fibonacci(20) = fibonacci(19) + fibonacci(18) fibonacci(19) = fibonacci(18) + fibonacci(17) tj. problem fibonacci(18) se resava dva puta. Problemi manjih dimenzija će se rešavati još veći broj puta. Rešenje za ovaj problem je kombinacija rekurzije sa tzv. "dinamičkim programiranjem" tj. podproblemi se rešavaju samo jednom, a njihova rešenja se pamte u memoriji (obično u nizovima ili matricama), odakle se koriste ako tokom rešavanja ponovo budu potrebni.

Zadatak za vežbu: Napiši program koji određuje broj kombinacija bez ponavljanja dužine k iz

Zadatak za vežbu: Napiši program koji određuje broj kombinacija bez ponavljanja dužine k iz skupa od k elemenata (tj. broj različitih kombinacija u igri loto ako se iz bubnja koji sadrži n loptica izvlači njih k). – Upotrebiti metodu dinamičkog programiranja (memoizaciju). Na sledećem slajdu zadatak je rešen metodom dinamičkog programiranja naviše. Ulaz: 3 5 Izlaz: 10 Ukoliko uradite zadatak, rešenje zadatka poslati na mail profesora. Ovaj deo nije obavezan.

Rešenje metodom dinamičkog programiranja naviše

Rešenje metodom dinamičkog programiranja naviše