选择比较算法以找到 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))
假设我想在 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))