获得第k个最大值

时间:2014-12-11 13:29:18

标签: algorithm

我有一些问题。我必须添加许多不同的值,最终只获得第k个最大值。我怎样才能有效地实现它,我应该使用什么算法?

3 个答案:

答案 0 :(得分:7)

<强>算法:

  1. 创建二进制最大堆,并将每个第一个K值添加到堆中。

  2. 对于剩余的N-K值中的每一个,如果它大于堆中的最后一个值:

    把它换成最后一个值,并将其冒泡以便占用堆。

  3. 将堆中的所有(K)值提取到列表中。


  4. <强>复杂度:

    1. O(K)

    2. O((N-K)×log(K))

    3. O(K×log(K))

    4. 如果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个元素。