数字流中最小的Kth

时间:2019-04-06 14:18:03

标签: arrays algorithm sorting data-structures heap

我们获得了一系列数字和Q查询。 在每个查询中,我们都得到一个数字k。 我们需要找到流的第k个最小数字。 如何解决这个问题?

流的总大小为<10 ^ 5

1 <数字<10 ^ 9

我尝试了链表,但是找到正确的位置很费时,而在数组插入中却很耗时。

2 个答案:

答案 0 :(得分:0)

您可以使用某种search tree。它们是许多不同种类的搜索树,但所有常见的搜索树都允许插入 O(log n),并在 O(log n)中找到第k th 个元素

如果流太长而无法将所有数字保存在内存中,并且您还知道了 k 的上限,则可以通过仅保留与上限相等的元素数来修剪树

答案 1 :(得分:0)

您可以使用大小为k的最大堆。

放置元素,直到堆的大小达到k。然后,放置一个元素并弹出堆的根,以便可以保持size = k。删除(提取)根是有意义的,因为至少有k个元素小于根值。

完成流的迭代后,堆的根将是第k个最小元素。因为堆中的k个元素最小,所以根在其中最大。

由于堆的大小为k,所以时间复杂度为O(n lg k),可能比O(n lg n)好一点。而且实现起来很容易。