Есть ли разница между динамическим программированием сверху вниз и снизу вверх?


33

Есть ли принципиальная разница между динамическим программированием сверху вниз и снизу вверх?

В частности, существует ли проблема, которую можно решить снизу вверх, но не сверху вниз? Или подход снизу вверх просто раскручивает повторение подхода сверху вниз?

Ответы:


27

Чтобы использовать метод «снизу вверх», вы должны быть в состоянии эффективно определить, что такое «основание», что обычно означает, что вам нужно сильно ограниченное пространство задач. Если вы знаете, каковы будут расчеты самого низкого уровня и порядок зависимостей идет вверх, имеет смысл итеративно выполнять их в правильном порядке и сохранять эти результаты. Факториалы, наивный Фибоначчи и рекуррентное отношение Эйлера для разбиений - все это хорошие примеры проблем, подходящих для этого подхода.

Некоторые проблемы не имеют легко определяемого дна или порядка зависимостей для расчетов. Например, оценки шахматных позиций полезно запоминаются по позициям с сохранением оценочного балла, поэтому их не нужно пересчитывать. Позиции могут повторяться на нескольких уровнях дерева поиска из-за перемещения транспонирования и повторения, поэтому стоит сохранять результаты оценки. Но нет никакого способа узнать, какими будут позиции на самых низких уровнях дерева, без рекурсивного спуска (и с учетом промежуточного сокращения), так что на самом деле единственный возможный подход - сверху вниз.


4
  • Нисходящий подход: это прямое следствие рекурсивной постановки любой проблемы. Если решение какой-либо проблемы может быть сформулировано рекурсивно с использованием решения ее подзадач, и если его подзадачи перекрываются, то можно легко запомнить или сохранить решения подзадач в таблице. Всякий раз, когда мы пытаемся решить новую подзадачу, мы сначала проверяем таблицу, чтобы убедиться, что она уже решена. Если решение записано, мы можем использовать его напрямую, в противном случае мы решаем подзадачу и добавляем ее решение в таблицу.

  • Восходящий подход. Как только мы сформулируем решение проблемы рекурсивно, как в терминах ее подзадач, мы можем попытаться переформулировать проблему снизу вверх: сначала попробуйте решить подзадачи и использовать их решения для построения. и прийти к решению больших подзадач. Обычно это также делается в табличной форме путем итеративной генерации решений больших и больших подзадач с использованием решений небольших подзадач. Например, если мы уже знаем значения F41 и F40, мы можем напрямую рассчитать значение F42.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.