数据结构(C描述)算法的时间与空间复杂度

算法:算法是规则的有限集合,是为解决特定问题而规定的一系列操作。
特性:

1.有限性:有限步骤内正常结束,不能形成无穷循环
2.确定性:算法中的每一个步骤必须有确定含义,无二义性
3.可行性:原则上能精确进行,操作可通过已经实现的基本运算执行有限次而完成
4.输入:有多个或0个输入
5.输出:至少有一个或多个输出

设计要求

正确性
可读性
健壮性(鲁棒性)
高效率和低储存量

算法耗费的时间: 一个算法的执行时间是指算法中所有语句执行时间的总和,每条语句的执行时间等于该条语句的执行次数乘以执行一次所需实际时间;
语句频度:该语句在一个算法中重复执行的次数,一个算法的时间耗费就是该算法中的所有语句频度之和;

时间复杂度:
对于算法分析,关心的是算法中语句总的执行次数f(n)是问题规模n的函数,进而分析f(n)随n的变化情况并确定T(n)的数量级;这里用“O”来表示数量级,算法的时间复杂度T(n)=O(f(n));
在算法分析时,往往对算法的时间复杂度和渐进时间复杂度不与区分;
最坏情况下的时间按复杂度称最坏时间复杂度
平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间;

常用的时间复杂度频率计数(按数量递增排列):

O(1)常数阶
O(log2n)对数阶
O(n)线性阶
O(nlog2n)线性对数阶
O(n^2)平方阶
O(n^3)立方阶
O(n^k)K次方阶
O(2n)指数阶

空间复杂度:
一个算法的占用空间是指算法实际占用的辅助空间的总和。算法的空间复杂度S(n)定义为该算法所耗费的储存空间的数量级,他是问题规模n的函数,
S(n)=O(f(n))
如果算法执行时所需要的辅助空间相对于输入数据量而言是一个常数,则称这个算法为原地工作,辅助空间为O(1);

例题:
1) O(1)常数阶在这里插入图片描述
对于分支结构来说,无论有多少句(不是在循环中),它的时间复杂度都是O(1);

2) O(log2n)对数阶
首先我们先来复习下公式,相信很多人都忘记了
a^y=x→y=log(a)(x)[公式表示y=log以a为底x的对数,其中a是底数,x是真数。另外a大于0,a不等于1,x大于0]
在这里插入图片描述

二分查找时间复杂度是O(log2n),如果一次比较可以做到k等分(也就是排除掉k-1个其他相同长度),时间复杂度为O(logkn),复杂度的数量级一致。

3) O(n)线性阶
在这里插入图片描述
比较简单,很清楚的就能看出循环体执行了n次;
4) O(n^2)平方阶
在这里插入图片描述

对步进循环语句只考虑循环体中语句的循环次数,很明显x++的频度是n^2;
立方阶还有多方阶都差不多是一样的,不过更高阶的没有什么实际意义,我们就不考虑了;

5) O(2n)指数阶
斐波那契数列就是一个非常明显的一个例子
在这里插入图片描述
看不懂的小伙伴不需要灰心,接下来直接上传送门,斐波那契数列通项公式推导过程:https://wenku.baidu.com/view/54aa9443a8956bec0975e350.html

以上都是基础的例子,还有一些复杂度的题就是一些变形而已,并不难,不过有些需要数学的功底,认真仔细点就可以了。

猜你喜欢

转载自blog.csdn.net/weixin_47160672/article/details/108674504
今日推荐