【问题标题】:O(1) and O(log n), are they same thing?O(1) 和 O(log n),它们是一回事吗?
【发布时间】:2017-09-29 16:00:38
【问题描述】:

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

【问题讨论】:

  • O(1) != O(logn),就我而言,在 min-heap 中,minimum 是根,所以你应该能够在O(1)。除非它是我们正在谈论的不同数据结构并且您感到困惑。

标签: runtime time-complexity heap min-heap


【解决方案1】:

确实,任何 O(1) 都是 O(log n)。然而,并不是所有的 O(log n) 都是 O(1)。 O 是一个上限,因此您始终可以使用增长更快的函数。

这样想:

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

【讨论】:

    【解决方案2】:

    事实证明,O 表示法只是问题的上限。常数时间可以用任何 O 符号表示,因为上限没有限制,甚至可能一直到 n!。大 O 表示法不是 theta。

    【讨论】:

      【解决方案3】:

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

      1. 获取最小项,正如您所指出的,它是 O(1),因为已知它位于堆的顶部。
      2. 删除最小项目。这是 O(log n),因为它涉及将最后一项从堆移动到根,然后将其向下筛选以重新调整堆。

      如果你只是想得到最小项而不删除它,那么操作确实是 O(1)。但是任何时候你想修改堆(并且删除第一项肯定是合格的),这是一个 O(log n) 操作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多