Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 动态更新数组的k阶统计量_Algorithm_Heap_Selection - Fatal编程技术网

Algorithm 动态更新数组的k阶统计量

Algorithm 动态更新数组的k阶统计量,algorithm,heap,selection,Algorithm,Heap,Selection,我想跟踪数组中第k个最大元素(k是固定的),它的大小在不断增长或减小。我可以使用哪种数据结构来实现最佳的时间复杂度 当数组仅在增长(输入以流的形式出现)时,最小堆达到最佳复杂性 当k不固定时,可以在此处找到使用最小堆和最大堆的解决方案: 当k固定时,使用两个堆也是最佳的吗?如果数组不断增长,您将向minHeap添加一个元素,当它达到k+1时,您将删除顶部,因此堆上有第一个k个元素,并且在根上最少 我相信,如果使用maxHeap,也可以实现同样的效果。当达到k+1个元素时,删除顶部后,将有相同的顶

我想跟踪数组中第k个最大元素(k是固定的),它的大小在不断增长或减小。我可以使用哪种数据结构来实现最佳的时间复杂度

当数组仅在增长(输入以流的形式出现)时,最小堆达到最佳复杂性

当k不固定时,可以在此处找到使用最小堆和最大堆的解决方案:


当k固定时,使用两个堆也是最佳的吗?

如果数组不断增长,您将向minHeap添加一个元素,当它达到k+1时,您将删除顶部,因此堆上有第一个k个元素,并且在根上最少

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

现在,当数组减少时,在每次删除时,如果要删除的元素大于maxHeap的peek,并且数组大小仍然大于或等于k,则无需执行任何操作

如果数组大小减小到k以下,那么第k个最大值将变得无效,然后随着数组的减小,您将继续逐个删除maxHeap top

这里是困难的部分:


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

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


如果k的变化超过这个值,或者允许在任何时候检索任何秩,请使用顺序统计树:

我不确定我是否遵循了“困难部分”。你能澄清一下吗?我是否需要保留另一个堆(最小堆)来存储小于maxHeap中最小元素的元素,以便在删除小于maxHeap的元素时,可以将最小堆中最大的元素移动到最大堆?“存储小于maxHeap中最小元素的元素“-如果有任何元素小于maxHeap中最小的元素,那么这些元素已经在maxHeap中捕获,因为maxHeap的容量上限为K。我不理解在这里使用2个堆的原理。在运行中位数的情况下,这是有意义的,因为中位数基本上将两组数字划分为比中位数更小和更大的两组。在这种情况下,您要做的就是确保捕获给定数组中的第一个“K”元素。