题目:

在一个大文件中有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亿数据;

100亿个数中寻找中位数相关推荐

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

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

  2. 1亿个数中找出最大的100个数(top K问题)

    如何在1亿个数中找出最大的100个数(top K问题) ​ 最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序.但是在32位的 ...

  3. 海量数据处理 - 10亿个数中找出最大的10000个数(top K)

    海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 版权声明:本文为博主原创文章,未经博主允许不得转载 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望 ...

  4. 10亿个数中找出最大的10000个数

    转载自  海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅 ...

  5. 10亿个数中找出最大的10000个数(top K问题)

    原博链接: https://blog.csdn.net/cbjcry/article/details/84917432 问题引入:10亿个数中找出最大的10000个数(top K问题) top K问题 ...

  6. 算法面试,如何在100 亿URL中判断某个URL是否存在

    转载自  算法面试,如何在100 亿URL中判断某个URL是否存在 如果面试官问你,一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节.问这个黑名单要怎么存?若此时随便输 ...

  7. 在10亿个数中找出前1000个最大的

    在10亿个数中找出前1000个最大的 假设现在有一个文件,里面存放了10亿个整数,需要找出前1000个最大的. 方法: 1.普通排序,部分排序:几乎不可取. 2.分治法:随机选一个数t,然后对整个数组 ...

  8. 谈从10亿个数中找出前10万个最大的

    谈从10亿个数中找出前10万个最大的 期的实验显示10亿个浮点数大概占据3G左右的空间,因此全部一次性读入内存目前在个人PC上是不太现实的.本次讨论不考虑内存等等,只考虑算法. 如果一次性比较排序,然 ...

  9. 5 判断数据是否存在_Trie树实现:100亿URL中判断某个URL是否存在

    之前在头条看到一篇<如何在100亿URL中判断某一个URL是否存在>,里面介绍的是使用布隆算法bloomfilter,我们也知道bloomfilter只能保证URL不存在. 在这里介绍一个 ...

最新文章

  1. 使用C语言中的宏来定位出错信息
  2. inline-block的兼容性问题
  3. Maven打包排除某个资源或者目录
  4. Oracle从小白到大牛的刷题之路(建议收藏学习)
  5. 硬件基础知识---(15) 二极管单项导电特性
  6. (4)二进制文件方式部署Kubernetes高可用集群----------安装kubectl命令行工具
  7. 谐波分析matlab仿真,教程:利用GUI对Simulink模型进行谐波分析
  8. html做qq钓鱼网站,QQ钓鱼网站是什么?
  9. ARM上移植ser2net源码
  10. 从石器时代到硅器时代
  11. U盘安装win8.1
  12. Kotlin by lazy解析及在findviewById场景中的使用
  13. 2022年最新广播电视广告报价(共23份)
  14. 解决word转PDF文件时图片位置改变和字体格式改变的问题
  15. githubDesktop的使用说明(附下载链接)
  16. 【揭密:刘强东9年密谋的商业布局—京东快物流背后的核心技术盘点】
  17. Java环境配置JDK1.8u、JDK11u安装(附jdk1.8u64位jdk11安装包)
  18. 计算机控制直流电机闭环调速实验报告,PID控制电机实验报告
  19. 【前端UI框架推荐】六个前端[web端]精致UI框架
  20. 手机root通用原理

热门文章

  1. J2ME 七巧板图库 七巧板查看器
  2. 77分钟完整视频 | 拥抱元宇宙, 改名Meta (中文字幕)
  3. Java版:字母的大小写转换
  4. Excel 行列数据互换
  5. git切换分支保存修改的代码的方法
  6. Vue 国际化之 vue-i18n 的使用
  7. 手绘与码绘————趣味交互式绘画系统的实现
  8. zone 的 2018 年终总结
  9. 服务器维护必刷稀有宠物,诛仙手游稀有宠物捕捉攻略 稀有宠物刷新时间地点汇总...
  10. 在 Surfer 中对具有不同网格几何形状的网格使用 Grid Math 和 Grid Volume