一个很大的文件,存放了10G个整数的乱序数列,如何用程序找出中位数。
一、梳理审题
一、看清题目:
注意这个题目的量词,这个文件中有10G个整数,而不是这个文件占了10G的内存空间。
二、一些疑问:
在计算机中我们讲的G、M等都是存储容量的概念,但是一般都会在会面加上B,即Byte字节的意思,如1GB=1024MB,而在计算机中G默认为是GB的缩写。
所以这个题目我认为出的不严谨,因为10G个,”个“字作为一个量词,前面应该是个单纯的数字,但是这里却说的是10G,存储容量?所以搞的人有些云里雾里,包括网络上的一些博客,对于这一点都是一笔带过,没有做过多的讨论或思索。
三、自己假设:
我在这里姑且揣测题目作者所认为的10G个等同于10*1024*1024*1024个,但明显题目中的这个表述是有问题的。
二、分析问题
一个文件中有10G个!个!数,一共2G内存,求中位数,10G是偶数,那也就第n/2个数和第(n+1)/2个数相加除以二。
10G=10*1024*1024*1024,1024=2^10
10G=10*2^30=5*2^31
第一步:在计算机中如何表示10G个这个数字?
因为5*2^31 > 2^32,所以要表示10G这个数量(假如文件中有10G个1),32位是存不下的,我们要用64位进行存储。
第二步:分区间
一共有2G内存,那么一次性读入内存的数的个数是 2G / 64bit(按byte和bit去除得到的只是一个比例) = 2^31 /2^3= 2^28个,单位就是个,不是M等等,网上的很多文章中256M的表述是错的,因为M在计算机中是MB的缩写是空间单位,而在数学中M=兆=一百万。
第三步:求区间的表示范围
区间段有限,取值范围较大,一共有2^32个数(0 ~ 2^31-1),但是只有2^28个区间段(区间段可以理解为容器或者桶)
则一个桶里面要容纳 2^32/2^28=2^4=16,每个区间段要放16个数。
即第一个桶放0-15的数,而16-31则放在第二个桶里面...以此类推
第四步:第一次遍历
然后我们开始遍历,将10G个数中的每一个数都放到对应的桶里面,如当前读到数字为18则放到第二个桶里面,第二个桶中所含有的数字总个数+1。
遍历完,我们将10G个数中的每一个数都放在,他们应在的那个区间段(桶)里面了,这个2^28个桶是在内存中的,每个桶64位,恰好装满2G内存。
第五步:确定中位数所在的区间
那么然后,我们对于这个区间段队列中的每个段的总个数进行累加,当加到第5G个!个!数时,停止,那么第!第!5G个数所在的区间段就是中位数所在的区间段,将此区间段表示为[a,a+15],在此区间段之前的所有区间段所包含数字的总个数为m。
释放掉内存后...
第六步:确定最终的位置
再次遍历10G个数,统计出现在[a,a+15]这个区间段中的,每个值,所出现的个数,最多有可能有16个数字,当然也有可能只有一个,按照a..a+15进行排序,设为n0,n1...n15。
当m+n0+n1...+nx 首次大于5G时,此时的 a+x 就是所求的中位数(当总数为奇数时),为偶数时则是(a+x+a+x-1)/2,当然有可能a+x和a+x-1在两个区间中。
这里有一个极端情况,就是所有10G个数都落在同一个桶里面,那么在第二次遍历的时候就需要对全部10G个数进行遍历。
参考文章:http://blog.sina.com.cn/s/blog_8e9c63c70101f5pl.html
一个很大的文件,存放了10G个整数的乱序数列,如何用程序找出中位数。的更多相关文章
- 在一个文件中有10G个整数,乱序排列,要求找出中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- 【转】文件中有10G个整数,乱序排列,要求找出中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- 腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
腾讯面试题:10G 个整数,乱序排列,要求找出中位数.内存限制为 2G. 题目和基本思路都来源网上,本人加以整理. 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只 ...
- node.js 如何处理一个很大的文件
node.js 如何处理一个很大的文件 思路 arraybuffer 数据分段 时间分片 多线程 web workers sevice workers node.js 如何处理一个很大的文件 http ...
- centos7 误用 cat 打开了一个很大的文件
2021-09-01 1. 问题描述 刚才看到一个文件,出于好奇我就直接用 cat 命令查看了一下,结果文件巨大,一直刷屏停不下来 2. 解决方法 克隆一个窗口,抓一下这个 cat 进程,再使用 ki ...
- 10G整数,找出中位数
摘自: http://www.cnblogs.com/avril/archive/2012/04/20/2460805.html http://blog.csdn.net/flyinghearts/a ...
- 10G个64bit整数,找出中位数
[10G个64bit整数,找出中位数] 题目:在一个文件中有10G个64bit整数,乱序排列,要求找出中位数.内存限制为2G. 解法:内存限制为2G表面上是限制,实际上是一种提示,在提示我们如何利用2 ...
- 如何用 php 读取一个很大的 excel 文件。
这个程序是用php 读取一个很大的excel文件, 先将 excel 文件保存成csv 文件, 然后利用 迭代器 逐行读取 excel 单元格的值, 拿到值以后 做相应处理,并打印结果. <?p ...
- 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)
引用 前几天在网上看到一个淘宝的面试题:有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果.一:分析题目 从题中可以看到“很大的List”以及“ ...
随机推荐
- swift - UIProgressView的用法
1.创建进度条 progressView.frame = CGRect(x:10, y:230, width:self.view.bounds.size.width - 20, height:150) ...
- ios 添加动画的方法
转自文顶顶大神的博客:http://www.cnblogs.com/wendingding/p/3751519.html ios 开发UI中,经常会用添加动画效果的需求,下面就总结一下,添加动画的三种 ...
- 关于MCU的烧录,下载与其他接口的比较(一)
今天呢,犯了一个很严重的错误,我不知道这会产生什么样的影响,但我知道,如果我以后再没有具体的了解,仔细认真地观察,认证,只会滑到无底的深渊.做技术来不得半点虚假,切记一知半解,凡事都要弄得清楚明白,认 ...
- Windows下Mysql主从配置(Mysql5.5)
主数据库IP:192.168.3.169从数据库IP:192.168.3.34 主数据库配置my.inin: 在[mysqld]下添加配置数据:server-id=1 #配一个唯一的ID编号, ...
- [原创]用Oreans UnVirtualizer还原VM代码
标题:[原创]用Oreans UnVirtualizer还原VM代码实验 作者:sungy 时间:2014-09-18 对VM一直很头痛,在逆向实践一般尽量想办法避开它,当黑盒来处理.有时候不面对她又 ...
- 小程序:将gbk转为utf-8
是否有过写了半天代码,发现竟然用的GBK编码,然后到主UTF-8上发现中文全部变成乱码了... 下面这个程序,只要输入src的位置,瞬间转换成utf-8 package tools; import j ...
- codeforce 148D. Bag of mice[概率dp]
D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- shell批量重命令文件脚本
批量重命名脚步记录,以备用 假如有一批11.txt 12.txt 13,txt 14.txt 15.txt脚步要要重命名为1.txt 2.txt 3.txt .... 脚本如下: #!/bin/bas ...
- flex弹性布局属性详解!
详细看下flex弹性布局具体属性: flex容器属性详解:flex-direction:row/column:(横排/竖排) 决定元素的排列方向:flex-wrap:nowrap/wrap/wrap- ...
- [Android] 配置安卓模拟器,使得dex文件不被优化成odex
最近做一个模块,需要将apk里面加载的dex文件dump出来,所以需要配置让dalvik不要把dex文件优化成odex. 1. 配置build.prop 主要是通过修改文件/system/build. ...