每天一个面经系列--面经004:十亿个整数,找出中位数(待完善...)

博客介绍了不同内存条件下找中位数的方法。当内存足够时,普通情况采用快排,随机选数划分左右,递归处理找到第n大的数;特殊情况未提及具体方法。当内存不足时,使用分桶法,将数划分到小区间,计数后确定中位数所在区间,若区间够小用基于内存算法,否则继续划分。

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

一  当内存足够时

1.  普通情况下

采用快排,找到第n大的数。过程如下:

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

2.   特殊情况下

 

 

 

二  当内存不足时

分桶法

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值