gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:22 25 4
gpt4 key购买 nike

我正在关注以下博客并了解如何以非常微妙的方式获得中位数。博客是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com