make it work, make it right, make it fast!斐波那契數列:即從遞迴(效率往往不能讓人滿意)到 迭代!
最low遞迴解法:
第43項 需要1秒
第67項 需要1天
第92項 需要3生三世
所以嚴格意義上來講,這根本不算是乙個演算法!
int
fib(n)
很明顯這和上到第n個台階(每次上1個或2個)有多少種方法是一樣的。
實現方法中有有大量重複計算和遞迴。因此我們怎麼解決呢?
最容易想到的方法就是把之前算過的數存下來,然後當需要用的時候取出來。
迭代: 以下方法越來越好,嘿嘿
記憶(memoization)
將已計算過例項的結果製表備查。
動態規劃(dynamic programing)
顛倒計算方向:由自頂向下遞迴,改為自底而上的迭代。
//t(n) = o(n) 只需要o(1)的空間
f =0
; g =1;
//fib(0), fib(1)
while(0
< n--
)return g;
演算法與資料結構 動態規劃
動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...
演算法與資料結構 動態規劃
用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...
資料結構與演算法練習 動態規劃
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...