我們先來使用遞迴的方法實現斐波那契數列:
// 遞迴解決斐波那契問題
public static int f(int n)
遞迴求值的缺點是什麼呢?就是大量數值會被重複計算。舉個例子,我們在計算f(5)的時候計算了f(4)和f(3),在計算f(4)的時候又計算了f(3)和f(2),這裡的f(4)就被重複計算了。如果資料量夠大的話,被重複計算的資料會耗費大量的時間。我們可以通過乙個陣列記錄計算過的資料,來節省時間,這樣一來時間上基本就達到最優了,但空間複雜度為o(n):
這種是自頂向下,記憶化搜尋的方式
// 加了乙個快取陣列,記錄計算過的值
static int memo;
public static int fib1(int n)
return memo[n];
}
還可以再對空間進行優化,這樣空間複雜度也是o(1):
這是自底向上,動態規劃
// 動態規劃解決斐波那契問題
矩陣快速冪(以斐波那契數列為例)
問題描述 小 w 發現了乙個神奇的數列 1 2 3,1 1,2 1 這就是著名的 fibonacci sequence 眾所周知,小 m 的數學超級超級好,於是給小 w 出了一道題 給小 w 兩個數 x,y,其中 x y 2 31 1。小 w 任務就是求出 fibonacci 數列第 x y 項的和...
以斐波那契數列為例 淺嚐記憶化搜尋
記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,...
斐波那契數列 動態規劃入門
斐波那契數列的定義是 f n 1 f n f n 1 有幾種解法 遞迴法 原理 把 f n 問題的計算拆分成 f n 1 和f n 2 兩個子問題的計算,並遞迴,以 f 0 和 f 1 為終止條件。缺點 大量重複的遞迴計算,例如 f n 和 f n 1 兩者向下遞迴需要 各自計算 f n 2 的值。...