一个很大的文件,存放了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”以及“ ...
随机推荐
- 九度 1534:数组中第K小的数字(二分法变形)
题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C.譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6].现在给你数组A和B,求 ...
- 实例:用类来写一个 memcached 启动脚本
[root@localhost ~]$ yum install -y memcached #!/usr/bin/env python #-*- coding:utf-8 -*- import os i ...
- Qt监控Access数据库
配置文件setup.ini内容 [General] DBFilePath=C:/Users/WangGang/Desktop/Database1.accdb DBUserName= DBPasswor ...
- ScrollView拉到尽头时出现阴影的解决方法
<code class="hljs markdown has-numbering" style="display: block; padding: 0px; col ...
- Google Inc.:Google APIs:23' 解决方案
在导入一个项目是,出现 Unable to resolve target 'Google Inc.:Google APIs:6'第一种解决方法: compileSdkVersion 23 改成 com ...
- iOS设计模式之类族(class cluster)
类族模式在UIKit(user interface framework)使用的范围已经远远超过我们的想象,比如,UIButton,NSArray,NSString,NSNumber等, 例如NSNum ...
- PHP之变量
前面的话 变量是用于临时存储值的容器.这些值可以是数字.文本,或者复杂得多的排列组合.变量在任何编程语言中都居于核心地位,理解它们是使用php的关键所在.下面将详细介绍php中的变量 [注意]关于ja ...
- c++11——std::function和bind绑定器
c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有ope ...
- UVa 568 - Just the Facts
这道题和这几段牛代码让我见识了精简与高效.好好学习! http://blog.csdn.net/lyhvoyage/article/details/9307009
- linux下远程服务器批量执行命令及SFTP上传文件 -- python实现
之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能.之前脚本地址:http://www.cnblogs. ...