选择比较算法以找到k max值

时间:2016-05-12 20:35:05

标签: algorithm comparison quicksort

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

k = 30 , k = n/5 ..

我考虑过一些有效的算法,但我能想到的只是O(nlogn)的复杂性。我可以在'O(n)中做到吗?也许对快速排序进行一些修改?

谢谢!

3 个答案:

答案 0 :(得分:0)

如果你假设你只想对整数进行排序,那么有一种方法可以在近O(n)中对元素进行排序。这可以使用Bucket SortRadix Sort等算法来完成,这些算法不依赖于两个元素(仅限于O(n * log(n)))之间的比较。

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

更多信息可以是found here

答案 1 :(得分:0)

没有基于比较的排序算法可以实现比O(n * lg n)

更好的平均案例复杂度

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

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

像radix和bucket这样的东西,但它们不是基于比较的排序,就像你的标题似乎暗示的那样。

答案 2 :(得分:0)

可以使用

中基于最小堆的优先级队列解决问题
UPDATE table_items
       JOIN table_brands
       ON  table_items.name LIKE CONCAT('%', table_brands.name ,'%')
SET    table_items.brand_id = table_brands.id;

如果k是常数 O(NlogK) + (KlogK) time ,那么复杂度等于O(N)。

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

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