剑指offerJZ63-数据流中位数(常见数据结构复杂度)

思路
① 需要一个数据容器来保存从流中读出来的数据




补充知识:无序数组中位数
解法一:先排序再找中位数
解法二:小根堆(网上代码跑不了,堆排序不熟,不知道是那道题,只知道这样O(n))
思想是:
1 对无序数组的前len(array)//2长度的元素建立最小堆,这样就得到了一个堆顶元素小于任意一个堆里的元素
2 将剩下的一半元素依次与堆顶元素比较。若比堆顶元素大,则替换之,并调整堆。(也就是说:依次遍历剩下一般的元素,与当前的堆顶元素作比较,如果大于堆顶元素,则替换,这时,重新调整堆的结构,使其保持为最小堆,否则,遍历下一个元素,知道剩下的一半元素遍历结束)
3 数组剩下的所有元素比较完后,可以输出中位数。数组长度为奇数时,输出堆顶元素即可。数组长度为偶数时,输出堆顶元素与它的孩子结点中较小的那个的均值。

解法:

# -*- coding:utf-8 -*-
from heapq import *
class Solution:
    def __init__(self):
        self.heaps = [],[]
    def Insert(self, num):
        small,large = self.heaps
        heappush(small,-heappushpop(large,num))
        if len(large) < len(small):
            heappush(large,-heappop(small))
    def GetMedian(self, n = None):
        small,large = self.heaps
        if len(large) > len(small):
            return float(large[0])
        return (large[0] - small[0])/2.0

你可能感兴趣的:(剑指offerJZ63-数据流中位数(常见数据结构复杂度))