其他分享
首页 > 其他分享> > 295. 数据流的中位数

295. 数据流的中位数

作者:互联网

使用大根堆和小根, PriorityQueue默认是小根堆,所以存入负数让其变成大根堆.

from queue import PriorityQueue
class MedianFinder:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.hi = PriorityQueue()  # 小根堆
        self.lo = PriorityQueue()  # 大根堆


    def addNum(self, num: int) -> None:
        self.lo.put(-num)
        self.hi.put(-self.lo.get())

        if self.hi.qsize() > self.lo.qsize() + 1:
            self.lo.put(-self.hi.get())

    def findMedian(self) -> float:
        if (self.hi.qsize() + self.lo.qsize()) % 2 != 0:
            return self.hi.queue[0]
        else:
            return (self.hi.queue[0] - self.lo.queue[0]) / 2

放置期间, 始终保持

  1. 大根堆数量不小于小根堆数量
  2. 数量之差不超过1.
  3. 要保持小根堆的最小值>=大根堆的最大值.

以下操作能保证每次添加时, 小根堆数量+1, 大根堆数量不变, 且维持特性3

self.lo.put(-num)
self.hi.put(-self.lo.get())

以下操作维持特性2:

if self.hi.qsize() > self.lo.qsize() + 1:
	self.lo.put(-self.hi.get())

也可以用另一种思路《风险对冲》对顶堆求中位数去做.

标签:大根堆,qsize,lo,self,中位数,put,hi,数据流,295
来源: https://blog.csdn.net/duoyasong5907/article/details/113719849