一尘不染

具有最大存储效率的增量中值计算

algorithm

我有一个过程会产生价值,并且我会观察到。当过程终止时,我想计算这些值的中位数。

如果必须计算平均值,则可以存储求和值和生成值的数量,因此需要O(1)内存。中位数怎么样?有没有办法保存来自存储所有值的明显O(n)?

编辑: 对2种情况感兴趣:1)已知流长度,2)未知。


阅读 218

收藏
2020-07-28

共1个答案

一尘不染

您将需要至少存储ceil(n / 2)点,因为前n / 2点中的任何一个都可能是中位数。仅存储点并找到中位数可能是最简单的。如果保存ceil(n /
2)点很有价值,则将前n / 2个点读入排序列表中(最好是二叉树),然后在添加新点时将低点或高点丢弃,并保持跟踪任一端抛出的点数。

编辑:

如果流的长度是未知的,那么正如斯蒂芬在评论中所观察到的那样,显然,我们别无选择,只能记住一切。如果可能有重复的项目,我们可以使用Dolphins的存储值和计数的思想来节省一些内存。

2020-07-28