برنامه نویسی

برنامه نویسی پویا چیست؟ – انجمن DEV

برنامه نویسی پویا عمدتاً یک بهینه سازی ساده است بازگشت. هر جا یک راه حل بازگشتی دیدیم که برای ورودی های یکسان تماس های مکرر دارد، می توانیم آن را با استفاده از آن بهینه کنیم. برنامه نویسی پویا.
ایده این است که به سادگی نتایج مشکلات فرعی را ذخیره کنیم، به طوری که مجبور نباشیم بعداً در صورت نیاز آنها را دوباره محاسبه کنیم.

این بهینه سازی ساده پیچیدگی های زمانی را از نمایی به خطی کاهش می دهد.

به عنوان مثال، اگر یک راه حل بازگشتی ساده برای فیبوناچی بنویسیم، پیچیدگی زمانی نمایی به دست می آید و اگر آن را با ذخیره کردن راه حل های مسائل فرعی بهینه کنیم، پیچیدگی زمانی به خطی کاهش می یابد.

اگر با Big O Notation آشنا نیستید، در نهایت یک پست خواهم نوشت. اما به زبان ساده، نماد Big O برای طبقه‌بندی الگوریتم‌ها بر اساس چگونگی رشد زمان اجرا یا فضای مورد نیاز با افزایش اندازه ورودی استفاده می‌شود.

به عبارت دیگر:

برنامه نویسی پویا به سادگی یک تکنیک بهینه سازی با استفاده از کش است، برای ذخیره مقادیر محاسبه شده قبلی و برگرداندن این مقادیر هر زمان که نیاز باشد، بدون نیاز به محاسبه مجدد آنها.
ما این مقادیر را در کش (که معمولاً یادداشت نامیده می شود) با استفاده از ساختار داده هاشمپ برای دسترسی سریع ذخیره می کنیم.


انواع برنامه نویسی پویا

توجه به این نکته مهم است که دو رویکرد برای برنامه نویسی پویا وجود دارد. حفظ کردن و جدول بندی.

یکی از پرکاربردترین مثال‌ها هنگام معرفی برنامه‌نویسی پویا و بازگشت، دنباله فیبوناچی است.

به تصویر زیر دقت کنید:

دنباله فیبوناسی

در این تصویر ما Fibonnaci 5 را محاسبه می کنیم.
مقادیر برجسته شده محاسبات مکرر را نشان می دهد، که می توانیم هر زمان که برای اولین بار آنها را محاسبه می کنیم، آنها را در حافظه پنهان ذخیره کنیم، این اطمینان حاصل می کند که هر زمان که به این مقادیر نیاز بود آنها را دوباره محاسبه نمی کنیم.

این یک مثال ساده است. با این حال، برای اینکه دید وسیع تری از پیشرفت بزرگ برنامه نویسی پویا به شما ارائه دهیم، تصور کنید که باید فیبوناچی 30 را محاسبه کنیم، در اینجا چند محاسبه انجام می دهیم:

بدون DP: 2692537 محاسبات
با DP: 59 محاسبات


یک تفاوت بسیار شگفت انگیز، فکر نمی کنید؟

بیایید ببینیم چگونه می توانیم DP را با بهبود راه حل بازگشتی Fibonnaci پیاده سازی کنیم.

فیبوناسی بازگشتی

function fib(n) {
    if (n < 2) {
        return n;
    } else {
        return fib(n-1) + fib(n-2)
    }
}
// Time Complexity - O(2^n)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Fibbonaci با حافظه

function dynamicFib(n, cache) {
    let cache = cache || {};
    if(cache[n]) return cache[n]

    // base case
    if (n < 2) return n;

    return cache[n] = dynamicFib(n-1, cache[n]) + dynamicFib(n-2, cache[n])
}
// Time Complexity - O(n)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای تمرین دانش جدید به دست آمده، من شما را تشویق می کنم که مشکل لیت کد زیر را حل کنید: بالا رفتن از پله ها

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا