题目:在一个文件中有 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个文件写回磁盘上。一般而言,如果第二步过后,内存可以容纳下存在中位数的某一个文件的话,直接快排就可以了。关于快排的效率,可以看看我博客中的数据《基于比较的内部排序总结 》。

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. 100亿个数中寻找中位数

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

  5. 在1000万整数中找到前100个最大的数 算法

    这一段时间写毕业设计,遇到一些大数据的情况,想起之前和同学讨论的最优算法,写一下相关思路. 在1000万整数中寻找最大的100个数,最优的算法是建一个大小为100的小顶堆(堆排序需要建立完全二叉树), ...

  6. 找出N个整数中最大的K个数

    原文来自:博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun 如题:给出N个整数(N可能很大,以致无法装入内存),找出前K个最大的整数 [ ...

  7. 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: ...

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

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

  9. 一个整数称为完全平方数,是指它的值是另一个整数的平方。如81是个完全平方数,因为它是9的平方。请按要求完成:①在三位的正整数中寻找所有完全平方数;例如:144(12*12),676(26*26)

    一个整数称为完全平方数,是指它的值是另一个整数的平方.如81是个完全平方数,因为它是9的平方.请按要求完成: ①在三位的正整数中寻找所有完全平方数; 例如:144(12*12),676(26*26)  ...

最新文章

  1. 实验二:网络嗅探与欺骗
  2. 计算机问题在线解答,2014年计算机专业复习疑难问题答疑
  3. vim的模式及常用命令
  4. php的内置函数strrpos_php strrpos 字符串查找函数内部源码实现
  5. I/O多路转换 select
  6. 12c表空间不存在_一文看懂Oracle查询表空间的每日增长量和历史情况统计
  7. Linux开放21通信,linux下开启ftp的21号port
  8. SAP License:做顾问要有一颗平常心
  9. monggodb和MySQL同步问题_monggoDB添加到windows服务
  10. 单片机高效c语言编程,飞思卡尔单片机高效C语言编程(中文).pdf
  11. linux java解压文件怎么打开,java linux 解压zip文件怎么
  12. win11右键新建没有txt文本文档记事本怎么办
  13. win10右键英特尔显卡控制面板不见了(如何打开英特尔® 显卡的控制面板 )
  14. python的help()用法
  15. matlab应用最简差分格式,泊松方程有限差分格式的构造以及MATLAB实现.docx
  16. ios计算机隐藏功能,10个iOS12使用技巧和隐藏功能,让你快人一步成为玩机达人...
  17. 低功耗设计及其UPF实现第四节(最后一节)
  18. Win11右键菜单反应慢有延迟解决方法分享
  19. 海外版抖音TikTok如何运营?
  20. 第2章 感知机 - 对偶形式

热门文章

  1. Java学习第一周总结
  2. 等比缩放公式_图片等比例缩小算法
  3. 基于京东云服务器来搭建javaWeb 运行环境
  4. 小米Recovery线刷精灵 v1.0.0 破解版
  5. android sms 接收短信,Android SMS 短信操作
  6. 朋友圈评论发html,微信评论怎么发图片(微信朋友圈评论可以发表情包啦)
  7. 2013房价必然拉开大崩溃的序幕
  8. 跳过SourceTree的注册步骤
  9. holder.js如何使用
  10. 大数据的预测实力,这15个有趣的数据集,你可能闻所未闻