原创不易~看完若对你有所帮助,记得点一个赞哈,这就是对我最大的支持了!
常数操作
一个操作如果和样本的数据量没有关系,每次都是固定时间,就是常数操作
例如数组中取出i位置的数字就是常数操作,无论arr长度,寻址操作都是一个常数操作,计算一个偏移量就行了:
int a = arr[i];
其他例如位运算等都是常数操作
但是链表里面的查找,以及很多框架的API都不是常熟操作:
时间复杂度
选择排序了解与引入时间复杂度
这个排序思路很简单,先从0到N找最小值,然后记录最小值index和0位置交换,然后从1-N重复上述操作就可以
0-N-1 首先我们需要看一下比较谁小 , 需要看N次
接着我们从1-N重复上面,需要看N-1次
最后总结所有的常数操作次数,有如下图的等差数列关系:
然后最后的时间复杂度是忽略低阶项和常数项,只能最高阶项(去除系数)。
所以最后的时间复杂度是N^2.
然后常见的大O是代表上限,就是算法最坏情况下的时间复杂度,一般使用的也是这种作为算法的复杂度,看到的就是O(N^2)
同样时间复杂度怎么拼好坏
都是N^2复杂度,怎么比较算法好还呢?这样只能拼后面的常数项,但是这个没办法估计通过理论知识。
唯一推荐方法是实际去跑,去做测试来确定两个算法谁优秀
总结回顾
- 常数操作:一个操作和样本的数据量没有关系,每次都是固定时间完成的操作叫做常熟操作
- 时间复杂度为一个算法流程中,常数操作量的指标。常用大O表示。需要对算法流程比较熟悉,然后写出算法流程中常熟操作的次数,进而总结出公式
- 表达式中,只要高阶项,不要低阶项,也不要高阶项系数,剩下部分如果为F(N),那么时间复杂度就是O(F
(N)) - 评价一个算法流程好坏,先看时间复杂度指标,然后再分析不同样本数据下的实际运行时间,也就是“常数项时间”