我正在尝试计算一组值的中位数,但我不想存储所有值,因为这可能会破坏内存需求。有没有一种方法可以计算或近似中值而无需存储和排序所有单个值?
理想情况下,我想像下面这样编写我的代码
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增量。我想这意味着我可以为每个值使用某种形式的直方图。
谢谢
缺口
如果这些值是离散的,并且不同值的数量不是太高,则可以只累加每个值在直方图中出现的次数,然后从直方图计数中找到中位数(只需从顶部和底部开始累加计数即可)直方图直到到达中间)。或者,如果它们是连续值,则可以将它们分配到bin中- 不会告诉您确切的中位数,但可以为您提供一个范围,如果您需要更精确地知道,可以再次遍历列表,仅检查一下中央垃圾箱中的元素。