algorithm - 具有最大内存效率的增量中值计算

标签 algorithm median

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

如果我必须计算平均值,我可以只存储总和和生成值的数量,因此需要 O(1) 的内存。中位数怎么样?有没有一种方法可以节省存储所有值所带来的显而易见的 O(n) 时间?

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

最佳答案

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

编辑:

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

关于algorithm - 具有最大内存效率的增量中值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3372006/

相关文章:

Java并行查找数组的最小值

java - 递归生成子集的问题

algorithm - 非确定性 PDA 如何以及为何比确定性 PDA 更强大?

C++根据引用计算中位数

c - 如何找到矩阵 C 中的中位数(行和列)

c++ - 高效的中值计算

python - Tensorflow 中值

R:如何用行中位数替换 NA?

c - 二锁并发队列算法实现问题

algorithm - 在圆形网格上找到所有单元格?