python - 了解使用堆从整数流中获取平均值

标签 python algorithm heap

我正在关注以下博客并了解如何以非常微妙的方式获得中位数。博客是here

现在,我将以下函数添加到 streamMedian 类中以获取插入数字的平均值,但未获得所需的输出

import heapq

class streamMedian:
    def __init__(self):
        self.minHeap, self.maxHeap = [], []
        self.N=0


    def insert(self, num):
        if self.N%2==0:
            heapq.heappush(self.maxHeap, -1*num)
            self.N+=1
            if len(self.minHeap)==0:
                return
            if -1*self.maxHeap[0]>self.minHeap[0]:
                toMin=-1*heapq.heappop(self.maxHeap)
                toMax=heapq.heappop(self.minHeap)
                heapq.heappush(self.maxHeap, -1*toMax)
                heapq.heappush(self.minHeap, toMin)
        else:
            toMin=-1*heapq.heappushpop(self.maxHeap, -1*num)
            heapq.heappush(self.minHeap, toMin)
            self.N+=1

    def getMedian(self):
        if self.N%2==0:
            return (-1*self.maxHeap[0]+self.minHeap[0])/2.0
        else:
            return -1*self.maxHeap[0]

    def getMean(self):
        sum = 0
        for num in self.maxHeap:
            sum += num
        for num in self.minHeap:
            sum += num 
        return sum/self.N

这是对 streamMedian 类的函数调用。

test = streamMedian()
test.insert(1)
test.insert(2)
test.insert(3)
print test.getMedian()
print test.getMean()

此处的中位数应为 2,均值应为 2(而不是输出 0)。提前致谢。

最佳答案

您正在将负数推送到您的 maxHeap (-1*num)。 您需要在 getMean() 中反转它,例如:

def getMean(self):
    total = 0
    for num in self.maxHeap:
        total -= num
    for num in self.minHeap:
        total += num 
    return total/self.N

或者:

def getMean(self):
    return (abs(sum(self.maxHeap)) + sum(self.minHeap))/self.N

注意:不要将 sum 用作变量,它隐藏了 python 内置的 sum() 函数。

关于python - 了解使用堆从整数流中获取平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45226035/

相关文章:

python - 从 Python heapq 中检索最小值

python - heapq.nsmallest 如何工作

python 属性 : list-like object

java - 如何在 java 中打印此模式我不知道如何

基于加权值确定项目顺序的算法

algorithm - 用 Julia 求解非线性方程

algorithm - 堆插入、删除k个元素

python - Pandas:如何从 DatetimeIndex 中提取日期时间范围

python - 基于两个分类列的累积计数

python - 如何获取正在使用的TOR入口节点的IP地址