6-Laboratoriya ishi Mavzu: Dinamik programmalash


Download 92.17 Kb.
bet1/4
Sana14.05.2023
Hajmi92.17 Kb.
#1459469
  1   2   3   4
Bog'liq
6-tajriba. Algoritm loyihalash


6-Laboratoriya ishi
Mavzu: Dinamik programmalash.
Dinamik programmlash bu – murakkab masalani uni osonroq bo’lgan qism masalalarga bo’lish orqali yechish usuli. Masalan bizda qandaydir masala bor. Uni qanday usulda yechishni bilmaymiz. Shu holda uni kichikroq bo’laklarga ajratamiz, bu bo’laklarni ham qanday qilib yechish noma’lum bo’ladi. Ular o’z navbatida kichiroq masalalarga ajratiladi. Natijada ohir oqibat uni ajratib bo’lmaydigan masalaga keladi va uning yechimi aniq bo’ladi. Boshqa masalalarning yechiimi esa u orqali ajratilgan kichikroq masalalar yechimlaridan hosil qilinadi.
Dinamik programmalash masalasini yechish uchun quyidagi bosqichlarni amalga oshirish kerak:
1) Dinamika holati: Qism masalalarnini aniqlash.
2)Boshlang’ich holatlar qiymatlari.
3) Holatlar o’rtasidagi o’tishlar ya’ni qayta hisoblash formulasi.
4) Qayta hisoblash tartibi.
5) Javobni olish: Ba’zan bu yig’indi yoki ohirgi holatlardan maksimal/minimal qiymati bo’ladi.


Qayta hisoblash tartibi:
Qayta hisoblash tartibi uch xil turi bor.
1)Tog’ri tartib.
Holatlar allaqachon hisoblangan holatlar natijalardan foydalanib qayta hisoblanib boriladi:

2) Teskari tartib.
Hozirgi holatga bog’liq bo’lgan keyingi holatlar qayta hisoblanib boriladi.

3)Erinchoq dinamika.
Bunda qiymatlar rekursiv ko’rinishda bo’ladi. Bu asiklik grafda chuqurlik bo’yicha izlash algoritmiga o’xshash bo’ladi. Bunda uchlar halatlar, holatlar o’rtasidagi o’tishlar esa qirralar bo’ladi. Biror hisoblangan qiymat ikkinchi marta hisoblanib o’tirmaydi va avval hisoblangan natija qaytariladi.

Masalan Fibonatchi sonlarini uchta usul bo’yicha hisoblashni ko’rib chiqaylik.



  1. To’g’ri tartib

fib[1] = 1; // boshlang’ich holat
fib[2] = 1; // boshlang’ich holat
for (int i = 3; i ≤ n; i++) {
fib[i]:=fib[i-1]+fib[i-2] // i holatini qayta hisoblash
}

  1. Teskari tartib

fib[1] = 1; // boshlang’ich holar
for (int i = 3; i ≤ n; i++) {
fib[i+1]:=fib[i] // i+1 holatini yangilash
fib[i+2]:=fib[i] // i+2 holatini yangilash
}

  1. Erinchoq dinamika

int fib[] = {-1}; // dastlab -1 ga to’ldiramiz, bu uning qiymati hali hisoblanmaganligini bildiradi.
int get_fib(int i) {
if (i ≤ 2) {
fib[i] = 1; //boshlang’ich holar
return 1;
}
if (fib[i] != -1) {// Avval hisoblanganmi
return fib[i]; // erinchoqlik qilib hisoblangan qiymatni qaytaradi
}
fib[i] = get_fib(i-1)+ get_fib(i-2);
return fib[i];
}
Har bir usul o’zining qo’llanilish o’rinlariga ega, ba’zida esa ularning istalgan birini qo’llashimiz mumkin.
Dinamik programmalashni o’rganishning eng yaxshi usuli bu ko’piroq masala yechish. Shuning uchun uni masalalarda ko’proq ko’rib chiqqan ma’luq:

Download 92.17 Kb.

Do'stlaringiz bilan baham:
  1   2   3   4




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling