此聲明不正確。但它幾乎是正確的。
一般動態規劃解決方案需要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)
。
並非所有的動態編程問題都需要你使用額外的空間,而任何自上而下的自上而下都可以轉換爲自下而上以防止堆棧溢出。 –
@ C.B。在最壞的情況下,底層/自上而下不會在大O符號方面改變空間複雜性。 – amit