样本的加权中位数是50%加权百分位数(见this post @ crossvalidated for more info)/
我想知道如何扩展用于查找正在运行的数字流{@ 3}}的中位数的算法(有两个堆,左边是最小堆,右边是最大堆)从double
值和权重流中有效地计算加权中位数。
我的一个想法是使用与从未加权的数字流计算中位数时相同的方法,但如果权重不是一个,则简单地加入额外的值(例如,权重为2的值将被插入两次)。但是,这不能很好地扩展,可以是双倍的权重,而且内存效率也很低。
谢谢!
答案 0 :(得分:0)
O(nlogn)复杂度的一种方法是将节点插入到扩充的平衡二叉搜索树中。树将按值排序,树中的每个节点都会通过一个给出所有子节点总权重的字段来扩充。
插入新节点需要花费O(logn),包括更新所有总权重字段。
要根据总重量的目标权重除以2来查找树的中位数。此搜索将采用O(logn)。
答案 1 :(得分:0)
我最终实现了一个使用排序数组的方法(本质上提供了最小堆的功能,但更容易搜索)并且不断跟踪总权重的第50个百分位数。我写了a blog post about it,其中有更深入的例子。