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

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

我知道有一个O(N)“选择”算法来找到第k个最大元素.它使用带有“良好”枢轴的快速选择,可以在O(N)中找到.我们也可以在O(N)中从数组构建一个堆,并从堆中检索k元素.

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

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

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

点赞