📜  中位数(1)

📅  最后修改于: 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]
应用

中位数可用于数据分析、统计学、机器学习、并行算法等领域,例如:

  • 离群值检测:在一组数据中,如果某些值与中位数的差值很大,那么这些值可能是异常数据,需要进行进一步分析或处理。
  • 数据压缩:通过对数据中位数的编码和解码,可以实现数据压缩。
  • 排序算法:一些排序算法(如快速排序)可以利用中位数实现更高效的排序。
  • 并行算法:由于中位数易于计算和分割,因此在多处理器环境下,中位数常用于负载均衡和任务分配。