Чи є принципова різниця між динамічним програмуванням «зверху вниз» та «знизу вгору»?
Зокрема, чи існує проблема, яку можна вирішити знизу вгору, але не зверху вниз? Або підхід знизу вгору є лише розкручуванням повторення підходу зверху вниз?
Чи є принципова різниця між динамічним програмуванням «зверху вниз» та «знизу вгору»?
Зокрема, чи існує проблема, яку можна вирішити знизу вгору, але не зверху вниз? Або підхід знизу вгору є лише розкручуванням повторення підходу зверху вниз?
Відповіді:
Для використання методу знизу вгору потрібно вміти ефективно визначати, що таке "дно", що зазвичай означає, що вам потрібно сильно обмежений проблемний простір. Якщо ви знаєте, якими будуть обчислення найнижчого рівня, і порядок залежності збільшується, має сенс ітеративно робити їх у належному порядку та зберігати ці результати. Фактори, наївні Фібоначчі та відношення Ейлера для повторних перегородок є гарними прикладами проблем, що підходять до цього підходу.
Деякі проблеми не мають легко визначити порядок нижнього або залежного для розрахунків. Наприклад, оцінки шахових позицій корисно запам'ятовуються за позицією, при цьому оцінка оцінок зберігається, тому її не потрібно перераховувати. Позиції можуть повторюватися на декількох рівнях дерева пошуку через переміщення та повторення переміщення, тому збереження результатів оцінки варто. Але немає способу дізнатися, які будуть місця на найнижчих рівнях дерева без рекурсивного спуску (та з урахуванням проміжного обрізання), тому зверху вниз - це справді єдиний підхід.
Підхід зверху вниз: це пряме випадання рекурсивної формулювання будь-якої проблеми. Якщо рішення будь-якої проблеми може бути сформульовано рекурсивно, використовуючи рішення для своїх підпроблем, і якщо його підзадачі перекриваються, то можна легко запам’ятати або зберегти рішення підзадач у таблиці. Кожен раз, коли ми намагаємося вирішити нову підзадачу, спочатку перевіряємо таблицю, щоб перевірити, чи вона вже вирішена. Якщо рішення було зафіксовано, ми можемо використовувати його безпосередньо, інакше ми вирішимо підзадачу і додамо її рішення до таблиці.
Підхід знизу: Після того, як ми формулюємо рішення проблеми рекурсивно, як з точки зору її підзадач, ми можемо спробувати переформулювати проблему знизу вгору: спершу спробуйте вирішити підзадачі та використати їх рішення для побудови- і вирішувати більші проблеми. Зазвичай це також робиться в табличній формі шляхом ітеративного генерування рішень для більших і великих субпроблем, використовуючи рішення для малих підзадач. Наприклад, якщо ми вже знаємо значення F41 і F40, ми можемо безпосередньо обчислити значення F42.