选择比较算法来查找k个最大值



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

k = 30 , k = n/5 ..

我想了一些有效的算法,但我能想到的只是O(nlogn)的复杂性。我能用`O(n)做吗?也许可以快速修改一下?

谢谢!

这个问题可以在中使用基于最小堆的优先级队列来解决

  O(NlogK) + (KlogK) time

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

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

常数k-k选择算法的另一个选择基于平均时间为O(N)的快速排序分区(而最坏的情况可能发生O(N^2))

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

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

更多信息可以在这里找到。

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

有很多论文都有校样,但这个网站提供了一个很好的视觉例子。

因此,除非给你一个排序数组,否则你的最佳情况将是O(n-lgn)算法。

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

最新更新