有许多不同的解决方案可以从流数据中找到运行中位数,我将在答案的最后简要讨论它们。
问题是关于特定解决方案(最大堆/最小堆解决方案)的详细信息,以及基于堆的解决方案如何工作的解释如下:
对于前两个元素,将较小的元素添加到左侧的 maxHeap 中,将较大的元素添加到右侧的 minHeap 中。然后一一处理流数据,
Step 1: Add next item to one of the heaps
if next item is smaller than maxHeap root add it to maxHeap,
else add it to minHeap
Step 2: Balance the heaps (after this step heaps will be either balanced or
one of them will contain 1 more item)
if number of elements in one of the heaps is greater than the other by
more than 1, remove the root element from the one containing more elements and
add to the other one
然后在任何给定时间,您都可以像这样计算中位数:
If the heaps contain equal amount of elements;
median = (root of maxHeap + root of minHeap)/2
Else
median = root of the heap with more elements
现在我将按照答案开头所承诺的一般性地讨论这个问题。从数据流中找到运行中位数是一个棘手的问题,对于一般情况来说,有效地找到具有内存限制的精确解决方案可能是不可能的。另一方面,如果数据具有我们可以利用的某些特征,我们可以开发有效的专业解决方案。例如,如果我们知道数据是整数类型,那么我们可以使用计数排序,它可以给你一个常数记忆常数时间算法。基于堆的解决方案是一种更通用的解决方案,因为它也可以用于其他数据类型(双精度)。最后,如果不需要确切的中位数并且近似值就足够了,您可以尝试估计数据的概率密度函数并使用它估计中位数。