数据流的中位数计算
在计算机科学和统计学中,中位数是一种常用的统计量,用于表示一组数据的中间值。对于有限的数据集,可以通过对数据进行排序,然后选择位于中间位置的元素来计算中位数。然而,在处理大量数据或数据流时,对整个数据集进行排序可能会非常耗时和占用内存。因此,我们需要一种高效的算法来计算数据流的中位数。
一种常见的方法是使用两个堆来实现。一个小顶堆用于存储较大的一半数据,一个大顶堆用于存储较小的一半数据。这样,中位数就可以通过这两个堆的堆顶元素来计算得出。具体的算法如下:
- 初始化一个空的小顶堆和一个空的大顶堆。
- 依次读取数据流中的元素。
- 如果小顶堆和大顶堆的大小相等,将元素插入小顶堆,并将小顶堆的堆顶元素插入大顶堆。
- 如果小顶堆的大小大于大顶堆的大小,将元素插入大顶堆,并将大顶堆的堆顶元素插入小顶堆。
- 调整堆,使得小顶堆的大小等于大顶堆的大小,或者小顶堆的大小比大顶堆的大小多1。
- 计算中位数。如果两个堆的大小相等,中位数为两个堆顶元素的平均值;否则,中位数为小顶堆的堆顶元素。
下面是使用Python实现数据流中位数计算的示例代码:
import heapq
class MedianFinder: