Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

非紧渐近符号

算法的时间复杂度

在了解接下来的非紧渐近符号之前, 我们先来思考如何用一般(紧)渐近符号描述一个算法的时间复杂度.

的充要条件定理

我们以一个定理来引入, 即渐近符号的夹逼定理, 或者更正式的称为:

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贡献内容.


练习与回答

  1. 判断下列关于 Big-O 和 little-o 的陈述是否正确.

错误, 正确的应该是 . 其余四个均正确.

  1. 根据已知内容, 判断下列关于 Big-Omega 和 little-omega 陈述是否正确.

已知:

  • , 则
  • , 则 , 但不是

则判断:

  • , 是否满足
  • , 是否满足
  • , 是否满足 又满足

对于上面已知内容, 可以在下一节具体学习. 以上除第2题以外都正确, 通过极限法证明即可.

Warning

该章节仍在编写, 欢迎在 GitHub仓库 提交PR贡献内容.


  1. 事实上为: 最坏情况(Worst-case)、最好情况(Best-case)、平均情况(Average-case)、摊还情况(Amortized)

  2. 对于算法的最坏情况, 一般使用;对于算法的平均情况, 一般使用;对于算法的最好情况, 一般使用.

  3. (little-o) 是 (Big-O) 的小记号. (little-omega) 是 (Big-Omega) 的小记号. 当然可以!下面我们先简要回顾一下这四个渐近符号的定义, 然后设计一系列由浅入深的练习题, 帮助你清晰地区分 Big-Omega (Ω)、little-omega (ω)、Big-O (O) 和 little-o (o).