选择比较算法以找到 k 个最大值

Choosing comparing algorithms to find k max values

假设我想在 n 个元素的数组中找到 K 个最大值,并且 return 在排序的输出中找到它们。 k 可能是 -

k = 30 , k = n/5 ..

我想过一些高效的算法,但我能想到的只是 O(nlogn) 的复杂度。我可以在`O(n) 中完成吗?也许对快速排序进行一些修改?

谢谢!

如果您假设您只想对整数进行排序,则有一种方法可以在接近 O(n) 的时间内对元素进行排序。这可以通过像 Bucket Sort or Radix Sort 这样的算法来完成,它不依赖于两个元素之间的比较(限制为 O(n*log(n)))。

但是请注意,这些算法也有最坏情况下的运行时间,可能比 O(n*log(n)) 慢。

更多信息可以found here.

没有任何基于比较的排序算法可以实现比 O(n*lg n) 更好的平均情况复杂度

有很多论文都有证明,但 this 网站提供了一个很好的视觉示例。

因此,除非给定一个排序数组,否则最好的情况是 O(n lg n) 算法。

有 radix 和 bucket 之类的排序,但它们并不是像您的标题所暗示的那样基于比较排序。

问题可以在

中使用基于最小堆的优先级队列来解决
  O(NlogK) + (KlogK) time

如果 k 是常量 (k=30 case),则复杂度等于 O(N)。

如果k = O(N) (k=n/5 case),那么复杂度等于O(NlogN)。

常量 k 的另一个选项 - K-select algorithm 基于平均时间为 O(N) 的快速排序分区(而最坏情况可能为 O(N^2))