您的位置:首页 > 产品设计 > UI/UE

Fibonacci sequence两种实现算法及其复杂度分析

2017-08-18 11:14 316 查看
定义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);
}


时间复杂度的关系式为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)的算法,在下次专题分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐