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

Существует много проблем, которые могут быть решены с помощью динамического программирования, например. Наибольшая возрастающая подпоследовательность. Эту проблему можно решить, используя 2 подхода

  • Memoization (Top Down) - использование рекурсии для решения подзадачи и сохранения результата в некоторой хэш-таблице.
  • Табуляция (снизу вверх) - использование итеративного подхода для решения проблемы путем решения меньших подзадач сначала, а затем использования ее во время выполнения более крупной проблемы.

Мой вопрос в том, что лучше подходит с точки зрения сложности времени и пространства?

Ответ 1

Короткий ответ: это зависит от проблемы!

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

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

Ответ 2

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

Ответ 3

Если проблема имеет свойство overlapping sub-problems, то используйте Memoization, иначе это зависит от проблемы