动态更新数组的k次统计

时间:2018-08-13 18:23:35

标签: algorithm heap selection

我想跟踪尺寸不断增加或减小的第k个最大元素(k是固定的)。我可以使用哪种数据结构来获得最佳的时间复杂度?

当数组仅在增长(输入流在流中)时,最小堆可实现最佳的复杂性。

如果k不固定,则可以在此处找到使用最小堆和最大堆的解决方案:Find running median from a stream of integers

当k固定时,使用两个堆是否也最优?

2 个答案:

答案 0 :(得分:1)

如果数组不断增长,则应在minHeap中添加一个元素,并在其达到k + 1时删除顶部,因此堆中的前k个元素的根数最少。

如果使用maxHeap,我相信您可以达到相同的效果。当达到k + 1个元素时,删除顶部元素后,您将具有相同的顶部k个元素,但最大值将位于根。

现在,当数组减少时,在每次删除时都要查看被删除的元素是否大于maxHeap的窥视并且数组大小仍大于或等于k,那么您无需执行任何操作。

如果数组大小减小到k以下,则第k个最大数组将变得无效,然后随着数组的减小,将maxHeap顶部的顶部一一移除。

这是困难的部分:

但是当要删除的元素小于maxHeap的窥视并且数组大小仍然> = k将元素添加到maxHeap时,如果该元素已经存在于堆中,那么大小没有变化,这表明该元素是在堆里。删除该元素,然后添加数组中的最后一个元素。

答案 1 :(得分:1)

2个堆是好的,只要每次插入或删除时所需的秩最多变化一个小常数,因为这样每次插入或删除后仅需O(log N)的工作即可重新平衡堆。因此,固定k,运行中位数,运行第10个百分位数等都可以。

如果k的变化幅度更大,或者允许随时检索任何排名,请使用订单统计树:https://en.wikipedia.org/wiki/Order_statistic_tree