时间复杂度
1. 含义
- 算法在特定输入下的运行时间:指执行的基本操作数或步数
- 时间复杂度是定性描述该算法运行时间的函数,可以用来估计该算法的运行时间
- 当输入规模足够大的时候,这个函数的低阶项和最高阶项的常数项对函数值的影响相较于最高阶项指数对函数值的影响来说可以忽略不计,也就是说只对运行时间的次数做描述
2. 渐进记号
渐进记号描述函数的增长趋势。五个渐进记号如下:
2.1. 定义
等号代替属于
为了方便,当
可以更快速地用极限定义:
其中
2.2. 性质
2.2.1. 传递性
2.2.2. 自反性
2.2.3. 对称性和转置对称性
2.3 时间复杂度的表示
- 时间复杂度可以用渐进记号表示,最常用的是大 O 记号。
- 大多数情况下,我们只关注算法的最坏情况运行时间:
- 对大部分算法来说,最坏情况经常出现;
- 平均情况运行时间很可能等于最坏情况运行时间;
- 有例外,比如快速排序。
2.4 例子
- 常数函数的时间复杂度是
,也可写成 (为什么?) - 函数的增长不一定能比较:
, 此时 和 均不成立(为什么?) - 由 斯特林公式,
。又因为 和 均可视为较 小的项,所以 。 - 又因为
(为什么?)
两边取对数,得 (其中 是某个常数) - 由以上两式子可得,
- 由 斯特林公式,
经常有人疑惑
对数的底数是几无关紧要,因为:根据换底公式,不同底数的对数之间只差一个常数,而计算时间复杂度的时候不考虑常数。
3. 空间复杂度
1. 定义
算法的空间复杂度指该算法执行过程中所需要消耗的存储空间资源
执行过程中
不要把输入数据所占的存储空间包括在内。
2. 表示方法
与时间复杂度表示方法相同