网上找的一道算法题,比较悲剧了,看了半天也没咋看懂,可能是:查找的算法没搞清 ; 计算机组成原理木有搞的很清楚。(快考试了,赶紧好好弄明白吧,否则拖下去。。。搞懂的日子就遥远了啊。。。) 题目的意思就是从海量数据中找出中位数。 在此记录下,有时间继续弄明白了。。。 题目:在一个文件中有 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
关于08年腾讯笔试的最后一道题,找中位数
最新推荐文章于 2024-05-12 20:01:39 发布