10G整数文件中寻找中位数或者第K大数
来源:http://hxraid.iteye.com/blog/649831
题目:在一个文件中有 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个文件写回磁盘上。一般而言,如果第二步过后,内存可以容纳下存在中位数的某一个文件的话,直接快排就可以了。关于快排的效率,可以看看我博客中的数据《基于比较的内部排序总结 》。
转载于:https://www.cnblogs.com/wuxiangli/p/5639011.html
10G整数文件中寻找中位数或者第K大数相关推荐
- 10G整数文件中寻找中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的 空间来运行程序,而不考虑这台机器上的其他软件的占用内 ...
- 【腾讯】10G整数文件中寻找中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- 10G整数文件需找中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- 10G整数中寻找中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- JSFinder—从js文件中寻找敏感接口和子域名
说在前面 在渗透测试及漏洞挖掘过程中,信息搜集是一个非常重要的步骤.而在网站的JS文件中,会存在各种对测试有帮助的内容. 比如:敏感接口,子域名等. 社区内的文章也有有些关于JS文件提取信息的片段,比 ...
- 只有1G内存,如何对10G的文件中数据进行排序
思考 1.归并.外排 2.多线程 RecursiveTask 测试生成文件代码 /****@author dongsheng*@date 2019/1/18 22:58*@Description:* ...
- 求两个有序数组中的中位数和第k小的元素
我们首先来看一下这一类题算法的原型: 对应牛客网链接: https://www.nowcoder.com/practice/08588d568e164e0a9958b5d6a3c351f5?tpId= ...
- 100亿个数中寻找中位数
题目: 在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数:内存限制为512M:请写出算法设计思路: 基本分析: (1)中位数的定义:一个给定排序好的序列,奇数个的话,我们就取中间的一个: ...
- 【分步详解】两个有序数组中的中位数和Top K问题
我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 地址:https://github.com/hk029/leetcode 这 ...
最新文章
- Codeforces 1300E. Water Balance[单调栈]
- c - 字符串的拼接.
- 一、select查询
- java怎么统计随机数出现次数,Excel统计出现次数、个数的VBA代码 java中怎么判断一个字符串中包含某个字符或字...
- linux 下创建并动态加载.so 文件
- 编写高性能 .NET 代码 第二章:垃圾回收 基本操作
- 第一章 计算机系统概述 1.2.3 计算机的多级层次结构 [计算机组成原理笔记]
- c++水平制表符怎么用_怎么才能把字写得好看一些?这四个方法用对了,水平会提升...
- python程序设计实践教程答案江苏_《Python程序设计》习题与答案python教材答案
- pe服务器注册表,在WIN PE环境下修改或导入系统注册表项
- 电子科技大学研究生图论课程
- 电路分析 极简复习指导、公式推导、常用结论归纳 第十章 含有耦合电感的电路
- 软件测试工程师市场需求量是多少,带你探索软件测试工程师月薪是多少
- 杭电 HDU ACM 圆桌会议
- 记录一个傻逼问题- 百度地图接入 鉴权问题
- 车企数字化转型中的核心技术应用
- 命令行修改mysql密码
- Apache Kafka - ConsumerInterceptor 实战 (1)
- linux下使用mplayer观看高清电影
- 虹科案例|NASA利用太赫兹技术探测月球上的水源