【发布时间】:2012-04-08 03:27:09
【问题描述】:
给定一个数据序列(它可能有重复),一个固定大小的移动 窗口,在每次迭代时从数据开始移动窗口 序列,使得 (1) 最旧的数据元素被从窗口中移除,一个新的数据元素被移除 元素被推入窗口 (2) 求每次移动时窗口内数据的中位数。
以下帖子没有帮助。
Effectively to find the median value of a random sequence
joining data based on a moving time window in R
我的想法:
使用 2 个堆来保存中位数。在窗口旁边,对窗口中的数据进行排序 在第一次迭代中,最小堆包含较大的部分和最大堆 持有较小的部分。如果窗口有奇数个数据,最大堆 返回中位数,否则返回顶部元素的算术平均值 两堆是中位数。
当一个新数据被推入窗口时,从一个窗口中删除最旧的数据 堆并将新数据与最大和最小堆的顶部进行比较,所以 决定要放置数据的堆。然后,找到中位数 就像第一次迭代一样。
但是,如何在堆中找到数据元素是一个问题。堆是二进制的 树不是二叉搜索树。
是否可以用 O(n) 或 O(n * lg m) 来解决它,其中 m 是窗口大小并且 空间:O(1) ?
非常感谢任何帮助。
谢谢
【问题讨论】:
-
下一项是最新数据,还是有其他条件?您是否以先进先出的方式处理这些项目?
-
@Glenn,每次迭代,从窗口中删除最旧的数据,并在窗口中放入新数据,然后在窗口中找到新的中位数。对于最旧的数据,它是 FIFO。谢谢
-
我不认为,空间 O(1) 是可能的。您需要存储窗口内容,因此您不会低于 O(m)。
-
如何从一个堆中删除最旧的数据?
标签: c++ algorithm data-structures median