Данное заявление является неверным. Но это почти правильно.
Для динамического программирования требуется O(number of subproblems)
. Другими словами, если есть решение для динамического программирования проблемы, оно может быть реализовано с использованием памяти O(number of subproblems)
.
В вашей конкретной проблеме «вычисления чисел Фибоначчи», если вы записываете простое решение динамического программирования:
Integer F(Integer n) {
if (n == 0 || n == 1) return 1;
if (memorized[n]) return memorized_value[n];
memorized_value[n] = F(n - 1) + F(n - 2);
memorized[n] = true;
return memorized_value[n];
}
он будет использовать O(number of subproblems)
память. Но, как вы упомянули, анализируя повторение, вы можете найти более оптимальное решение, которое использует память O(1)
.
P.S. Повторяемость чисел Фибоначчи, которые вы упомянули, имеет n + 1
подзапросы. Обычно по подзадачам люди ссылаются на все значения f
, которые необходимо вычислить для вычисления определенного значения f
. Здесь вам нужно рассчитать f(0), f(1), f(2), ..., f(n)
, чтобы вычислить f(n)
.
Не все проблемы с динамическим программированием требуют, чтобы вы использовали дополнительное пространство, а любой верхний вниз с memoization можно преобразовать снизу вверх, чтобы предотвратить переполнение стека. –
@ C.B. bottom-tup/top-down не изменяет сложность пространства с точки зрения большой записи O, в худшем случае. – amit