什么是动态规划?
什么是動態規劃?
斐波那契數列 Fibonacci Sequence
F(0) = 1,F(1) = 1,F(n) =F(n-1) + F(n-2)
int fib (int n) {if (n == 0) {return 0;}if (n == 1) {return 1;}return fib(n-1) + fib(n-2); }fib(10) = 55 time : 4 e-06 s
fib(20) = 6765 time : 0.000104 s run function fib() 21891 times
fib(40) = 102334155 time : 1.28333 s run function fib() 331160281 times
fib(42) = 267914296 time : 3.47917 s
指數級別的復雜度,O(2^n)
遞歸樹:
在遞歸樹中進行了大量的重復計算,run function fib(20) 21891 times;run function fib(40) 331160281 times
記憶化搜索
自上而下的解決問題,利用一個 memo 存放已經計算的結果
vector<int> memo;int fib (int n) {if (n == 0) {return 0;}if (n == 1) {return 1;}if (memo[n] == -1) {memo[n] = fib(n-1) + fib(n-2);}return memo[n]; }fib(40) = 102334155 time: 5e-06 s run function fib() 79 times.
fib(1000) = 1556111435 time : 6.5e-05 s run function fib() 1999 times.
(fib(1000) = 1556111435 這個值是錯誤的,超出了int整數的溢出值)
函數被調用的次數的 2^(n-1)
算法復雜度,O(n) 級別
動態規劃
自下而上的解決問題
int fib (int n) {vector<int> memo(n+1, -1);nemo[0] = 0;memo[1] = 1; for (int i = 2; i <= n; i++) {memo[i] = memo[i-1] + memo[i-2];}return memo[n]; }時間復雜度,O(n)
fib(1000) = 1556111435(錯誤) time : 6e-05 s
dynamic programming(also known as dynamic optimization)is a method for solving a complex problem by breaking it down into a collection of simple subproblems,solving each of those subproblems just once,and storing their solutions -ideally,using a memory-based data structure.
將原問題拆解成若干子問題,同時保存子問題的答案,使得每個子問題只求解一次,最終獲得原問題的答案。
總結
- 上一篇: 关于 Hive 报 SemanticEx
- 下一篇: MathType使用