关于08年腾讯笔试的最后一道题,找中位数

网上找的一道算法题,比较悲剧了,看了半天也没咋看懂,可能是:查找的算法没搞清 ; 计算机组成原理木有搞的很清楚。(快考试了,赶紧好好弄明白吧,否则拖下去。。。搞懂的日子就遥远了啊。。。) 题目的意思就是从海量数据中找出中位数。 在此记录下,有时间继续弄明白了。。。 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 网上给出的一个答案是采用桶的思想,把数据映射到很多桶,再取中间桶找中位数,整个过程下来要扫描两遍数据。但其关键是对这海量的数大小有预先限制,那现在假设这些数的大小无法预先限制,而且10G个的整数,或者说题目改为每次只能去五分之一的数据拿到内存进行排序,那又该如何去解答这道题呢? 思考中。。。 附网上搜到的一个方法: 关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。 分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。 1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。 2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。 3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值