给定一个数据序列(可能有重复项)和一个固定大小的移动窗口,每次迭代从数据序列的开始位置移动窗口,使得:
(1)最老的数据元素从窗口中移除,并将新的数据元素推入窗口
(2)在每个移动时,在窗口内查找数据的中位数。
以下帖子没有帮助:
我的想法:
使用 2 个堆来保存中位数。在窗口内部,对窗口内的数据进行排序。在第一次迭代中,小根堆保存较大的部分,大根堆保存较小的部分。如果窗口中的数据数量为奇数,则大根堆返回中位数,否则两个堆的顶部元素的算术平均值是中位数。
当将新数据推入窗口时,从堆中删除最旧的数据,并将新数据与大根堆和小根堆的顶部元素进行比较,以决定将数据放置在哪个堆中。然后,像第一次迭代中那样找到中位数。
但是,在堆中查找数据元素是一个问题。堆是二叉树而不是二叉搜索树。
是否可能用 O(n) 或 O(n * lg m) 解决,其中 m 是窗口大小,并且空间:O(1)?
非常感谢任何帮助。
谢谢。