是否有“锦标赛”算法来找到第k个最大的元素?

时间:2012-06-20 14:55:44

标签: algorithm language-agnostic selection

我知道我们可以使用“锦标赛”algorithmN中的N+log(N)-2大小的数组中找到 2nd 最大元素。现在我想知道我们是否可以使用类似的“锦标赛”找到第k 个最大的元素。

我知道有一个O(N)“选择”算法来查找第k个最大元素。它使用Quick Select带有“好”的轴,可以在O(N)中找到。我们还可以在heap中的数组中构建O(N),并从heap中检索 k 元素。

我想知道是否有另一种方法。

1 个答案:

答案 0 :(得分:2)

我相信你可以把它变成一个O( N log k )算法:迭代数组,并保持最大的 k的最小堆到目前为止遇到的元素。所以第一个 k 元素直接进入堆。每个后续元素将与堆的尖端进行比较,如果它更大,则将从堆中移除尖端并插入新元素,这是一个O(log k )操作一堆大小 k 。当算法完成,并且序列的长度至少为 k 时,堆的尖端将具有第i个最大元素,并且其余部分将具有第i个k 的最大元素。堆积更大的元素。

这种方法具有比中位数O( n )解决方案更差的最坏情况行为,但是更容易实现并且对于小 k <产生相当好的行为< / i>的。因此它可能非常适合许多实际应用。