从值和权重流中查找运行加权中位数

时间:2016-06-23 12:54:14

标签: algorithm heap median

样本的加权中位数是50%加权百分位数(见this post @ crossvalidated for more info)/

我想知道如何扩展用于查找正在运行的数字流{@ 3}}的中位数的算法(有两个堆,左边是最小堆,右边是最大堆)从double值和权重流中有效地计算加权中位数。

我的一个想法是使用与从未加权的数字流计算中位数时相同的方法,但如果权重不是一个,则简单地加入额外的值(例如,权重为2的值将被插入两次)。但是,这不能很好地扩展,可以是双倍的权重,而且内存效率也很低。

谢谢!

2 个答案:

答案 0 :(得分:0)

O(nlogn)复杂度的一种方法是将节点插入到扩充的平衡二叉搜索树中。树将按值排序,树中的每个节点都会通过一个给出所有子节点总权重的字段来扩充。

插入新节点需要花费O(logn),包括更新所有总权重字段。

要根据总重量的目标权重除以2来查找树的中位数。此搜索将采用O(logn)。

答案 1 :(得分:0)

我最终实现了一个使用排序数组的方法(本质上提供了最小堆的功能,但更容易搜索)并且不断跟踪总权重的第50个百分位数。我写了a blog post about it,其中有更深入的例子。