我有一些问题。我必须添加许多不同的值,最终只获得第k个最大值。我怎样才能有效地实现它,我应该使用什么算法?
答案 0 :(得分:7)
<强>算法:强>
创建二进制最大堆,并将每个第一个K
值添加到堆中。
对于剩余的N-K
值中的每一个,如果它大于堆中的最后一个值:
把它换成最后一个值,并将其冒泡以便占用堆。
将堆中的所有(K
)值提取到列表中。
<强>复杂度:强>
O(K)
O((N-K)×log(K))
O(K×log(K))
如果N-K ≥ K
,则整体复杂度为O((N-K)×log(K))
。
如果N-K < K
,则整体复杂度为O(K×log(K))
。
答案 1 :(得分:2)
(根据你不想存储所见的所有数字的评论......)
保持到目前为止您看到的最大k的运行列表(已排序)。当您获得新数字时,请查看它是否大于列表中的最小元素。如果是,则删除最少元素并将新元素插入(排序)到k最大的列表中。你原来的k列表(当你看不到数字时)将包含k个负无穷大的条目。
答案 2 :(得分:0)
首先使用那些O(n)时间的元素构建max-heap。 然后在O(klogn)时间中提取k-1个元素。