来源:我的博客站 OceanicKang |《C++ 数据结构(一)绪论(6)动态规划(1)》
上一篇:《C++ 数据结构(一)绪论(5)迭代与递归(3)》
fib():递归
f i b ( n ) = f i b ( n − 1 ) + f i b ( n − 2 ) : 0 , 1 , 1 , 2 , 3 , 5 , 8... fib(n) = fib(n-1) + fib(n-2):{0, 1, 1, 2, 3, 5, 8 ...} fib(n)=fib(n−1)+fib(n−2):0,1,1,2,3,5,8...
int fib(n) {
return (2 > n) ? n : fib(n - 1) + fib(n - 2);
}
fib():递推方程
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ 复杂度:& \begin{c…
fib():封底估算
ϕ = 1 + 5 2 = 1.61803 ⋯ \phi = \frac{1 + \sqrt{5}}{2} = 1.61803 \cdots ϕ=21+5=1.61803⋯
fib() 计算第 43 项大致需要 1 s
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & \phi^{36} \a…
fib() 计算第 67 项大致需要 1 day
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & \phi^5 \appr…
fib() 计算第 92 项大致需要 3 century
ϕ 92 ≈ 1 0 19 f l o ≈ 1 0 10 s e c ≈ 1 0 5 d a y ≈ 3 c e n t u r y \phi^{92} \approx 10^{19} flo \approx 10^{10} sec \approx 10^5 day \approx 3 century ϕ92≈1019flo≈1010sec≈105day≈3century
fib():递归跟踪
递归版 fib() 低效的根源在于,各递归实例均被大量重复调用
fib():迭代
解决方法A:记忆
memoization:将已计算过实例的结果制表备查
解决方法B:动态规划
dynamic programming:颠倒计算方向,由自顶而下递归改为自底而上迭代
f = 0; g = 1; // fib(0); fib(1)
while (o < n--) {
g = g + f;
f = g - f;
}
return g;
T ( n ) = O ( n ) , 而 且 仅 需 O ( 1 ) 空 间 T(n) = O(n),而且仅需 \ O(1) \ 空间 T(n)=O(n),而且仅需 O(1) 空间
n | f | g | ||
---|---|---|---|---|
0 | 0 | 1 | ||
1 | 1 | 1 - 0 | 1 | 1 + 0 |
2 | 1 | 2 - 1 | 2 | 1 + 1 |
3 | 2 | 3 - 1 | 3 | 2 + 1 |
4 | 3 | 5 - 2 | 5 | 3 + 2 |
… | f | g | ||
… | f’ | g’ - f | g’ | g + f |