O(?)

时间复杂度

算法流程中数据量为N 的话,时间复杂度讨论的在==N的样本==中执行完整个算法后==与常数操作的数量的关系==。

如何判断呢

要将算法分解到常数操作,再去分析时间复杂度是多少

举例来说:选择排序

数组:【7】【8】【10】【2】【12】【5】【1】【….】【N】

下标 0 1 2 3 4 5 6 …… N-1

第一步:N个数看一遍,找最小值

​ N次 N-1次

第二步:最小值放0位置O(1)

​ 1次交换

第三步:1~N-1个数看一遍 ,找最小值,进行一次交换。。。。依次循环

最终一共进行了一个等差数列,N个数,N-1个数,N-2个数……次

等差数列求和公式最终优化可以写成 (a,b,c)是常数

aN^2+bN+c

复杂度就是只要最高阶项O(n^2),所以选择排序就是一个O(n^2)的算法。

因为当N数据量趋近于无穷时常数项就可以忽略了,而取决定性因素的就是与最高阶有关。

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

常用的常数时间操作

寻址操作:数组内存中的一个连续区域背包问题

常见的算术运算(+、-、*、/、% 等)
常见的位运算(>>、>>>、<<、|、&、^等)
赋值、比较、自增、自减操作等
数组寻址操作

非固定时间的操作

image-20231004150516403

评估算法优劣的核心是什么

时间复杂度(流程决定)

额外空间复杂度(流程决定)

常数项时间(实现细节决定)

什么算是额外空间复杂度

用户功能要求返回的空间数组,不算是额外空间复杂度

如果我在整个算法流程中,我开辟的空间就是有限的几个变量,那么这个过程中我的那个额外空间复杂度就是O(1)的

额外空间复杂度也要按照最差情况估计,用户要什么最终你给他的东西不算你的额外空间,输入什么参数也不算,额外空间是你自己在设计的流程中,为了完成自己的流程,你必须使用的空间。

算法流程的常数项比拼方式

冒泡排序不如插入排序的常数时间好,方法就是放弃理论大样本实测。