链接:http://blog.sina.com.cn/s/blog_62714d6a0100m96m.html

文件中有10G个整数,乱序排列,要求找出中位数

(2010-09-25 18:15:03)

转载▼
标签:

杂谈

分类: 算法

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

关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。

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

思想:将整形的每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个文件写回磁盘上。一般而言,如果第二步过后,内存可以容纳下存在中位数的某一个文件的话,直接快排就可以了。

10G数据量,只有2G内存,怎样找到中位数?相关推荐

  1. 小内存海量数据,找中位数: 只有2G内存,在10G数据量怎样找到中位数?

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

  2. 10G的文件,2G内存,统计出现频率最高的数字

    记录一个问题: 有一个10G大小的文件,文件内为一行一个的整数,给定可使用内存为2G.要求统计出现次数最多的数字. 1.bitmap实现 每个字节位置存放0或者1 1表示出现了,出现多次累加.最后看最 ...

  3. SQL Server表的数据量大小查询

    今天想在服务器上还原一个DB,发现磁盘空间不够,查看发现,其中一个DB竟然有56G了.因此想收缩一下这个DB,发现大小没多大变化.然后在网上找了找SQL脚本,看能不能查看下哪个表的数据量那么大. 网上 ...

  4. Java实现excel大数据量导入

    情景分析: 通常我们通过poi读取excel文件时,若在用户模式下,由于数据量较大.Sheet较多,很容易出现内存溢出的情况 用户模式读取excel的典型代码如下: FileInputStream f ...

  5. 大数据量下(批量)提升性能的方法以及常见的性能优化方法

    数据库层面(包含数据库设计和语句):尽量做到节省时间和数据库开销 1.让语句更加合理,符合查询优化的规则.避免全表扫描,建立高效索引,正确利用索引等. 2.避免频繁创建和删除临时表. 3.尽量避免向客 ...

  6. rdd数据存内存 数据量_大数据开发-Spark调优常用手段

    Spark调优 spark调优常见手段,在生产中常常会遇到各种各样的问题,有事前原因,有事中原因,也有不规范原因,spark调优总结下来可以从下面几个点来调优. 1. 分配更多的资源 分配更多的资源: ...

  7. rdd数据存内存 数据量_Spark 性能优化(二)——数据倾斜优化

    1.2 数据倾斜优化 1.2.1 为何要处理数据倾斜(Data Skew) 什么是数据倾斜?对 Spark/Hadoop 这样的大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜. 何谓数据倾斜?数据 ...

  8. 【漫漫科研路\pgfplots】克服绘制色温图时,数据量大出现的内存限制

    在科研论文写作中,经常会遇到画色温图,3D图.此时一般输入的数据量比较大,导致在Latex中使用Tikz画图时出现内存不足的情况.常常报错如下: ! TeX capacity exceeded, so ...

  9. 接口数据量太大,导致内存溢出,解决办法

    通常我们使用接口调用数据总是返回一段我们需要的信息,或者是json 格式信息,通过接收将数据保存到程序当中,再对接收到的数据进行转换成对应的模型格式 .目前遇到的问题是接收的数据量过于巨大,导致完整接 ...

最新文章

  1. 查看python安装路径
  2. 工作总结书写的意义及要求
  3. 解决SVN提示https证书验证失败问题svn: E230001: Server SSL certificate verification failed: certificate issued
  4. 黑马Java架构师实战训练学习手册
  5. Spark SQL 处理流程分析 (一)
  6. Centos下的apache2练习
  7. getminimum_Java Calendar getMinimum()方法与示例
  8. MicroMsg.SDK.WXMediaMessage: checkArgs fail, thumbData is invalid
  9. photoshop cs6 界面字体太小解决方法
  10. 深入剖析MSAA多重采样抗锯齿(multisample anti-aliasing)
  11. ​全球首个机器人抓取云竞赛落幕,华科夺冠,中国团队包揽前三
  12. [转载]Java 2007:新年展望
  13. easyui mysql 分页_Easyui 树形网格添加分页_EasyUI 教程
  14. linux 构建ios_如何使用SlackTextViewController构建iOS聊天应用
  15. jetty 去掉项目名称访问
  16. 【GPT4】微软 GPT-4 测试报告(1)总体介绍
  17. 转载招聘信息及求职建议
  18. python项目实战:控制Windows电脑桌面壁纸
  19. axis调用java实现webservice实例
  20. Python中对文件的测试

热门文章

  1. Arduino基本知识
  2. 登陆163邮箱 验证邮箱帐号密码是否正确
  3. Hash表的初步认识
  4. Android 集成facebook 登录和分享
  5. 解决vue用ckplayer播放器pc端可以正常使用但是移动端提示:please use the http protocol to open the page
  6. android 实时同步短信,备份Android短信的4种方法你最好知道
  7. SQL优化步骤(建议收藏)
  8. 阿里滑块 某宝的x82y解决方法、x5sec
  9. 在校大学生计算机等级考试可以在其他省考吗
  10. 蚂蚁金服首席架构师:区块链技术如何促进数字普惠金融