数据流中的中位数python_数据流中的中位数

python用的自己实现的最大和最小堆的class,GetMedian需要加个参数,否则python版会报错。# -*- coding:utf-8 -*-

# 最小堆

class minheap:

def __init__(self):

self.minheap = []

def __len__(self):

return len(self.minheap)

def insert(self, elem):

self.minheap.append(elem)

l = len(self.minheap) - 1

while l != 0 and self.minheap[int((l - 1) / 2)] > self.minheap[l]:

self.minheap[int((l - 1) / 2)], self.minheap[l] = self.minheap[l], self.minheap[int((l - 1) / 2)]

l = int((l - 1) / 2)

def pophead(self):

self.minheap[0] = self.minheap[-1]

self.minheap = self.minheap[:-1]

i, l = 0, len(self.minheap) - 1

while 1:

if 2 * i + 1 > l:  # 没有子节点

break

elif 2 * i + 2 > l:  # 只有左节点

if self.minheap[2 * i + 1] 

self.minheap[2 * i + 1], self.minheap[i] = self.minheap[i], self.minheap[2 * i + 1]

i = 2 * i + 1

else:

break

else:  # 儿女双全

if self.minheap[2 * i + 1]  self.minheap[2 * i + 2]:  # 比两个孩子都大

if self.minheap[2 * i + 1] 

self.minheap[2 * i + 1], self.minheap[i] = self.minheap[i], self.minheap[2 * i + 1]

i = 2 * i + 1

else:

self.minheap[2 * i + 2], self.minheap[i] = self.minheap[i], self.minheap[2 * i + 2]

i = 2 * i + 2

elif self.minheap[2 * i + 1] 

self.minheap[2 * i + 1], self.minheap[i] = self.minheap[i], self.minheap[2 * i + 1]

i = 2 * i + 1

elif self.minheap[2 * i + 1] > self.minheap[i] > self.minheap[2 * i + 2]:

self.minheap[2 * i + 2], self.minheap[i] = self.minheap[i], self.minheap[2 * i + 2]

i = 2 * i + 2

else:

break

def head(self):

return self.minheap[0]

# 最大堆

class maxheap:

def __init__(self):

self.maxheap = []

def __len__(self):

return len(self.maxheap)

def insert(self, elem):

self.maxheap.append(elem)

l = len(self.maxheap) - 1

while l != 0 and self.maxheap[int((l - 1) / 2)] 

self.maxheap[int((l - 1) / 2)], self.maxheap[l] = self.maxheap[l], self.maxheap[int((l - 1) / 2)]

l = int((l - 1) / 2)

def pophead(self):

self.maxheap[0] = self.maxheap[-1]

self.maxheap = self.maxheap[:-1]

i, l = 0, len(self.maxheap) - 1

while 1:

if 2 * i + 1 > l:  # 没有子节点

break

elif 2 * i + 2 > l:  # 只有左节点

if self.maxheap[2 * i + 1] > self.maxheap[i]:

self.maxheap[2 * i + 1], self.maxheap[i] = self.maxheap[i], self.maxheap[2 * i + 1]

i = 2 * i + 1

else:

break

else:  # 儿女双全

if self.maxheap[2 * i + 1] > self.maxheap[i] 

if self.maxheap[2 * i + 1] > self.maxheap[2 * i + 2]:  # 左孩子小于右孩子

self.maxheap[2 * i + 1], self.maxheap[i] = self.maxheap[i], self.maxheap[2 * i + 1]

i = 2 * i + 1

else:

self.maxheap[2 * i + 2], self.maxheap[i] = self.maxheap[i], self.maxheap[2 * i + 2]

i = 2 * i + 2

elif self.maxheap[2 * i + 1] > self.maxheap[i] > self.maxheap[2 * i + 2]:

self.maxheap[2 * i + 1], self.maxheap[i] = self.maxheap[i], self.maxheap[2 * i + 1]

i = 2 * i + 1

elif self.maxheap[2 * i + 1] 

self.maxheap[2 * i + 2], self.maxheap[i] = self.maxheap[i], self.maxheap[2 * i + 2]

i = 2 * i + 2

else:

break

def head(self):

return self.maxheap[0]

class Solution:

def __init__(self):

self.minH = minheap()

self.maxH = maxheap()

def Insert(self, num):

self.maxH.insert(num)

if len(self.maxH) > len(self.minH) + 1:

self.minH.insert(self.maxH.head())

self.maxH.pophead()

if len(self.minH) > 0 and self.maxH.head() > self.minH.head():

self.maxH.insert(self.minH.head())

self.minH.insert(self.maxH.head())

self.maxH.pophead()

self.minH.pophead()

def GetMedian(self,n = None):

if len(self.maxH) is len(self.minH):

return float(self.maxH.head() + self.minH.head())/2

elif len(self.maxH) is len(self.minH) + 1:

return self.maxH.head()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值