Fibonacci sequence两种实现算法及其复杂度分析
来源:互联网 发布:淘宝如何查看累计消费 编辑:程序博客网 时间:2024/06/03 17:59
定义Fibonacci问题:f(0) = f(1) = 1; 对于n≥2,f(n) = f(n - 1) + f(n - 2)
|递归实现
最简单的实现方式是使用递归算法,然而这种方法的时间复杂度较大。
int Fib1(int n){ if(n < 2) return 1; else return Fib1(n-1)+Fib1(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
|非递归算法
如果说递归是由上往下求解,非递归的思想就是由下往上,从
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
另外还有一种复杂度为
阅读全文
0 0
- Fibonacci sequence两种实现算法及其复杂度分析
- 算法-QuickSort及其复杂度分析
- 算法复杂度的分析方法及其运用
- 算法复杂度的分析方法及其运用
- 排序算法及其复杂度(JavaScript实现)
- 【算法-ACM-素数】求素数的算法及其复杂度分析
- 对比Fibonacci两种算法效率
- LintCode算法题:Fibonacci Sequence
- 七种排序算法及其复杂度
- 求最大子序列和的四种经典方法及其算法时间复杂度分析
- 巩固基础篇:算法复杂度的分析方法及其运用
- 常见排序算法实现及复杂度分析
- 排序算法实现及复杂度分析(一)
- 排序算法实现及复杂度分析(二)
- 排序算法实现及复杂度分析(三)
- 深度优先搜索算法详解及其两种实现
- 素数判断的几种方法代码实现及其复杂度分析
- 素数判断的几种方法代码实现及其复杂度分析
- Dynamic Web Project 的学习笔记
- 实时灯光屏幕渐变
- opencv中的画图函数转载学习
- AngualrJS(十四)$watch 1
- 解决在VC++6.0中遇到GetPrivateProfileIntA读值错误的问题
- Fibonacci sequence两种实现算法及其复杂度分析
- 正则表达式入门_多字符匹配
- EL表达式和JSTL标签库使用
- N3D
- java算法-冒泡排序
- C++拷贝构造函数详解
- 1668: 高桥和低桥
- redis必杀高级:管道技术
- 线段树查询区间最大最小值