В чем разница между memoization и динамическим программированием?

Я думаю, что динамическое программирование - это подмножество memoization. Правильно?

Ответ 1

В чем разница между запоминанием и динамическим программированием?

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

Динамическое программирование - это методика решения задач рекурсивного характера, итеративная, которая применима, когда вычисления подзадач перекрываются.

Динамическое программирование обычно реализуется с использованием табуляции, но также может быть реализовано с использованием запоминания. Итак, как вы можете видеть, ни один из них не является "подмножеством" другого.


Разумный последующий вопрос: в чем разница между табулированием (типичная методика динамического программирования) и запоминанием?

Когда вы решаете задачу динамического программирования с использованием табуляции, вы решаете проблему " снизу вверх ", то есть, сначала решая все связанные подзадачи, обычно заполняя n-мерную таблицу. На основании результатов в таблице, затем вычисляется решение "верхней"/исходной проблемы.

Если вы используете памятку для решения проблемы, вы делаете это, поддерживая карту уже решенных подзадач. Вы делаете это " сверху вниз " в том смысле, что сначала решаете "верхнюю" проблему (которая обычно повторяется для решения подзадач).

Хороший слайд отсюда (ссылка сейчас мертва, слайд все еще хорош):

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

Дополнительные ресурсы:


Это было переписано как статья здесь.

Ответ 2

Динамическое программирование - это алгоритмическая парадигма, которая решает данную сложную проблему, разбивая ее на подзадачи и сохраняя результаты подзадач, чтобы избежать повторного вычисления тех же результатов.

http://www.geeksforgeeks.org/dynamic-programming-set-1/

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

Посмотрите эту дискуссию о запоминании против табуляции.

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

Ответ 3

Динамическое программирование часто называют Memoization!

  • Воспоминание - это метод сверху вниз (начать решение данной проблемы, разбив его), а динамическое программирование - это восходящая техника (начните решать из тривиальной подзадачи, вплоть до данной проблемы)

  • DP находит решение, начиная с базового футляра (ов) и работает вверх. DP решает все подзадачи, потому что делает это снизу вверх

    В отличие от Memoization, которая решает только необходимые суб-проблемы

  • DP имеет потенциал для преобразования экспоненциально-временных решений грубой силы в алгоритмы полиномиального времени.

  • DP может быть намного более эффективным, поскольку его итеративный

    Наоборот, Memoization должна оплачивать (часто значительные) накладные расходы из-за рекурсии.

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

Ответ 4

(1) Memoization и DP, концептуально, на самом деле одно и то же. Потому что: рассмотрим определение DP: "перекрывающиеся подзадачи" и "оптимальная подструктура". Воспоминание полностью обладает этими 2.

(2) Запоминание - это DP с риском - это глубокая рекурсия. DP снизу вверх не имеет этого риска.

(3) Память нуждается в хеш-таблице. Таким образом, дополнительное пространство и некоторое время поиска.

Итак, чтобы ответить на вопрос:

-Conceptually, (1) означает, что они одно и то же.

-Внимание (2), если вы действительно хотите, memoization является подмножеством DP, в некотором смысле, что проблема, разрешаемая memoization, будет разрешима DP, но проблема, разрешаемая DP, может быть не разрешена путем memoization (поскольку это может привести к переполнению стека).

-Внимание (3), они имеют незначительные отличия в производительности.

Ответ 5

Из Википедии:

запоминание

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

Динамическое программирование

В математике и информатике динамическое программирование - это метод для решения сложных задач, разбивая их на более простые подзадачи.

При разбиении проблемы на более мелкие/более простые подзадачи мы часто сталкиваемся с одной и той же подзадачей более одного раза - поэтому мы используем Memoization для сохранения результатов предыдущих вычислений, поэтому нам не нужно их повторять.

Динамическое программирование часто сталкивается с ситуациями, когда имеет смысл использовать memoization, но вы можете использовать любую технику, не обязательно используя другую.

Ответ 6

И Мемоизация, и Динамическое Программирование решают отдельные подзадачи только один раз.

Мемоизация использует рекурсию и работает сверху вниз, тогда как динамическое программирование движется в противоположном направлении, решая проблему снизу вверх.

Ниже приводится интересная аналогия -

Сверху вниз - сначала вы скажете, что я завладею миром. Как ты это сделаешь? Вы говорите, что сначала я захватлю Азию. Как ты это сделаешь? Я сначала возьму на себя Индию. Я стану главным министром Дели и т.д. И т.д.

Вверх - Вы говорите, что я стану СМ Дели. Затем возьму на себя Индию, затем все другие страны Азии и, наконец, я возьму на себя весь мир.