Fibonacci sequence两种实现算法及其复杂度分析
2017-08-18 11:14
316 查看
定义Fibonacci问题:f(0) = f(1) = 1; 对于n≥2,f(n) = f(n - 1) + f(n - 2)
时间复杂度的关系式为T(n)=T(n−1)+T(n−2),这种递归式的时间复杂度计算用常规方法无法求得,需要通过解二阶线性齐次差分方程来得出时间复杂度。
推导如下:
特征方程为x2−x−1=0
解得这个一元二次方程的解为:x=(1±5√2)
因而T(n)的通解为T(n)=c1(1+5√2)n+c2(1−5√2)n
代入T(0)=T(1)=1求得c1=⎛⎝⎜1+(15√)2⎞⎠⎟,c2=⎛⎝⎜1−(15√)2⎞⎠⎟
于是得到最后的时间复杂度为T(n)=⎛⎝⎜1+(15√)2⎞⎠⎟(1+5√2)n+⎛⎝⎜1−(15√)2⎞⎠⎟(1−5√2)n
因为只有一层while循环,因此其时间复杂度为O(n)
最后贴出测试代码
运行结果
8
34
另外还有一种复杂度为O(logn)的算法,在下次专题分析。
|递归实现
最简单的实现方式是使用递归算法,然而这种方法的时间复杂度较大。int Fib1(int n){ if(n < 2) return 1; else return Fib1(n-1)+Fib1(n-2); }
时间复杂度的关系式为T(n)=T(n−1)+T(n−2),这种递归式的时间复杂度计算用常规方法无法求得,需要通过解二阶线性齐次差分方程来得出时间复杂度。
推导如下:
特征方程为x2−x−1=0
解得这个一元二次方程的解为:x=(1±5√2)
因而T(n)的通解为T(n)=c1(1+5√2)n+c2(1−5√2)n
代入T(0)=T(1)=1求得c1=⎛⎝⎜1+(15√)2⎞⎠⎟,c2=⎛⎝⎜1−(15√)2⎞⎠⎟
于是得到最后的时间复杂度为T(n)=⎛⎝⎜1+(15√)2⎞⎠⎟(1+5√2)n+⎛⎝⎜1−(15√)2⎞⎠⎟(1−5√2)n
|非递归算法
如果说递归是由上往下求解,非递归的思想就是由下往上,从F(2)=F(1)+F(0)开始逐层向上求解。采用中间变量a和b逐个累加的思想,迭代最终求出F(n)int fib2(int n) { if(n < 2) return 1; else{ int a = 1; int b = 1; int c; while(n > 1) { c = a; a = a + b; b = c; n--; } return a; } }
因为只有一层while循环,因此其时间复杂度为O(n)
最后贴出测试代码
#include "stdio.h"
int fib1(int n)
{
if(n < 2) return 1;
else return fib(n-1) + fib(n-2);
}
int fib2(int n) { if(n < 2) return 1; else{ int a = 1; int b = 1; int c; while(n > 1) { c = a; a = a + b; b = c; n--; } return a; } }
int main()
{
printf("%d\n",fib1(5));
printf("%d",fib2(8));
return 0;
}
运行结果
8
34
另外还有一种复杂度为O(logn)的算法,在下次专题分析。
相关文章推荐
- 数据结构(基于python实现)02-算法复杂度分析
- 杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析
- 常见排序算法的C语言实现以及算法复杂度分析(持续更新)
- Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版
- 循环队列的实现与分析,两种方法,算法导论10.1-4
- 算法-QuickSort及其复杂度分析
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- [转] Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版
- 求最大子序列和的四种经典方法及其算法时间复杂度分析
- 素数判断的几种方法代码实现及其复杂度分析
- 最大子序列和及其算法复杂度分析
- 算法 插入排序 的 JS实现及时间复杂度分析
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 【google面试题】求1到n的正数中1出现的次数的两种思路及其复杂度分析
- 杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析
- 素数判断的几种方法代码实现及其复杂度分析
- Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版
- 经典内部排序算法学习总结(算法思想、可视化、Java代码实现、改进、复杂度分析、稳定性分析)
- 实现数组元素倒序的算法,写出两种实现,时间复杂度为O(n)和O(n/2)
- 复杂网络K-Shell算法及其Python实现