【问题标题】:Is there a "tournament" algorithm to find k-th largest element?是否有“比赛”算法来找到第 k 个最大的元素?
【发布时间】:2012-06-22 18:01:37
【问题描述】:

我知道我们可以使用“比赛”algorithmN+log(N)-2 中找到大小为N 的数组中第二个 最大的元素。现在我想知道我们是否可以使用类似的“锦标赛”找到第 k-th 个最大的元素。

我知道有一个O(N)“选择”算法可以找到第 k-th 个最大的元素。它使用Quick Select 和一个“好”的枢轴,可以在O(N) 中找到。我们还可以从O(N) 中的数组构建一个heap,并从heap 中检索k 元素。

我想知道是否有另一种方法。

【问题讨论】:

  • en.wikipedia.org/wiki/Selection_algorithm 给出了很好的总结。
  • 使用堆需要 O(n + k log n),而不是 O(n),请问您为什么要寻找其他方法? (这是作业吗?)。
  • @SaeedAmiri O(n + k log n) 正是 O(n) :) 这不是作业,只是我的好奇心。
  • @Michael,不,不是O(n),如果k 是常数,是的,但例如如果k=n/2 它将是O(n logn) 远离线性O你提到过(如果是 O(n),那么肯定人们不会疯狂地发明选择算法)。
  • @SaeedAmiri 谢谢。你说得对,我现在明白了。

标签: algorithm language-agnostic selection


【解决方案1】:

我相信您可以将其设为 O(N log k) 算法:遍历数组,并保持最大 k 的最小堆 元素到目前为止遇到。所以第一个 k 元素直接进入堆。每个后续元素都将与堆的尖端进行比较,如果它更大,则将从堆中删除尖端并插入新元素,这是一个 O(log k) 操作大小为 k 的堆。当算法完成后,序列的长度至少为 k,那么堆的顶端将有第 k 个最大的元素,其余的堆更大的元素。

与中位数 O(n) 解决方案相比,这种方法的最坏情况行为较差,但对于较小的 k。因此它可能非常适合许多实际应用。

【讨论】:

  • 重新阅读这个问题,似乎您可能只对 O(n) 算法感兴趣。如果是这样,请告诉我,我将删除此帖子。
  • 我很确定您的意思是“这是一个 O(log k) 操作”。
猜你喜欢
  • 2015-01-15
  • 2021-06-04
  • 2012-10-22
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2019-08-13
相关资源
最近更新 更多