剑指offer:Python 数据流中的中位数 最大堆、最小堆实现 heapq模块 封装

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

思路及Python实现

思路一:大小堆 实现
  • 利用两个对来实现,一个大顶堆,一个小顶堆,大顶堆用来存较小的数,从大到小排列;小顶堆存较大的数,从小到大的顺序排序,中位数就是小顶堆和大顶堆的堆顶元素的平均值(有偶数个数据的时候),或者是大顶堆的堆顶元素(有奇数个数据的时候)
  • 具体数据如何存放:
    (1)规定始终从:最大堆 开始放数据,这样最大堆的数据个数,只会是 大于或等于最小堆数据个数
    (2)如果传入的数据 小于最大堆的堆顶数据,这时应该让这个数放入最大堆,然后调整最大堆,最大堆堆顶数据移动到最小堆,然后调整最小堆
    (3)如果传入的数据 大于 最大堆的堆顶数据,这时应该让这个数放入最小堆,然后调整最小堆,最小堆堆顶数据移动到最大堆,然后调整最大堆

手动创建 最大、最小堆 实现

class Solution:
    def __init__(self):
        self.max_heap = []
        self.min_heap = []
        self.max_heap_count = 0
        self.min_heap_count = 0

    def Insert(self, num):
        if self.min_heap_count < self.max_heap_count:
            self.min_heap_count += 1
            if num < self.max_heap[0]:
                temp_num = self.max_heap[0]
                self.adjust_max_heap(num)
                self.creat_min_heap(temp_num)
            else:
                self.creat_min_heap(num)
        else:
            self.max_heap_count += 1
            if len(self.max_heap) == 0:
                self.creat_max_heap(num)
            else:
                if self.min_heap[0] < num:
                    temp_num = self.min_heap[0]
                    self.adjust_min_heap(num)
                    self.creat_max_heap(temp_num)
                else:
                    self.creat_max_heap(num)

    def GetMedian(self, n=1):
        if self.min_heap_count < self.max_heap_count:
            return self.max_heap[0]
        else:
            return float(self.max_heap[0] + self.min_heap[0]) / 2

    def creat_max_heap(self, num):
        self.max_heap.append(num)
        temp_index = len(self.max_heap) - 1
        while temp_index:
            parent_index = (temp_index - 1) >> 1
            if self.max_heap[parent_index] < self
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值