如果有一个数字流,您如何跟踪第1,000,000个最大的数字?

时间:2013-04-08 16:46:17

标签: algorithm

鉴于数字流,您如何跟踪第1,000,000个最大的数字?

我在接受采访时被问到这个问题。

2 个答案:

答案 0 :(得分:14)

一种方法是保留minimum heap,并将堆的大小限制为1,000,000。虽然堆没有达到1,000,000个项目,但我们会将流中的每个新项目添加到堆中。当堆变满时,我们会将流中的每个新项目与堆中的最小项进行比较,如果它大于最小值,我们将弹出最小项并插入新项。这样,堆的最小项始终是第1,000,000个最大值。

伪代码示例:

Handle_Stream_Item(item):
  if(MinHeap.size < 1000000):
    MinHeap.insert(item)
  else if (item > MinHeap.min()):
    MinHeap.extractMin()
    MinHeap.insert(item)

答案 1 :(得分:0)

从流中读取每个数字时,将其添加到B-TREE结构中。

https://en.wikipedia.org/wiki/B-tree

从百万和第一个数字开始,在添加新数字后,从B-TREE中删除最右边的(即最大的)。

任何时候,B-TREE中最右边的数字都是您想要的数字。