100亿个整数如何找到中位数?内存足够和内存不足两个场景

当内存充足时,通过快速排序找到第n大的数来确定中位数。如果内存不足,采用分桶法,根据整数的二进制位划分区间,逐步缩小中位数所在的桶,直到内存足以处理当前桶的大小,然后进行排序找到中位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

100亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数?

(1)当内存足够时:

采用快排,找到第n大的数。

• 随机选取一个数,将比它小的元素放在它左边,比它大的元素放在右边
• 如果它恰好在中位数的位置,那么它就是中位数,直接返回
• 如果小于它的数超过一半,那么中位数一定在左半边,递归到左边处理(还是第几大)
• 否则中位数一定在右半边,根据左半边的元素个数计算出中位数是右半边的第几大(重新算第几大),然后递归到右半边处理

(2)当内存不足时:

分桶法

把所有数划分到各个小区间,把每个数映射到对应的区间里,对每个区间中数的个数进行计数,数一遍各个区间,看看中位数落在哪个区间,若够小,使用基于内存的算法,否则继续划分。

比如数是32位的,根据每个整数的二进制前5位,划分为32个桶,把数放进对应桶中。如果该桶放不下,继续划分,直至内存可以放心为止。统计每个桶中元素个数,算出中位数一定出现在哪个桶中,而且计算出是该桶中的第几大。
————————————————


 

①内存够:内存够还慌什么啊,直接把100亿个全部排序了,你用冒泡都可以...然后找到中间那个就可以了。但是你以为面试官会给你内存??

 

②内存不够:题目说是整数,我们认为是带符号的int,所以4字节,占32位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值