算法的时间和空间复杂度

184 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

1.算法知识点

1.算法是对特定问题求解步骤的一种描述。

2.算法具有有穷性、确定性、可行性和输入输出。

3.好的算法更需要有正确性、易读性、健壮性、高效性和低存储性。即高效率、低存储。

1.1算法时间复杂度

时间复杂度即算法运行需要的时间。

相同配置的计算机进行一次基本运算的时间是一定的,所以我们通常用算法基本运算次数来衡量算法的效率。当n运算次数非常大时,算法的运行时间主要取决于最高项,小项和常数可以忽略不计。

1.2算法空间复杂度

空间复杂度:算法占用的空间大小。

空间复杂度的本意是指算法在运行过程中占用了多少存储空间。 算法所占用的存储空间包括:

1.输入输出数据

2.算法本身

3.额外需要的辅助空间

输入/输出数据占用的空间是必须的,算法本身占用的空间可以通过精简算法来缩减,但缩减的量是很小的,可以忽略不计。算法在运行时使用的辅助变量占用的空间(即辅助空间)才是衡量算法空间复杂度的关键因素。

2.算法题例

int sum=0;
for(int i=0;i<n;i++)
{
	for(int j=0;j<n;j++)
	{
		sum=sum+1
	}
}

这个简单的算法题我可以看出它的时间复杂度为n²,那是因为执行次数的最高项的幂是2.

int sum=0;
int a=0;
int b=0;
for(int i=0;i<n;i++)
{
	a=a+i;
}
for(int j=0;j<n;j++)
{
	b=b+1;
}
sum=a+b

这道算法题也有两个for循环,那么是不是跟第一个算法题一样算法的时间复杂度也是n²呢?答案不是的。因为虽然也有两个for循环,但是上面那个算法题的执行次数是n*n+1.而这个算法题的执行次数却是相加即:n+n,所以算法的时间复杂度是n。

int fac(int n)
{
	if(n==0||n++1)
	return 1;
	else
	return n*fac(n-1);
}

这个是用递归的方法来计算n的阶乘,这里我们知道递归是一种不到最后不回头的方法,不碰到1绝不回头!所以对于中间的函数调用它们也是在占据存储空间,即空间复杂度为n。 那我们换一种解法:

int a=1;
int n=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
	a=a*i;
}
return a;

我们不用递归的方式也能求出n的递归解,但是这里我们的空间复杂度就没有前面那个递归的空间复杂度所占内存空间那么大,这里仅仅只需要常数级的内存空间,也就是1。

3.相关算法题型题目总结

我们常见的算法时间复杂度有以下几类:

常数阶:常数阶算法的运行次数是一个常数,如1,100,200.常数阶算法的时间复杂度通常用O(1)表示。

多项式阶:很多算法的时间复杂度是多项式,通常用O(n),O(n²)来表示。

指数阶:指数阶算法的运行效率极差,指数阶算法的时间复杂度通常为O(n!)表示。

对数阶:对数阶的运行效率较高。

它们的关系如下:

image.png 在设计算法时,要注意算法复杂度增量的问题,尽量避免爆炸级增量。