阅读目录
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路及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