非紧渐近符号
算法的时间复杂度
在了解接下来的非紧渐近符号之前, 我们先来思考如何用一般(紧)渐近符号描述一个算法的时间复杂度.
的充要条件定理
我们以一个定理来引入, 即渐近符号的夹逼定理, 或者更正式的称为:
Theta 的充要条件定理 (Theorem on the equivalence of and the combination of and )
如下: 对于两个正函数 和 , 有:
这个定理说明了 Big-Theta 符号是 Big-O 和 Big-Omega 的“交集”. 其证明也非常的简单, 可以通过分别证明充分性和必要性解决. 通过前面的学习, 完成它应该不是什么大问题, 故本书不再赘述.
通过这个定义, 我们可以更好的了解算法的时间复杂度是怎么表示的. 在之前我们已经聊过这个问题了, 现在再深入地解决一下:
- 所有的符号都并非只是描述算法的一种情况, 我们一般给出三种情况: 最坏, 最优(好)和一般1, 在无特定规定下, 符号描述可以参照脚注22.
- 表示在对应情况下, 算法的时间复杂度不超过 的常数倍.
- 表示在对应情况下, 算法的时间复杂度至少为 的常数倍.
- 表示在对应情况下, 算法的时间复杂度总在 的两个常数倍之间.
- 以上三个表达都只是简单描述, 任何需要专业化的表达, 最好参照前面的定义进行.
符号
接下来, 我们来看今天的主题——非紧渐近符号: 非紧渐近符号们提供了 非紧界(Non-tight bounds). 它们有时也被称为 严格渐近符号(Strict asymptotic notation) 或 小记号(Little notations)3.
我们来看 符号的定义:
与 主要区别在于: 在 中, 界 对某个常量 成立, 在 中, 界 对所有常量 成立. 这也就是说, 在 记号中, 当 趋向于无穷大时, 对于 就微不足道了, 即:
关于非紧界这个描述, 是因为 包含同阶函数而 反之. 如, 但 . 同理, 可以推出 . 在本章节的练习与回答中, 也可以通过这种方法判断正误.
符号
不严谨地说, 它与 符号相反. 我们可以利用 来定义它, 下面这个定义同样是它的一个性质: 形式化的定义是:
同样地, 我们有 . 例如, 但 不过 .
同时还要注意, 我们使用的是 , 这意味着关于 Big-O 和 little-o, Big-Omega 和 little-omega 上面这两个结论都不可逆.
另外我们同样有个极限表达:
Warning
该章节仍在编写, 欢迎在 GitHub仓库 提交PR贡献内容.
练习与回答
- 判断下列关于 Big-O 和 little-o 的陈述是否正确.
错误, 正确的应该是 或 . 其余四个均正确.
- 根据已知内容, 判断下列关于 Big-Omega 和 little-omega 陈述是否正确.
已知:
- 若 , 则
- 若 , 则 , 但不是
则判断:
- , 是否满足
- , 是否满足
- , 是否满足 又满足
对于上面已知内容, 可以在下一节具体学习. 以上除第2题以外都正确, 通过极限法证明即可.
Warning
该章节仍在编写, 欢迎在 GitHub仓库 提交PR贡献内容.
-
事实上为: 最坏情况(Worst-case)、最好情况(Best-case)、平均情况(Average-case)、摊还情况(Amortized) ↩
-
对于算法的最坏情况, 一般使用;对于算法的平均情况, 一般使用;对于算法的最好情况, 一般使用. ↩
-
(little-o) 是 (Big-O) 的小记号. (little-omega) 是 (Big-Omega) 的小记号. 当然可以!下面我们先简要回顾一下这四个渐近符号的定义, 然后设计一系列由浅入深的练习题, 帮助你清晰地区分 Big-Omega (Ω)、little-omega (ω)、Big-O (O) 和 little-o (o). ↩