假设我想在n个元素的数组中找到K max值,并在排序的输出中返回它们。 k可能是 -
k = 30 , k = n/5 ..
我考虑过一些有效的算法,但我能想到的只是O(nlogn)的复杂性。我可以在'O(n)中做到吗?也许对快速排序进行一些修改?
谢谢!
答案 0 :(得分:0)
如果你假设你只想对整数进行排序,那么有一种方法可以在近O(n)中对元素进行排序。这可以使用Bucket Sort或Radix 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))