程序员成长之旅——Fibonacci sequence时间与空间复杂度

程序员成长之旅——Fibonacci sequence时间与空间复杂度

时间复杂度

递归
//递归算法
long long fib1(size_t N) 
{
 	if (N < 2)
  	return N;
 	return fib1(N - 1) + fib1(N - 2);
}
int main()
{
 	printf("%lld\n", fib1(6));
 	system("pause");
 	return 0;
}  //递归可以使程序看起来比较简洁,但缺点是效率比较低,并且可能导致栈溢出,当需要计算的数稍大一点,就需要很长的计算时间,因此需要灵活使用递归。

递归时间复杂度,以6为例它可以画成一个类似二叉树的样子,虽然不是满二叉树,但是时间复杂度看的都是最坏的结果,所以我们可以暂时将他看成满二叉树,这样的话节点数就是它的次数,高度为h,节点数=2^h-1, 即O(2 ^n)
递归的时间复杂度是: 递归次数*每次递归中执行基本操作的次数,所以时间复杂度是: O(2^N)

非递归
#define _CRT_SECURE_NO_WARNINGS 1
//非递归算法
#include<stdio.h>
#include<stdlib.h>
long long fib1(size_t N) 
{
 	int a = 0, b = 1, c = 0;
 	if (N < 2)
 	{
 		return N;
 	}
 	else 
 	{
  	for (int i = 2; i <= N; ++i)
  	{
   		c = a + b;
   		a = b;
   		b = c;
  	}
 }
 	return c;
}
int main()
{
 	printf("%lld\n", fib1(6));
 	system("pause");
 	return 0;
}  //此算法最大的优点是不存在重复计算,故效率比递归算法快的多得多。

非递归时间复杂度,由于计算了n-1次:
即时间复杂度为:O(n)

空间复杂度

递归

递归最深的那一次所耗费的空间足以容纳它所有递归过程。递归产生的栈侦是要销毁的,所以空间也就释放了,要返回上一层栈侦继续计算+号后面的数,所以它所需要的空间不是一直累加起来的,之后产生的栈侦空间都小于递归最深的那一次所耗费的空间。

递归的深度*每次递归所需的辅助空间的个数
所以:空间复杂度是O(N)

非递归

由于辅助空间是常数级别的

所以:空间复杂度是O(1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零出发——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值