Я думаю, что динамическое программирование - это подмножество 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
И Мемоизация, и Динамическое Программирование решают отдельные подзадачи только один раз.
Мемоизация использует рекурсию и работает сверху вниз, тогда как динамическое программирование движется в противоположном направлении, решая проблему снизу вверх.
Ниже приводится интересная аналогия -
Сверху вниз - сначала вы скажете, что я завладею миром. Как ты это сделаешь? Вы говорите, что сначала я захватлю Азию. Как ты это сделаешь? Я сначала возьму на себя Индию. Я стану главным министром Дели и т.д. И т.д.
Вверх - Вы говорите, что я стану СМ Дели. Затем возьму на себя Индию, затем все другие страны Азии и, наконец, я возьму на себя весь мир.