O(1)和O(log n),它们是一样的吗?

时间:2017-09-29 16:00:39

标签: runtime time-complexity heap min-heap

有一个问题询问从最小堆中取出最小元素是否为o(logn)时间,我认为它是错误的,因为它需要恒定时间,因为最小元素在顶部。但答案是正确的,教师的解释是,常数时间也是O(logn),这是一个措辞问题。我很困惑。那么在实践中,我们是否将常量时间视为O(logn)的运行时间?

3 个答案:

答案 0 :(得分:1)

O(1)确实是O(log n)。但是,O(log n)的所有内容都不是O(1)。 O是一个上限,所以你总是可以使用一个增长更快的函数。

这样想:

  • 米老鼠是一只老鼠
  • 所有小鼠都是哺乳动物
  • 因此,米老鼠是一种哺乳动物
  • ......但“老鼠”和“哺乳动物”不是同义词

答案 1 :(得分:0)

事实证明,O符号只是问题的上限。恒定时间可以放在任何O符号中,因为上限没有限制,甚至可能一直到n!。大O符号不是theta。

答案 2 :(得分:0)

从最小堆中获取最小元素是一个O(log n)操作,因为它包含两个步骤:

  1. 获取最小项目,正如您所指出的那样,是O(1),因为它已知位于堆顶部。
  2. 删除最小项目。这是O(log n),因为它涉及将最后一项从堆移动到根,然后将其筛选以重新调整堆。
  3. 如果你只想获得最小项而不删除它,那么操作确实是O(1)。但是,只要你想修改堆(并删除第一个项目当然是合格的),它就是一个O(log n)操作。

    Nitpickers note : 我理解插入到最小堆中的论点是,平均,是一个O(1)操作。虽然在某些情况下可能是这样,但最坏的情况仍然是O(log n)。 (尝试以相反的顺序将值插入堆中。每次插入都是O(log n)。)