图片测试

1. 常数时间的操作

固定时间的操作。例如,a+b 等算术运算就是固定时间的(算术运算背后是按位运算);寻址操作也是固定时间的。
链表的操作就不是常数时间的操作。因为,其节点内部都存储着下一个节点的地址,无法通过一套固定的算法算出偏移量,所以无法保证固定的时间操作。
我们常把常数时间的操作记为 \(O(1)\)

2. 时间复杂度

在数据样本为 N 的程序中,执行完整个流程,与常数时间的操作数量的关系。

2.1 时间复杂度的估算

在分析流程的时候,要把操作分解到常数时间的操作。
最后得出的表达式去最高次就是我们的复杂度。
因为当数据量逼向无穷大时,那些系数,常数项就没有什么意义了。

2.2 最佳时间复杂度

指一个最节省运行时间的数据样本下,该算法的运行时间的量级。

2.3 最坏时间复杂度

当样本数据最差的情况下,该算法运行时间的量级。

2.4 例子

3. 额外空间复杂度

用户给定的数据量 N,除了用户的给的数据和递交给用户的数据之外,在算法过程中需要额外开辟的空间量。
只是开辟了几个变量—— \(O(1)\)
例如,我们执行同一个任务,我们有着相同的时间复杂度 \(O(N^2)\),但是甲在执行的过程中,多申请了一个辅助数组 help[],那么我们就称甲有了额外的空间复杂度。

4. 常数项时间

当两个算法的时间复杂度相同时,造成两个算法运行时间差距的指标。比如说,乘除运算就是比异或运算,位运算要慢,这就是常数时间的差异。

4.1 常数项时间差异的比对

我们可以多次利用大样本量的数据对两种方法进行运行时间的比较,若是绝大部分情况下,A 的运行时间都要长于 B,那么就称 B 的常数时间好于 A。这与[[02 对数器]]的原理很相似。

5. 算法性能的评估

时间复杂度 > 空间复杂度,不考虑常数项时间。
即若是有算法 A 和 B,其时间空间复杂度分别为 \(O(N)\) \(O(N!)\)\(O(N*log_2 ^{N})\) \(O(1)\),哪怕 B 的空间复杂度达到了惊人的 \(O(1)\),我们也认为 A 的算法性能比 B 更佳。
若是时间复杂度相等,才可以比较空间复杂度。

5.1 技巧

  1. 一般来说,c 系的语言在刷题的时候都会规定 1~2 秒的限制运行时间,java 语言
posted @ 2022-10-17 20:39  yelanyanyu  阅读(84)  评论(0)    收藏  举报