从流数据中查找运行中位数有很多不同的解决方案,我将在答案的最后简要讨论它们。
问题是有关特定解决方案(最大堆/最小堆解决方案)的详细信息,下面说明基于堆的解决方案如何工作:
对于前两个元素,在左侧的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
现在,我将按照答案开头所承诺的一般性地讨论这个问题。从数据流中找到运行中位数是一个难题,对于一般情况而言,有效地找到具有内存限制的精确解决方案可能是不可能的。另一方面,如果数据具有我们可以利用的某些特征,那么我们可以开发有效的专业解决方案。例如,如果我们知道数据是整数类型,则可以使用计数排序,这可以为您提供恒定的内存恒定时间算法。基于堆的解决方案是一种更通用的解决方案,因为它也可以用于其他数据类型(双精度)。最后,如果不需要精确的中位数并且近似值足够,则可以尝试估计数据的概率密度函数,然后使用该函数估计中位数。