评估算法核心指标理解

1.算法中的核心指标有哪几个?

1.时间复杂度:这个是由流程决定的,那什么叫做流程决定?就是看你是怎么设计这套流程算法的。举例:如果你是直接根据下标索引直接找到数据,那么你的时间复杂度就为O(1),而如果是循环遍历比对找到数据,那么你的时间复杂度就位O(n)
2.额外空间复杂度:这个也是由流程决定的。首先什么叫做额外空间复杂度,就是在你使用这套流程完成具体功能的时候是否额外开辟了与实现这个功能无关的空间。
3.常数项时间:这个由具体细节决定,那什么叫做具体细节?举例来说就是,我们都知道位运算的效率是高于我们普通的加减乘除,如果你在实现过程中使用位运算的话,那么你的常数项时间就会比较低,效率会比较高。

2.时间复杂度

如何计算呢?

1.按照最差的情况统计计算
2.把整个流程拆分成一个个基本动作,保证每个动作都是常数项操作。
3.将第二步拆分的动作求和,看是一个什么样的基本表达式。
4.当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉。

看到上面计算的3点,我们来解释下。
第一点,按照最差的情况统计计算
什么才叫做最差的情况。举例如下:比如插入排序过程中,我们知道每次都需要把局部进行重新排序,那最好的情况是这个需要排序的数据是已经排好序的,那么我们的时间复杂度就为O(1),但是我们不能因为这个就说插入排序的时间复杂度是O(N),我们要考虑的是最差的情况,最坏的情况是这个需要排序的数据的倒序的,那么我们的时间复杂度就是O(N^2)了,在这里大家可能还不知道O(N)是什么概念,先了解下,下面有描述。

第二点,什么叫做常数项操作。
定义如下:如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间。称这样的操作为常数时间的操作。
那有哪些操作是常数时间呢?

1.常见的算术运算(+-*/% 等)
2.常见的位运算(>>【带符号右移】、>>>【不带符号右移,最高位默认0,正数】、<<|&^等)
3.赋值、比较、自增、自减操作等
4.数组寻址操作

总之,执行时间固定的操作都是常数时间的操作。
反之,执行时间不固定的操作,都不是常数时间的操作。

第三点:动作求和,看计算表达式结果
这里需要我们把一个流程拆分成一个个基本动作,然后将整个过程求和。这么说还是有点晕
这里我们举例选择排序进行说明

过程:
arr[0~N-1]范围上,找到最小值所在的位置,然后把最小值交换到0位置。 基本表达式为:(N-1(查询数据+比较数据)+1  #参数说明(n-1)表示需要进行(n-1)次的查询数据和比较数据,因为查询和比较是两个常数项操作,所以这里可以进步抽象为(N-1)*2 +1  最后系数1是交换位置,下面同理
arr[1~N-1]范围上,找到最小值所在的位置,然后把最小值交换到1位置。基本表达式为:(N-2)*2 +1
arr[2~N-1]范围上,找到最小值所在的位置,然后把最小值交换到2位置。基本表达式为:(N-3)*2 +1
…
arr[N-2~N-1]范围上,找到最小值位置,然后把最小值交换到N-1位置。2+1

估算:
很明显,如果arr长度为N,每一步常数操作的数量,如等差数列一般
所以,总的常数操作数量 = a*(N^2) + b*N + c (a、b、c都是常数)

所以选择排序的时间复杂度为O(N^2)

第四点,当完成表达式的建立后,只留下最高阶
如上面第三点我们举例的选择排序为例,我们推算出选择排序的表达式为形如:
a*(N^2) + b*N + c 那么该算法的
复杂度就为O(N^2)。记为:O(忽略掉系数的高阶项)

这里有疑问,为什么最高阶的系数可以忽略。理由是当你的样本N数量趋向于无穷大,那么高阶前面的系数就无关紧要了。

常见的时间复杂度排名如下:

O(1)   
O(logN)   //二分法
O(N)   
O(N*logN)   
O(N^2)   O(N^3)O(N^K)
O(2^N)   O(3^N)O(K^N)
O(N!)

3.额外空间复杂度

概念如下:
你要实现一个算法流程,在实现算法流程的过程中,你需要开辟一些空间来支持你的算法流程。

理解:
作为输入参数的空间,不算额外空间。
作为输出结果的空间,也不算额外空间。
因为这些都是必要的、和现实目标有关的。所以都不算。

但除此之外,你的流程如果还需要开辟空间才能让你的流程继续下去。这部分空间就是额外空间。

如果你的流程只需要开辟有限几个变量,额外空间复杂度就是O(1)。

4.常数项时间

其实,算法中重要的凭据点事时间复杂度,只有当时间复杂度相当,这个时候才会来考虑常数项时间。但是实际中,我们并不会直接去分析常数项。
原因有两个:
第一:是常数项的操作都是固定的,但是却又快慢之分,比如我在第1大点描述常数项的时候也说了,位运算会比普通的加减乘除快。
第二:理论分析,你需要分析的过程非常多。因为已经具体到细节部分了。所以直接交给实验测试下,就知道优劣了,实践是检验真理的唯一标准。

5.小结

一般情况下,认为解决一个问题的算法流程,在时间复杂度的指标上,一定要尽可能的低,先满足了时间复杂度最低这个指标之后,使用最少的空间的算法流程,叫这个问题的最优解。

一般说起最优解都是忽略掉常数项这个因素的,因为这个因素只决定了实现层次的优化和考虑,而和怎么解决整个问题的思想无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值