Реализация мемоизации против поиска в динамическом программировании

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

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

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

Я прав здесь? Или я что-то упускаю?


person matsko    schedule 30.07.2012    source источник


Ответы (2)


Что ж, я думаю, что вы в основном даете слишком ограничительное определение «запоминания», которое на самом деле представляет собой просто любой метод хранения ранее вычисленных результатов, а не их повторного вычисления. Таким образом, вычисление Фибоначчи, в котором сохраняются все результаты до предыдущего максимума n, является запоминающим, как и алгоритм DP, в котором сохраняются ранее вычисленные подзадачи.

(См. статью в Википедии.)

person Charlie Martin    schedule 30.07.2012
comment
Верно. Точно. Но меня больше беспокоит количество вызовов функций, которые пришлось бы выполнять с подходом мемоизации по сравнению с подходом DP. С DP вам обычно не нужно вызывать кешированную функцию, поскольку вы сначала просматриваете ее данные, а с мемоизацией вы все равно вызываете функцию и позволяете функции проверять свой кеш. Это звучит правильно? - person matsko; 30.07.2012
comment
Нет, это своего рода деталь реализации. Рассмотрим снова вопрос Фибоначчи: если вы знаете, скажем, что массив запомненных значений является глобальным, вы можете просто проверить перед вызовом, есть ли уже значение для F_n. - person Charlie Martin; 30.07.2012

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

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

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

person Amir Afghani    schedule 30.07.2012