题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。
关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。
分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。
1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。
2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。
3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k) 次,这里要扫描5次。
解法:首先假设是32位无符号整数。
1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。
说明:整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。
2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。
3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。
4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。
总结:
1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。
2. 考虑其他情况。
若是有符号的整数,只需改变映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。
3. 时空权衡。
花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。
4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。
分享到:
相关推荐
本篇文章将详细探讨如何解决"海量数据查找数据问题",并着重讨论如何在海量数据中寻找中位数以及查找特定的数。 首先,我们来关注如何在海量数据中找到中位数。中位数是一组数据的代表值,它能够反映出数据的整体...
4. **整数去重计数**:在2.5亿个整数中找出不重复的整数个数,当内存不足以存储全部整数时,可通过Bit-Map或Bloom Filter来估算不同整数的数量,利用其空间高效性解决。 通过上述方法的总结与实践案例的解析,我们...
- 在2.5亿个整数中找出不重复的整数的个数。同样可以使用Bit-Map的方法来解决此问题。 #### 五、结论 本文详细介绍了三种常见的大数据处理方法:Bloom Filter、Hashing和Bit-Map。这些方法各有特点,在不同的应用...
- **案例三:整数去重**:在2.5亿个整数中找出不重复的整数个数,当内存不足以容纳所有数据时,可以采用Bit-Map或优化后的Bloom Filter来标记元素的出现情况,进而统计不重复整数的数量。 ### 结论 海量数据处理...
在内存限制为4GB的情况下,找出A和B文件中的共同URL。可以通过构建Bloom Filter来降低内存消耗,尽管这可能会导致误报率的增加。 #### 二、Hash **定义**: Hash是一种将任意长度的输入数据转换为固定长度输出的...
7. 需要在海量数据中找出重复次数最多的一个。解决方法是使用HashMap来统计每个数据的频度,然后使用堆排序来输出频度最高的数据。 8. 给定上千万或亿数据,有些是相同的(重复),需要把重复的全部去掉,保留没有...
实战例子:在海量日志数据中找出访问百度次数最多的IP,可以通过哈希表直接存储IP并进行计数。 3. **Bitmap(位图)** 位图利用位数组来表示有限元素集中的每个元素是否存在,适用于数据范围相对较小的情况,例如...
位图数据结构的一个经典应用场景是海量日志数据的处理,比如找出某天访问某网站次数最多的IP地址。 具体应用实例包括处理大规模数据文件共同URL的问题,以及海量日志数据中找到访问频率最高的IP。这些实例都涉及到...
- 最后,比较所有小文件中频率最高的IP,找出全局的最高频率IP。 2. **案例二:统计最热门的10个查询串** - **问题背景**:给定一千万条记录,需要找出最热门的10个查询串。 - **解决方案**: - 使用哈希表在O...
大数据量的处理是现代信息技术领域中不可或缺的一部分,尤其在互联网巨头如百度、谷歌和腾讯等公司中,面对海量数据的存储、检索和分析是一项核心挑战。本文将总结一些常见的大数据处理方法,包括Bloom Filter、...
标题中的“大数据量,海量数据处理方法总结参照.pdf”表明这是一个关于处理大量数据的技术文档,主要探讨了在处理海量数据时的各种策略和方法。描述提到这些方法常出现在像百度、谷歌、腾讯这样的大公司面试笔试中,...
- 应用场景:如在海量日志数据中,可以通过哈希IP地址并存储在内存中,统计每个IP的访问次数以找出访问最频繁的IP。 3. **Bit-Map** Bit-Map是使用位数组来表示特定范围内的元素是否存在,适用于数据范围较小但...
首先,通过Map阶段将日志中的IP与访问次数对应起来,然后在Reduce阶段对相同IP的访问次数进行求和,最后找出访问次数最多的IP。 2. **检索串频率统计** 这个问题涉及到搜索引擎的查询分析。可以使用Trie树或者...
15. **寻找中数**:在分布式环境中,可以使用分布式排序算法,如MapReduce的归并排序,然后找出中位数。 以上解决方案都依赖于分布式计算框架,如Hadoop和Spark,以及高效的算法和数据结构,如哈希表、堆、Trie树、...
在处理海量日志数据时,例如找出一天内访问百度次数最多的IP,可以利用Bitmap将所有可能的IP地址存储在内存中,然后遍历日志记录进行统计。 综上所述,面对大数据量和海量数据处理,Bloom Filter、Hashing和Bitmap...
在 2.5 亿个整数中找出不重复的整数,内存不足以容纳这2.5 亿个整数。 方案 1:采用 2-Bitmap(每个数分配2bit,00 表示不存在, 01 表示出现一次, 10 表示多次,11 无意义)进行,共需内存内存,还可以接受。 ...
以上技术在大数据场景下尤其重要,它们能够在有限的内存资源下处理海量数据,提供高效且节省空间的解决方案。理解和熟练运用这些数据结构和算法是IT专业人员必备的技能。在实际应用中,可以根据具体需求和资源限制...
数据挖掘是一种从海量数据中提取有价值信息的过程,它在商务智能领域扮演着至关重要的角色。中国统计年鉴2013年版是一个详尽的数据集合,涵盖了当年中国的经济、社会、文化等各个方面的统计数据,是进行数据分析和...
2. 数据探索:这是数据分析的初步阶段,通过统计方法(如描述性统计、可视化)来了解数据的基本特征,如平均值、中位数、分布情况等。直方图、散点图和箱线图是常用的可视化工具,能帮助识别数据的潜在结构。 3. ...