《编程之美》读书笔记08:2.9 Fibonacci序列 —— O(log n)求Fibonacci数列(非矩阵法)
来源:互联网 发布:java future 方法 编辑:程序博客网 时间:2024/05/22 09:45
《编程之美》读书笔记08:2.9 Fibonacci序列 计算Fibonacci序列最直接的方法就是利用递推公式 F(n+2)=F(n+1)+F(n)。而用通项公式来求解是错误的,用浮点数表示无理数本来就有误差,经过n次方后,当n相当大时,误差能足够大到影响浮点数转为整数时的精度,得到的结果根本不准。 用矩阵来计算,虽然时间复杂度降到O(log n),但要用到矩阵类,相当麻烦。观察: F(n+2)=F(n)+F(n-1)=2*F(n-1)+F(n-2)=3*F(n-2)+2*F(n-4) 用归纳法很容易证明 F(n) = F(k)*F(n+1-k) + F(k-1)*F(n-k),利用该递推公式和原递推公式,要计算F(n),只要计算F([n/2])和F([n/2]+1),时间复杂度为 O(lg n)。如:要计算F(58),由 58 -> 29,30 -> 14,15 -> 7,8 -> 3,4 -> 1,2 可知只要算5次。可以用一个栈保存要计算的数,实际上,将n的最高位1(假设在第k位)左边的0去除掉后,第m次要计算的数是第k位到第k-m+1位这m个位组成的值t(m),则第m-1次要计算的数为t(m-1),且 t(m)=2*t(m-1)+(第k-m+1位是否为1)。 若第m-1次计算得到了f(k)和f(k+1),则第m次计算: 第k-m+1位 已计算 待计算 1 f(k) f(k+1) f(2*k+1),f(2*k+2) 0 f(2*k),f(2*k+1)
具体公式见下面代码。
下面是计算F(n)最后四位数(某道ACM题)的代码。
- 《编程之美》读书笔记08:2.9 Fibonacci序列 —— O(log n)求Fibonacci数列(非矩阵法)
- Fibonacci序列 —— O(log n)求Fibonacci数列(非矩阵法)
- 编程之美 斐波拉契数列 log(n) Fibonacci
- 读书笔记之编程之美 - 2.9 斐波那契(Fibonacci)数列
- 编程之美2.9fibonacci数列method3
- POJ-3070-Fibonacci-求Fibonacci的矩阵方法,O(log(n))
- fibonacci 数列实现 log(n) and O(n)
- 编程之美2.9节之Fibonacci数列
- 编程之美 2.9 斐波那契(Fibonacci)数列
- 3070 Fibonacci(O(log n)求解 )
- POJ-3070 Fibonacci(矩阵快速幂求Fibonacci数列)
- 求fibonacci数列(递归+非递归)
- O(logn)求Fibonacci数列
- O(logn)求Fibonacci数列
- O(logn)求Fibonacci数列
- 编程之美读书笔记2.16—求数列中最长递增序列
- 编程之美--求Fibonacci
- 编程之美2.9-斐波那契(Fibonacci)数列
- 编程之美读书笔记_2.17 数组循环移位
- 编程之美读书笔记——目录
- 编程之美读书笔记_1.4 买书问题
- 编程之美读书笔记_1.8 小飞的电梯调度算法
- 编程之美读书笔记_1.13 NIM(3)两堆石头的游戏
- 《编程之美》读书笔记08:2.9 Fibonacci序列 —— O(log n)求Fibonacci数列(非矩阵法)
- 有关select左右移动、上下移动、双击移动效果代码
- 毕设小窥
- ping 127.0.0.1 和 本机的ip地址,数据包会发到网卡上面吗?
- fork函数使用随笔
- 2010年
- ziti
- SQL操作全集
- Granting cmd.exe access to Git - 类似svn的方式操作git