我们获得了一系列数字和Q查询。 在每个查询中,我们都得到一个数字k。 我们需要找到流的第k个最小数字。 如何解决这个问题?
流的总大小为<10 ^ 5
1 <数字<10 ^ 9
我尝试了链表,但是找到正确的位置很费时,而在数组插入中却很耗时。
答案 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)好一点。而且实现起来很容易。