时间复杂度
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数据量趋近于无穷时常数项就可以忽略了,而取决定性因素的就是与最高阶有关。
总之,施行时间是固定的就是常数时间操作,反之都不是。
常用的常数时间操作
寻址操作:数组内存中的一个连续区域背包问题
常见的算术运算(+、-、*、/、% 等)
常见的位运算(>>、>>>、<<、|、&、^等)
赋值、比较、自增、自减操作等
数组寻址操作
非固定时间的操作
评估算法优劣的核心是什么
时间复杂度(流程决定)
额外空间复杂度(流程决定)
常数项时间(实现细节决定)
什么算是额外空间复杂度
用户功能要求返回的空间数组,不算是额外空间复杂度
如果我在整个算法流程中,我开辟的空间就是有限的几个变量,那么这个过程中我的那个额外空间复杂度就是O(1)的
额外空间复杂度也要按照最差情况估计,用户要什么最终你给他的东西不算你的额外空间,输入什么参数也不算,额外空间是你自己在设计的流程中,为了完成自己的流程,你必须使用的空间。
算法流程的常数项比拼方式
冒泡排序不如插入排序的常数时间好,方法就是放弃理论大样本实测。