【问题标题】:Is there any algorithm to find the kth smallest element in a max-heap in O(log n) time?是否有任何算法可以在 O(log n) 时间内找到最大堆中的第 k 个最小元素?
【发布时间】:2020-05-18 07:36:34
【问题描述】:

在最坏的情况下,第 k 个最小的元素可能位于最大堆的最后一层。在这种情况下,找到该元素所需的时间可能会达到 O(n),因为其中可能有 n/2 个元素堆的最后一层最坏的情况。 要么 是否有任何其他算法可以在 O(logn) 时间内找到 MAX 堆中的第 k 个最小元素?

n = 没有。堆中的元素数

【问题讨论】:

  • 我认为这取决于树的表示。如果每个节点都存储其下方的叶子数,则可以使用二进制搜索来获得 O(log n)。另外,请参阅here 进行相关讨论。

标签: algorithm heap heapsort


【解决方案1】:

是的。您可以在 O(k log n) 中执行此操作。为了解释这个过程,考虑一个示例数组[30,20,10,9,7,5]

堆结构由下式给出:

现在,我们有以下模式。

  • 第 1 个最小元素 -> 第 6 个最大元素
  • 第二个最小元素 -> 第五个最大元素
  • 第 3 个最小元素 -> 第 4 个最大元素
  • ..
  • ..
  • ..
  • 第 k 个最小元素 -> (n-k+1) 个最大元素

例如,在我们的示例中,第 5 个最小元素 -> 第 2 个最大元素 -> 20

【讨论】:

  • 我认为 O(klogn) 肯定不同于 O(log n)
  • @BorisStrandjev 是的。即使要在最大堆中找到第 k 个最大元素,也需要 O(k log n)。此外,当 k 为 O(1) 时,这是 ~ O(log n),比 O(n) 好得多
  • 当 k 为 O(1) 时只有 O(log n)。 k
  • 有一些解决方案可以找到 O(log n) 的第 k 个元素,而不考虑 [0.. n] 中的 k。这就是 O (log n) 和 OP 的要求
  • @SohamChatterjee 你能澄清一下这个k 值吗?
猜你喜欢
  • 2015-01-15
  • 2014-04-29
  • 2011-11-30
  • 1970-01-01
  • 2012-06-27
  • 2019-04-11
  • 2021-04-21
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多