一尘不染

如何在不存储列表的情况下计算或近似列表的中位数

algorithm

我正在尝试计算一组值的中位数,但我不想存储所有值,因为这可能会破坏内存需求。有没有一种方法可以计算或近似中值而无需存储和排序所有单个值?

理想情况下,我想像下面这样编写我的代码

var medianCalculator = new MedianCalculator();
foreach (var value in SourceData)
{
  medianCalculator.Add(value);
}
Console.WriteLine("The median is: {0}", medianCalculator.Median);

我需要的只是实际的MedianCalculator代码!

更新:
有人问我要计算其中位数的值是否具有已知属性。答案是肯定的。一个值是从-25到-0.5的0.5增量。另一个也是从-120到-60的0.5增量。我想这意味着我可以为每个值使用某种形式的直方图。

谢谢

缺口


阅读 190

收藏
2020-07-28

共1个答案

一尘不染

如果这些值是离散的,并且不同值的数量不是太高,则可以只累加每个值在直方图中出现的次数,然后从直方图计数中找到中位数(只需从顶部和底部开始累加计数即可)直方图直到到达中间)。或者,如果它们是连续值,则可以将它们分配到bin中-
不会告诉您确切的中位数,但可以为您提供一个范围,如果您需要更精确地知道,可以再次遍历列表,仅检查一下中央垃圾箱中的元素。

2020-07-28