我知道我们可以使用“锦标赛”algorithm在N
中的N+log(N)-2
大小的数组中找到 2nd 最大元素。现在我想知道我们是否可以使用类似的“锦标赛”找到第k 个最大的元素。
我知道有一个O(N)
“选择”算法来查找第k个最大元素。它使用Quick Select
带有“好”的轴,可以在O(N)
中找到。我们还可以在heap
中的数组中构建O(N)
,并从heap
中检索 k 元素。
我想知道是否有另一种方法。
答案 0 :(得分:2)
我相信你可以把它变成一个O( N log k )算法:迭代数组,并保持最大的 k的最小堆到目前为止遇到的元素。所以第一个 k 元素直接进入堆。每个后续元素将与堆的尖端进行比较,如果它更大,则将从堆中移除尖端并插入新元素,这是一个O(log k )操作一堆大小 k 。当算法完成,并且序列的长度至少为 k 时,堆的尖端将具有第i个最大元素,并且其余部分将具有第i个k 的最大元素。堆积更大的元素。
这种方法具有比中位数O(