码迷,mamicode.com
首页 > 其他好文 > 详细

41-数据流中的中位数

时间:2019-08-15 22:55:40      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:min   最大   使用   部分   init   self   +=   pop   小顶堆   

题目:如何得到一个数据流中的中位数?

import heapq
class GetMedian(object):
    def __init__(self):
        self.max_heap = []
        self.min_heap = []
        self.k = 0
    def insert(self,data):
        if self.k%2==0:
            x = heapq.heappushpop(self.min_heap,data)
            heapq.heappush(self.max_heap,x)
            self.k+=1
        else:
            heapq.heappush(self.min_heap,data)
            self.k += 1
    def get_median(self):
        if self.k%2:
            return heapq.nlargest(1,self.max_heap)[0]
        else:
            return (heapq.nlargest(1,self.max_heap)[0] + heapq.nsmallest(1,self.min_heap)[0])/2

注:使用一个大顶堆和一个小顶堆来实现,大顶堆存储左半部分小的数,小顶堆存储右半部分大的数。插入数时,如果数量为偶数,先插入小顶堆,获取堆顶最小值,然后将其插入大顶堆;如果数量为奇数,先插入小顶堆,获取堆顶最大值,然后将其插入小顶堆。

41-数据流中的中位数

标签:min   最大   使用   部分   init   self   +=   pop   小顶堆   

原文地址:https://www.cnblogs.com/kingshine007/p/11360989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!