部分复杂度问题

算法的时间复杂度:

算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O表示法,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。

下面是部分时间复杂度对比:


算法的空间复杂度:

空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序时间复杂度是O(n^2),空间复杂度是O(1)。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

分析一个算法所占用的 存储空间要从各方面综合考虑。如对于 递归算法来说,一般都比较简短,算法本身所占用的 存储空间较少,但运行时需要一个附加 堆栈,从而占用较多的临时工作单元;若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。

我们来看几个简单的实例:

(斐波那契数列的非递归)

//#include<iostream>
//#include<cassert>
//using namespace std;
//unsigned long long Fib_NonR(long long n)
//{
//	assert(n>=0);
//	if(n==0||n==1)
//		return n;
//	else
//	{
//		long long frist,second;
//		long long ret=0;
//	for(int i=2;i<=n;i++)
//	{
//	frist=i-1;
//	second=i-2;
//	ret=frist+second;
//	frist=second;
//	second=ret;
//	}
//	return ret;
//	}
//}
//int main()
//{
//	int ret=Fib(4);
//	cout<<ret<<endl;
//	system("pause");
//return 0;
//}
//
时间复杂度:O(n)
空间复杂度:O(1)

斐波那契数列的递归

#include<iostream>
using namespace std;
long long FibArray(long long n)
{
	if(n==0||n==1)
		return n;
	else 
		return FibArray(n-1)+FibArray(n-2);
}
int main()
{
	cout<<FibArray(100)<<endl;
	system("pause");
	return 0;
时间复杂度:O(2^N)

空间复杂度:O(N)

二分法查找一个数(递归):

#include<iostream>
//using namespace std;
//int bin_search(int *arr,int left,int right,int key)
//{
//	while(left<=right)
//	{
//		int equal=(left+right)/2;
//	if(key>equal)
//	{
//	return bin_search(arr,equal+1,right, key);
//	}
//	else if(key<equal)
//	{
//	return bin_search(arr,equal,equal-1,key);
//	}
//	else
//		return arr[equal];
//	}
//	return -1;	
//}
//int main()
//{
//	int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12};
//	int key=15;
//	int ret=bin_search(arr,0,sizeof(arr)/sizeof(arr[0]),key);
//	cout<<ret<<endl;
//	system("pause");
//	return 0;
//}
时间复杂度:O(log2 N)
空间复杂度:O(N)

因此,递归并不一定是最好的,在写程序之前应该比较不同方法的时间和空间复杂度,再进行选择。

未完待续!!!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值