斐波那契数列算法优化
最早研究这个数列的是斐波那契,他当时为了描述如下情况的兔子生长数目:
* 第一个月初有一对刚诞生的兔子
* 第二个月之后(第三个月初)它们可以生育
* 每月每对可生育的兔子会诞生下一对新兔子
* 兔子永远不会死去。
1.性能差的斐波那契数列
long long Fib(int n)
{
if(n<3) return 1;
return Fib(n-1)+Fib(n-2);
}
int main()
{
printf("%d\n",Fib(3));
system("pause");
return 0;
算法分析:
图解:
[以Fib(6)为例进行说明](https://img-blog.csdn.net/20180408194839933?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01pc3NfX0h5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
2^0+2^1+2^2+2^3+...+2^n=a1 (1-q^n)/1-q =2^n
综上该算法的斐波那契数列的时间复杂度为:O(2^n)
空间复杂度为:O(n)
上述算法的菲波那切数列存在效率非常低,对其时间复杂度进行优化。
优化一:采用尾递实现:(尾递归:函数的最后一条语句是对自身的调用,且没有其他的表达式)
long Fib(long first ,long second, long n)
{
if(n<3)
return 1;
else if(n==3)
return first+second;
else
return Fib(second,first+second,n-1);
}
int main()
{
printf("%d\n",Fib(1,1,6));
system("pause");
return 0;
}
图解:
Fib(1,1,6) Fib(1,2,5) Fib(2,3,4) Fib(3,5,3) =3+5=8
综上该算法的斐波那契数列的时间复杂度为:O(n)
空间复杂度为:O(n)
优化二:采用迭代方法实现:(该方法性能最好)
long long Fib(int n)
{
long long first =1;
long long second = 1;
long long ret = 0;
int i = 3;
for(i=3;i<=n;i++)
{
ret =first+second;
first=second;
second =ret;
}
return ret;
}
int main()
{
printf("%d\n",Fib(6));
system("pause");
return 0;
}
综上该算法的斐波那契数列的时间复杂度为:O(n)
空间复杂度为:O(1)