题目:
在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数;内存限制为512M;请写出算法设计思路;
基本分析:
(1)中位数的定义:一个给定排序好的序列,奇数个的话,我们就取中间的一个;偶数个的话,我们一般取中间两个数的平均值;因此对于本题,我们需得到中间的第50亿和第50亿+1这两个数;
(2)首先512M的内存,如果都来装这个32位整数的话,可以存储2^(9+10+10)/4=2^27(134217728)个数(1亿左右的数);常规的内部排序肯定是不行了,因为内存不够;而且是乱序排列,所以二分查找不行;所以本题的时间复杂度最少为O(n);
(3)由于内存是512M,可存储1亿个数;那么我们先把100亿个数分成100组;使用512M高内存可装载1亿个数,装载100次;
算法思路:
(1)我们要划分映射区域,一个有符号的32位整数的取值范围是[-2^31, 2^31-1],总共有4294967296个取值,因此我们将它划分成100000组,即43000个数映射到一个组,将a1的区间[-2^31,