python求解中位数

本文介绍了一种利用大小根堆的数据结构在Python中计算给定数组的中位数的方法,通过维护两个堆(大根堆和小根堆),在遍历过程中动态调整堆结构以保持中位数的正确性。
Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

首先将数组nums进行排序,然后找到中间位置的数值
如果数组长度n为奇数,则(n+1)/2处对应值为中位数,如果数组下标从0开始,还需要减去1
如果数组长度n为偶数,则n/2,n/2+1两个位置数的平均值为中位数

假设中位数为x,并采用大小根堆来存储元素

  1. 采用大根堆存储小于等于中位数的元素,记大根堆的长度为nmaxn_{max}nmax
  2. 采用小根堆存储大于中位数的元素,记小根堆的长度为nminn_{min}nmin
  3. 保持nmin≤nmax≤nmin+1n_{min}\le n_{max}\le n_{min}+1nminnmaxnmin+1
    在遍历数组num的过程中,维持以上三个条件,即确保大根堆的堆顶元素必为中位数,那么
  • num≤xnum\le xnumx时,将num推入que_max中,同时比较大小根堆的长度,当nmax>nmin+1n_{max}>n_{min}+1nmax>nmin+1,表明新的中位数小于原来的中位数,则将que_max中堆顶元素弹出,并推入到小根堆que_min中
  • num>xnum> xnum>x时,将num推入que_minx中,同时比较大小根堆的长度,当nmax<nminn_{max}<n_{min}nmax<nmin,表明新的中位数大于原来的中位数,则将que_min中堆顶元素弹出,并推入到大根堆quemaxque_maxquemax
import numpy as np
import heapq
nums = np.random.choice(np.array(20),10,replace=False)
print('数组为',nums)
def findmid(nums):
    que_min = list() #小根堆,存储大于中位数的元素
    que_max = list() #大根堆,存储小于等于中位数的元素 !python中默认建造小根堆,可以将元素进行取负,来构造大根堆
    n = len(nums)
    for i in range(n):
        if not que_max or nums[i] <= -que_max[0]:
            heapq.heappush(que_max,-nums[i])
            if len(que_max) > len(que_min)+1:
                heapq.heappush(que_min,-que_max[0])
                heapq.heappop(que_max) 
        else:
            heapq.heappush(que_min, nums[i])
            if len(que_min) > len(que_max):
                heapq.heappush(que_max,-que_min[0])
                heapq.heappop(que_min)
    if n % 2==0:
        return (que_min[0] - que_max[0])/2
    else:
        return que_max[0]
print('数组的中位数为:',findmid(nums))

输出结果如下:
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值