100亿个数中寻找中位数

news/2024/12/23 0:52:39/

题目:

在一个大文件中有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,-2^31+43000),a2的区间[-2^31+43000,-2^31+86000)......一直到a100000的区间;(这是组数与项数的一个平衡问题);

(2.1)我们首先装载第一个1亿个数,遍历这些数,比较大小,看他落入a1至a100000的哪个区间,落入的对应区间统计计数增1;这次是对这里面的数区间的组映射;

(2.2)重复步骤(2.1),装载100次,这样我们就得到了a1至a100000的区间统计计数的取值;

(2.3)内存分析:1亿个数用来装载,100000个区间统计计数耗费400000个字节,足够使用;剩余内存(128M-1亿-100000)*4B;

(3.1)使用sum依次累加a1至a100000的区间统计计数,直到累加某区间ai后sum大于50亿了;那么第50亿个数就在该区间中,用sum减去该区间ai的统计数的到first;即前面的区间统计总数位置为第first个(其中first < 50亿);

(3.2)那么我就在ai区间找到第50亿-first个数,或第50亿-first+1个数(第50亿-first+1个数这个数可能在ai后面的区间,但是概率很小,但是找到的原理类似);

(3.3)内存分析:每一个区间分割比较要花费100000个区间比较数,耗费400000个字节,足够使用;剩余内存(128M-1亿-100000-100000-2)*4B;

(4.1)再次遍历这100亿个数,还是每组1亿个数,一共100组;对于若在ai区间的43000个数的每一个都开一个统计计数器 ,跟上面类似,这次是对这里面的数单个映射;

(4.2)同样使用sum依次累加这1至43000的的统计计数,直到累加某区间后sum大于50亿-first;那么我们可以得到第(50亿-first)个数就在对应的位置;而且第(50亿-first+1)个数位置也有可能在,或在下一个统计计数大于0的位置;当然也有可能不在ai区间;(但原理类似);

(4.3)得到了第(50亿-first)个数值;而且第(50亿-first+1)个数值,可算出中位数了;

(4.4)内存分析:上述的100000个比较数,此时我们只需要两个比较数;100000个区间统计计数全部释放掉,但增加了43000位置统计计数;剩余内存(128M-1亿-43000-2-2)*4B;还是足够使用的;

(5)总共遍历两遍100亿数据;


http://www.ppmy.cn/news/323783.html

相关文章

从1亿个数里面找出前100个最大的

从1亿个数里面找出前100个最大的 这个题目应该是一些大公司面试题中经常被问到的&#xff0c;这里我给出一种做法&#xff0c;至于面试官满不满意我就不知道了。我们知道&#xff0c;这种找出前多少个最大或者最小的最适合用堆排序(对堆排序不熟悉的读者可以参考为的这篇博客&…

AI大牛李沐带你来装机!你也能练100亿的大模型

NewBeeNLP干货 作者&#xff1a;李沐&#xff0c;亚马逊首席科学家&#xff0c;来源&#xff1a;新智元 【新智元导读】AI大牛李沐带你来装机&#xff01; AI大牛沐神来装机了&#xff0c;还是训练100亿参数模型那种。 在还没出装机视频前&#xff0c;李沐老师曾发起了一个小小…

100亿数据找出最大的1000个数字(top K问题)

在大规模数据处理中&#xff0c;经常会遇到的一类问题&#xff1a;在海量数据中找出出现频率最好的前k个数&#xff0c;或者从海量数据中找出最大的前k个数&#xff0c;这类问题通常被称为top K问题。例如&#xff0c;在搜索引擎中&#xff0c;统计搜索最热门的10个查询词&…

近100亿!高水平新大学,竣工!中法航空大学

总投资约93.8亿元&#xff0c;计划于2023年招生办学的中法航空大学&#xff0c;再传新消息。 3月30日&#xff0c;中法航空大学项目学院组团二顺利完成单位工程竣工验收&#xff0c;成为项目首个完成单位工程验收的组团&#xff0c;向竣工总目标迈出重要一步&#xff01; 中法航…

2022年全球高净值人士净流入前十国家阿联酋居首;京沪跻身全球百万富翁最多城市前十;美中印亿万富翁数量全球前三 | 美通社头条...

2022年全球高净值人士流入前十国家 投资咨询公司Henley & Partners公布2022年全球财富迁移调查&#xff0c;分析市场研究机构新世界财富&#xff08;New World Wealth&#xff09;预测的全球高净值人士&#xff08;百万富翁&#xff0c;以美元计&#xff09;迁移动向。该调…

海量数据处理:在100亿个数中找出top 10000

经典的TOP K问题&#xff0c;借助堆排序进行 前两天面试3面学长问我的这个问题&#xff08;想说TEG的3个面试学长都是好和蔼&#xff0c;希望能完成最后一面&#xff0c;各方面原因造成我无比想去鹅场的心已经按捺不住了&#xff09;&#xff0c;这个问题还是建立最小堆比较好…

求100亿个数的中位数

1、题目描述 给定100亿个无符号的乱序的整数序列&#xff0c;如何求出这100亿个数的中位数&#xff08;中位数指的是排序后最中间那个数&#xff09;。 2、解题思路一 一个无符号整数的大小为4B&#xff0c;则100亿个数的大小为40GB&#xff0c;如果内存够大的话可以对这100亿…

OpenAI创始人拿微软100亿,是在下一步大棋

丰色 编译自 凹非寺量子位 | 公众号 QbitAI OpenAI获得微软100亿美元投资的消息出来后&#xff0c;一些人的想法有些沮丧&#xff1a; 一方面&#xff0c;摆脱了经济压力的OpenAI可能将不再那么“open”、顺而放弃“开发造福每个人的AI技术”的精神&#xff1b; 另一方面&#…