关于斐波那契数列的算法比较

来源:互联网 发布:我要说汉语阅读优化 编辑:程序博客网 时间:2024/05/16 02:01


如果没看过钱能的<C++程序设计教程>的,下面我写的这个东西希望能给你们带来一点收获.看过钱能的书的,希望大家能多多交流.

在论坛的开发语言的C++区中,有人提到过有没有人有什么有趣的C语言题目.我当时推荐了这个斐波那契(Fibonacci)数列,最开始我没看钱能的书,也没编写出具体程序,只给了个大概思路,这里,钱能用C++将几种解决方法都写出来了,看了深有启发.

题目:古典题目,有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有的兔子都不死,问每个月的兔子总数为多少。对应的数列就是斐波那契(Fibonacci)数列:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n> 1).

思考:学习到了循环语句后老师就出了母牛问题给我们做.题目和兔子问题类似,思路也相同,程序显得相当简单.下面钱能给出了四个解决斐波那契(Fibonacci)数列的程序:
算法1:
int fibo1(int n)
{
if(n==0) return 0;
if(n==1) return 1;
return fibo1(n-1)+fibo1(n-2);
}

算法2:
int fibo2(int n)
{
int a=0,c;
for(int b=1,c,i=2; i<=n; ++i)
c=a+b,a=b,b=c;
return c;
}

算法3:
int fibo3(int n)
{
vector<int> v(n+1,0); v[1]=1;
for(int i=2; i<=n; ++i)
v=v[i-1]+v[i-2];
return v[n];
}

算法4:
int fibo4(int n)
{
return (pow((1+sqrt(5.0))/2,n)-pow((1-sqrt(5,0))/2,n))/sqrt(5.0);
}


这里列出了4个算法.下面就详细说明一下四个算法:
1. 递归算法:最好理解的算法,和人的思路相当接近,对应的数学描述很清晰,容易编程.但是在C++语言中是使用栈机制实现的,如果使用递归函数,将会占用大量的内存资源,对内存中的栈区进行掠夺,在大量调用递归函数之后很可能造成内存崩溃,就算不崩溃,也会是长时间的运算.在调用了clock函数后,计算出了递归函数的耗时,是四个函数中最大的.而且这是个致命的缺点.时间复杂度为O(2n)(括号内为2的n次方).

2.循环函数算法:这个方法需要对整个数列有一定的把握,并且能看出其中的规律,用我们班的一位同学说的"就是不停的赋值& quot;.说的很形象,这样就是一个循环的过程,每次调用fibo2,都会一次次循环,时间复杂度为O(n2)(括号内为n的平方)

3.循环向量函数算法:同算法2类似,都是以循环来解决问题,但是算法3用向量先分配了一定的空间来实现,然后逐个求得向量的元素,最后得到数列的第n项值,这样就比算法2耗费更多的时间来进行下标操作,所以耗时比算法2多.

4.数学公式算法:使用一个数学公式来进行计算,几乎不耗什么时间,一次运算就可以得到结果,时间和n的取值没有太大关系,只和运算性能有关.

具体算法写出来后,首先排除算法1,这个算法太耗时,并且没有可取之处.其他三个算法是各有千秋,但是可以人为的测试时间:
环境1:在循环加到一百万次时,分别取n为15,30,45得出算法2是最优的,时间消耗最少,少于0.3秒,算法3从1.4秒增加到3秒,算法4基本不变,始终为2.1秒左右.这样我们就可以看出,算法2虽然比较复杂,但是效率最高,程序员追求的就是这个效果,让机器运算的最快.

环境2:在文件中读取自变量,比较算法2和算法3,文件中有一万个数据时算法2和算法3耗时几乎相同为1.7秒,但是文件中有三万个数据时算法2耗时5.6秒,算法3几乎没变,此时算法3显得更优.

(时间复杂度的解释说明:假设某算法的计算时间是f(n),其中变量可以是输入或输出量,也可以是两者之和或者其他可以计算时间的元素,一般以运算使用次数作时间,那么如果这个算法在某台机器上运行时,所用的时间总是n,n2,2n,logn,n!,nm这些常量函数的一个常数倍,那么就说这个算法的时间复杂度对应的是n,n2,2n,logn,n!,nm.)这些常量函数为n,n的平方,2的n次方,log n ,n的阶乘,n的m次方.
如果这个算法的时间复杂度不能跨越数量级而只是成倍数增长,比如算法a的时间复杂度是n,算法b的时间复杂度是2n,那么这两个算法的时间复杂度都是n.在各种算法中,O(n)表示时间复杂度为n,其他类似.
O(1)< O(logn)<O(n)<O(nlogn)<O(n2)<O(2n)<O(n!)<O(nn)
 
 
原创粉丝点击