【发布时间】:2021-09-24 22:33:13
【问题描述】:
这似乎是一个常见问题,可以在任何地方找到答案,但事实并非如此:我在 Internet 上的任何地方都找不到答案。关键是,我从来没有见过任何地方问过关于时间复杂度是否可能是O(ceil(logn)) 的问题,我想不通,所以我决定在这里问一个问题。
首先,假设我有一个包含n 数字的排序数组,并且我想使用二进制搜索算法在其中搜索一个值。下面列出了在最坏情况下所需的步骤数:
| n | steps |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 3 |
| 7 | 3 |
| 8 | 4 |
| 9 | 4 |
| 10 | 4 |
如您所见,n 个数字的数组所需的步骤是ceil(log2n)(ceil(log2n) 表示大于或等于log2n 的最小整数)。所以我觉得二分查找的时间复杂度应该是O(ceil(logn)),但是根据Wikipedia,时间复杂度应该是O(logn),为什么呢?有什么问题吗?
【问题讨论】:
-
问题是天花板还是地板都没有关系。 Big-Oh 符号只是对运行时间复杂度的估计,这就是为什么我们在计算它时删除常量和低阶项的原因。即使你说的是对的,也可以这样想
O(ceil(logn)) <= O(logn) + 1,现在你去掉常量1 -
在 Sedgewick 的“算法分析”中,他准确计算操作,计算天花板和楼层,就像您在问题中所做的那样。例如,计算归并排序的确切比较次数(这会在图中产生有趣的细节)。大 O 抛弃了很多细节,在 Sedgewick 的一些工作中(例如与 Flageolet 的分析组合),他们认为大 O 太粗略且使用范围太广。但要回答你的问题,正如其他人指出的那样 O(log n) = O(lg n) = O(ceil(log n)) = O(floor(log n))。
-
为了证明复杂性是一样的,我建议你直接使用大O的定义,而不是像丢弃常量和低阶项那样使用“经验法则”。这两条规则是无害的,但人们遵循的其他经验法则并不完全正确,或者仅适用于某些情况。最好坚持定义,因为这样你总是在坚实的理论基础上。
标签: algorithm time-complexity big-o binary-search