📅  最后修改于: 2023-12-03 15:35:57.242000             🧑  作者: Mango
中位数是一个数据集合中的中间值,在一组有限的数据中,如果将所有数据从小到大排列,中间那个数就是中位数,如果数据个数是偶数,则中位数是中间两个数的平均数。
对于数组,可以先将其排序,然后取中间的数作为中位数。
def median(arr):
arr.sort()
n = len(arr)
if n % 2 == 0:
return (arr[n//2-1] + arr[n//2]) / 2
else:
return arr[n//2]
对于流数据,不能一次性读入所有数据后再排序,而是需要在每次读入新的数据后在已经读入的数据中找到中位数。可以用两个堆来实现,一个小根堆存储大的一半数,一个大根堆存储小的一般数,保证小根堆的元素个数不小于大根堆的元素个数。读入一个新的数后,如果小根堆的元素个数小于等于大根堆的元素个数,则将该数放入小根堆;否则将该数放入大根堆。当两个堆的元素个数之和是偶数时,中位数为两个堆顶的平均数,否则中位数为小根堆的堆顶。
import heapq
class MedianFinder:
def __init__(self):
self.min_heap = []
self.max_heap = []
def addNum(self, num: int) -> None:
if len(self.min_heap) == len(self.max_heap):
heapq.heappush(self.max_heap, -num)
x = -heapq.heappop(self.max_heap)
heapq.heappush(self.min_heap, x)
else:
heapq.heappush(self.min_heap, num)
x = heapq.heappop(self.min_heap)
heapq.heappush(self.max_heap, -x)
def findMedian(self) -> float:
if len(self.min_heap) == len(self.max_heap):
return (self.min_heap[0]-self.max_heap[0])/2
else:
return self.min_heap[0]
中位数可用于数据分析、统计学、机器学习、并行算法等领域,例如: