斐波那契数列算法及时间复杂度分析
2015-08-04 20:59
2296 查看
斐波那契数列算法及时间复杂度分析
斐波那契数列是一个很有意思的数列,应用领域非常广.定义:
F(n+1)=F(n)+F(n-1)
有意思的是,F(n)/F(n+1)趋于黄金分割0.618.
如何计算斐波那契数呢?
最朴素的思想,利用定义.
算法1代码如下:
T(n+1)=T(n)+T(n-1)=2*T(n-1)+T(n-2)=…=F(n)+F(n-1)=F(n+1)
由于直接递归调用,结果中的每一个1都来自最底层的F(1)和F(2),
那么为了求第n个数,就要调用F(n)次函数.
由于斐波那契数列是指数增长,所以该算法的时间复杂度也是指数增长,即O(2^n).
仔细想下,从头开始往后算,也不过是线性复杂度,比算法1好太多了.
于是得到算法2:
求斐波那契数列的算法还能再快一些吗?
答案是肯定的.
算法3:
借助下图所示的结论:
我们求一个矩阵的n次方即可.
两个2维矩阵的乘法次数可以看作常量.
矩阵额n次方利用分治法,只需要O(lg n)的复杂度就能计算出来.
所以该算法的复杂度是O(lg n),比算法2又快了很多,特别是数字非常大的时候.
比如n从1亿变成4亿,算法2需要的时间要变成原来的四倍,但是算法3仅仅增加了个常数2(lg 4=2).
算法代码如下:
算法1计算n=42和算法2计算n=400 000 000所需的时间差不多.
由此可见,指数时间复杂度的算法太可怕…
但是算法3对于n=400 000 000也几乎一瞬间就算完了.
相关文章推荐
- php实现斐波那契数列的简单写法
- 漫谈递归:从斐波那契开始了解尾递归
- 漫谈递归:递归需要满足的两个条件
- 斐波那契(Fibonacci)的算法优化
- 求斐波那契数(fibonacci)--c语言版
- 斐波那契数列的低效与高效解法
- 实现斐波那契数列的几种方法
- javascript 斐波那契数列
- Java学习日记之方法
- Climbing Stairs
- nyoj 76 超级台阶
- Python - 求斐波那契数列前N项之和
- 求第n个斐波那契数
- 斐波那契(面向对象方法实现和规律实现两种方法)
- java面试,斐波那契数问题
- 何时使用递归
- 斐波那契数列求第N项的值
- 输出斐波那契数列的算法
- 求斐波那契数列的第 n 项的值
- 【九度oj】1387 1388 1389 1390 斐波那契数列