【问题标题】:Algorithm for finding the largest K numbers in a max heap of size N in O(K) time?在 O(K) 时间内在大小为 N 的最大堆中找到最大 K 数的算法?
【发布时间】:2014-04-29 18:06:06
【问题描述】:

O(K * logK) algorithm 用于在大小为 N 的最大堆中找到最大的 K 个数是众所周知的。我听说有一个 O(K) 算法可以解决这个问题。我没有找到这方面的文献。任何人都可以对此提供任何指示吗?谢谢!

【问题讨论】:

  • @yuyang 你是指未排序方式中最大的 k,因为排序意味着你可以在 O(n) 中对数组进行排序,因为构建堆是 O(n) 并且在 O(n) 中排序数组使用比较是不可能的。
  • 也许你应该在 cs.stackexchange.com 上问这个问题

标签: algorithm


【解决方案1】:

我终于找到了描述算法的论文。 Quora 上也有类似的问题。

G.N. 的论文“An Optimal Algorithm for Selection in a Min-Heap” Frederickson,描述了该算法。以下为摘要:

提出了一种 O(k) 时间算法,用于在大小为 n⪢k 的二进制最小堆中选择第 k 个最小元素。该方法使用递归定义的数据结构,对堆中的某些元素进行分层分组。该结果建立了偏序的另一个示例,其中第 k 个最小元素可以在时间上与信息论下限成比例地确定。确定了两个应用,一个资源分配问题和一个 k 最小生成树的枚举。

【讨论】:

  • 您打算从高层次上描述该算法的工作原理吗?那肯定会很有趣。
  • @NiklasB。不幸的是,弗雷德里克森描述的算法由于其复杂性而极难在高层次上描述。他的第一个算法 SEL1 可以用严格的解释在高层次上进行描述,并且随着他继续修改最初的方法,它只会变得更加复杂。
  • 我想的差不多了……据我了解,这也是完全不切实际的。
猜你喜欢
  • 2020-05-18
  • 2011-12-27
  • 2015-01-15
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2018-03-30
  • 2023-02-10
  • 2012-06-27
相关资源
最近更新 更多