以斐波那契数列为例分析递归算法的时间复杂度和空间复杂度

 

首先来波概念:

   递归算法的时间复杂度:递归的总次数*每次递归的数量。

   递归算法的空间复杂度:递归的深度*每次递归创建变量的个数。

  那什么是斐波那契额数列呢?对于菲波那切数列有典型的生兔子的的问题,在这我就不多说了,感兴趣的同学可以自行查找资料来了解,简单的说,菲波那切数列数列就是前两项是1,后面的每项是其前两项之和。比如:1 1 2 3 5 8 13....

   下边我们来分别用不同的方法来求一下斐波那契。

(1)首先采用递归的方法来求一下:

#define _CRT_SECURE_NO_WARNINGS
 #include<stdio.h>
int Fib(int n){if (n < 3)
{
return 1;
}else{
return Fib(n - 1) + Fib(n - 2);
}}int main()
{int n = 50;int ret = Fib(n);printf("%d\n", ret);getchar();
}

 

在递归调用过程中Fib(3)被计算了2次,Fib(2)被计算了3次。Fib(1)被调用了5次,Fib(0)中被调用了3次。所以,递归的效率低下,但优点是代码简单,容易理解。

 递归算法时间复杂度为(二叉树的节点个数):O()=(2^h)-1=2^n。空间复杂度为树的高度:h即o(n).

(2)可用尾递归方法来求,尾递归若优化,空间复杂度可达到o(1),但时间复杂度是o(n);

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
long Fib(long first, long second, long n){
	if (n < 3)
		return 1;
	if (3 == n)
	{
		return first + second;
	}
	return Fib(second, first + second, n - 1);

}
int main()
{
	int n = 5;
	int ret = Fib(1,1,5);
	printf("%d\n", ret);
	getchar();
}

 


(3) 采用循环结构实现。

 

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
long Fib(long first, long second, long n){
	int third = 0;
	if (n < 3)
		return 1;
	while (n >3){
		int temp = second;
	second = first + second;
	first = temp;
	
	n--;
}
	third = first + second;
	return third;
	
}
int main()
{
	int n = 6;
	int ret = Fib(1,1,n);
	printf("%d\n", ret);
	getchar();
}

 

此时时间复杂度达到了o(n),空间复杂度达到了o(1).

所以综上所述,求菲波那切数列最好使用循环的方式。

最后来科普一下,常用时间复杂度所耗费的时间从小到大依次是o(1)<o(log2n)<o(n)<o(nlog2n)<o(n^2)<o(n^3)<o(2^n)<o(n!)<o(n^n).

 

 

 

 

  • 25
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
算法分析基础——Fibonacci序列问题 分治法在数值问题中的应用——最近点对问题 减治法在组合问题中的应用——8枚硬币问题 变治法在排序问题中的应用——堆排序问题 动态规划法在图问题中的应用——全源最短路径问题 3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间的最短路径,还有输出最短路径的长度; (4)设计一个权重为负的图或有向图的例子,对于它,Floyd算法不能输出正确的结果 3. 实验要求 1)设计与实现堆排序算法; 2)待排序的数据可以手工输入(通常规模比较小,10个数据左右),用以检测程序的正确性;也可以计算机随机生成(通常规模比较大,1500-3000个数据左右),用以检验(用计数法)堆排序算法的时间效率 3. 实验要求 1)设计减治算法实现8枚硬币问题; 2)设计实验程序,考察用减治技术设计的算法是否高效; 3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。 3. 实验要求 1)使用教材2.5节中介绍的迭代算法Fib(n),找出最大的n,使得 第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具体的执行时间; 2)对于要求1),使用教材2.5节中介绍的递归算法F(n)进行计算,同样给出具体的执行时间,并同1)的执行时间进行比较; 3)对于输入同样的非负整数n,比较上述两种算法基本操作的执行次数; 4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间复杂度为Θ(1); 5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值