题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的    空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

分析: 既然要找中位数,很简单就是排序的想法。那么基于字节的桶排序是一个可行的方法 (请见《桶排序》):

思想:将整形的每1byte作为一个关键字,也就是说一个整形可以拆成4个keys,而且最高位的keys越大,整数越大。

如果高位keys相同,则比较次高位的keys。整个比较过程类似于字符串的字典序。

第一步:把10G整数每2G读入一次内存,然后一次遍历这536,870,912个数据。每个数据用位运算">>"取出最高8位(31-24)。

这8bits(0-255)最多表示255个桶,那么可以根据8bit的值来确定丢入第几个桶。

最后把每个桶写入一个磁盘文件中,同时在内存中统计每个桶内数据的数量,自然这个数量只需要255个整形空间即可。

代价:(1) 10G数据依次读入内存的IO代价(这个是无法避免的,CPU不能直接在磁盘上运算)。

(2)在内存中遍历536,870,912个数据,这是一个O(n)的线性时间复杂度。

(3)把255个桶写会到255个磁盘文件空间中,这个代价是额外的,也就是多付出一倍的10G数据转移的时间。

第二步:根据内存中255个桶内的数量,计算中位数在第几个桶中。很显然,2,684,354,560个数中位数是第1,342,177,280个。

假设前127个桶的数据量相加,发现少于1,342,177,280,把第128个桶数据量加上,大于1,342,177,280。

说明,中位数必在磁盘的第128个桶中。而且在这个桶的第1,342,177,280-N(0-127)个数位上。N(0-127)表示前127个桶的数据量之和。

然后把第128个文件中的整数读入内存。

(平均而言,每个文件的大小估计在10G/128=80M左右,当然也不一定,但是超过2G的可能性很小)。

代价:(1)循环计算255个桶中的数据量累加,需要O(M)的代价,其中m<255。

(2)读入一个大概80M左右文件大小的IO代价。

注意,变态的情况下,这个需要读入的第128号文件仍然大于2G,那么整个读入仍然可以按照第一步分批来进行读取

第三步:继续以内存中的整数的次高8bit进行桶排序(23-16)。过程和第一步相同,也是255个桶。

第四步:一直下去,直到最低字节(7-0bit)的桶排序结束。我相信这个时候完全可以在内存中使用一次快排就可以了。

整个过程的时间复杂度在O(n)的线性级别上(没有任何循环嵌套)。但主要时间消耗在第一步的第二次内存-磁盘数据交换上,即10G数据分255个文件写回磁盘上。一般而言,如果第二步过后,内存可以容纳下存在中位数的某一个文件的话,直接快排就可以了。关于快排的效率,可以看看我博客中的数据《基于比较的内部排序总结 》。

原文地址:http://hxraid.iteye.com/blog/649831

10G整数文件中寻找中位数相关推荐

  1. 10G整数文件中寻找中位数或者第K大数

    来源:http://hxraid.iteye.com/blog/649831 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就 ...

  2. 【腾讯】10G整数文件中寻找中位数

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...

  3. 10G整数文件需找中位数

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...

  4. 10G整数中寻找中位数

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...

  5. JSFinder—从js文件中寻找敏感接口和子域名

    说在前面 在渗透测试及漏洞挖掘过程中,信息搜集是一个非常重要的步骤.而在网站的JS文件中,会存在各种对测试有帮助的内容. 比如:敏感接口,子域名等. 社区内的文章也有有些关于JS文件提取信息的片段,比 ...

  6. 只有1G内存,如何对10G的文件中数据进行排序

    思考 1.归并.外排 2.多线程  RecursiveTask 测试生成文件代码 /****@author dongsheng*@date 2019/1/18 22:58*@Description:* ...

  7. 100亿个数中寻找中位数

    题目: 在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数:内存限制为512M:请写出算法设计思路: 基本分析: (1)中位数的定义:一个给定排序好的序列,奇数个的话,我们就取中间的一个: ...

  8. 在pdf文件中找关键字的坐标

    1.功能描述: 此功能主要功能就是在pdf文件中读取信息后查找指定页面的指定关键信息,获得相应的坐标. 首先要 itextpdf.jar, itext.jar包 //获取pdf的页数 PdfReade ...

  9. C语言——选择控制结构 寻找中位数v1.0编写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c);功能是返回a,b,c三数中大小位于中间的一个数。

    寻找中位数v1.0 编写一个函数返回三个整数中的中间数. 函数原型:int mid(int a, int b, int c); 功能是返回a,b,c三数中大小位于中间的一个数. 程序运行结果示例1: ...

最新文章

  1. 简述Android触摸屏手势识别
  2. IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件
  3. Nutch中MapReduce的分析[zz]
  4. Pandas高级教程之:处理缺失数据
  5. python中的逻辑量有什么_python逻辑运算符有哪些
  6. hashmap有关问题与计算
  7. 高通宣布与蔚来合作下一代数字座舱技术
  8. POJ1315 UVA639 UVALive5325 Don't Get Rooked题解
  9. mount远程驱动器
  10. 【杂题总汇】HDU多校赛第十场 Videos
  11. 电压转换速率(Slew Rate,SR)
  12. 【读书笔记】大话数据结构
  13. 四年级上册数学计算机笔记,读书笔记:最新人教版四年级上册数学总复习讲义...
  14. shell命令实现txt文件转换为csv文件
  15. 虚拟仿真实训教学管理及资源共享平台虚拟实训开发对接文档
  16. 开源3D图形渲染引擎OGRE学习笔记
  17. 安灯(Andon)系统,生产车间的得力助手
  18. css强制换行和超出隐藏实现(单行和多行)
  19. python实现SVG文件解析
  20. 非递归、递归遍历二叉树!

热门文章

  1. Primary主类和Catagory分类都存在相同事件
  2. 無間道III 終極無間
  3. android 平板z97,高清配置 翰智Z97-W通话版平板评测
  4. 耐摔 8寸 android,屏幕耐摔的手机有哪些?6款屏幕耐摔的手机推荐
  5. xmos固件u8_XU208 USB数字界面 XMOS U8升级版 模块_便宜推
  6. MySQL:2016年天猫双11化妆品销量数据分析
  7. 【数字信号调制】基于 AM+FM+DSB+SSB实现信号调制解调含Matlab源码
  8. ae去闪插件deflicker使用_ae去闪烁插件Flicker Free怎么用-ae去闪烁插件Flicker Free的使用教程 - 河东软件园...
  9. Jmeter打开badboy录制的脚本报类元素错误解决方法
  10. 网络对抗技术 实验三