对数时间复杂度函数最常见的特征是:
- 选择下一个要执行某些操作的元素是多种可能性之一
- 只需要选择一个。
或
- 执行操作的元素是 n 的数字。
这就是为什么例如,在电话簿中查找人是 O(log n)。你不需要检查电话簿中的每个人来找到正确的人;相反,你可以通过基于名字的字母顺序进行分治查找,每次只查看每个部分的一个子集,直到最终找到某人的电话号码。
当然,更大的电话簿仍然会花费你更长的时间,但它不会像额外大小的比例增加那样迅速增长。
我们可以扩展电话簿的例子来比较其他类型的运算及其运行时间。我们将假设我们的电话簿有 businesses(“黄页”)和 people(“白页”),它们可能没有唯一的名称。电话号码最多分配给一个人或一个企业。我们还将假设翻到特定页面所需的时间是恒定的。
以下是我们在电话簿上可能执行的一些运算的运行时间,从最快到最慢:
- O(1)(最坏情况):给定一个企业的名称所在的页面和该企业的名称,找到电话号码。
- O(1)(平均情况):给定一个人的名称所在的页面和他们的名称,找到电话号码。
- O(log n):给定一个人的名称,通过在尚未搜索的部分大约中间位置随机选取一点来查找电话号码,然后检查该点是否为该人的名称。然后重复该过程,直到找到该人的名称所在的部分。(这是一个二分查找。)
- O(n):查找所有电话号码包含数字 “5” 的人。
- O(n):给定一个电话号码,查找拥有该号码的人或企业。
- O(n log n):打印机办公室出现混乱,我们的电话簿的所有页面都以随机顺序插入。修复排序,使其正确,方法是查看每页的第一个名称,然后将该页放入新的、空的电话簿中的适当位置。
对于下面的例子,我们现在在打印机办公室。电话簿等待邮寄给每个居民或企业,每本电话簿上都有一个贴纸,标明它应该寄往何处。每个人或企业都有一本电话簿。
- O(n log n):我们想个性化电话簿,因此我们要在每个人的指定副本中找到他们或企业的名称,然后在书中圈出他们的名称,并写一封简短的感谢信,感谢他们的赞助。
- O(n²):办公室发生了一个错误,每本电话簿中的每个条目都在电话号码末尾多了一个额外的 “0”。使用一些修正液并删除每个零。
- O(n · n!):我们准备将电话簿装上装货码头。不幸的是,原本应该装载书籍的机器人出了故障:它随机地将所有的书装上卡车!更糟糕的是,它将所有的书装上卡车后,还要检查它们是否按正确的顺序排列,如果不是,则卸载它们并重新开始。(这是可怕的 bogo sort。)
- O(n^n):你修复了机器人,使它正确地装载东西。第二天,你的一个同事对你开了个玩笑,将装货码头的机器人连接到了自动印刷系统。每当机器人去装载一本原始书籍时,工厂打印机都会复制所有电话簿!幸运的是,机器人的缺陷检测系统足够复杂,以至于当遇到已打印的副本书籍时,它不会尝试打印更多的副本,但它仍然必须装载每一本原始书籍和已打印的副本书籍。