arrays – 从运行流中的无限元素数组返回最大k元素的最佳算法

我有一个正在运行的整数流,如何在任何时间点从该流中获取最大的k个元素.
最佳答案
最简单的解决方案是填充大小为k的min-heap.

首先,使用前k个元素填充堆.

接下来,对于流中的每个元素 – 检查它是否大于堆的头部,如果是 – 弹出当前头部,然后插入新元素.

在流中的任何时刻 – 堆包含最大的k个元素.

该算法是O(nlogk),其中n是到目前为止在流中遇到的元素数.

另一种解决方案,在某些情况下,在渐近复杂性方面更复杂但理论上更好,是保持2k元素的数组.

首先,加载前2k个元素.
运行Selection Algorithm,找到最高的k.丢弃其余部分,此时数组中只剩下k个元素.
现在,再次使用下一个k元素填充数组,然后重复.

在每个点,数组包含k个最大元素,以及多达k个不是最大的元素.您可以为此阵列上的每个查询运行选择算法.

运行时分析:

维护阵列:每个选择算法是O(2k)= O(k).这是每k个元素完成一次,因此如果n表示到目前为止看到的元素数,则n / k次,这给出了O(n / k * 2k)= O(n).

另外,每个查询都是O(k),如果查询数是Q,则给出O(n Q * k)运行时.

为了使该解决方案更有效,我们需要Q * k <1. nlogk

Q*k < nlogk
Q < n/k * logk

因此,如果如上所述限制查询的数量,则该解决方案在渐近复杂度方面可能更有效.

实际上,通常使用min-heap解决方案来获得top k,至少在我看到它需要的时候.

转载注明原文:arrays – 从运行流中的无限元素数组返回最大k元素的最佳算法 - 代码日志