只用2GB内存在20亿个整数中找到出现次数最多的数

Posted 小纸条

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只用2GB内存在20亿个整数中找到出现次数最多的数相关的知识,希望对你有一定的参考价值。

【题目】

有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。

【要求】

内存限制为2GB。


【解答】

想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数。就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会产生溢出,所以哈希表的key需要占用4B,value也是4B。那么哈希表的一条记录(key,value)需要占用8B,当哈希表记录数为2亿个时,需要至少1.5GB的内存。

(技术图片)

(32位最大支持4g寻址,20亿=技术图片 ,1g=技术图片)

 但如果20亿个数中不同的数超过2亿种,最极端的情况是20亿个数都不同,那么在哈希表中可能需要产生20亿条记录,需要15g内存,这样内存会不够用,所以一次性用哈希表统计20亿个数的办法是有很大风险的。

解决办法是把包含20亿个数的大文件用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被哈希到不同的小文件上,同时每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够好。然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样我们就得到了16个小文件中各自出现次数最多的数,还有各自的次数统计。接下来只要选出这16个小文件各自的第一名中谁出现的次数最多即可。

把一个大的集合通过哈希函数分配到多台机器中,或者分配到多个文件里,这种技巧是处理大数据面试题时最常用的技巧之一。但是到底分配到多少台机器、分配到多少文件,在解题时一定要确定下来。可能是在与面试官沟通的过程中由面试官指定,也可能是根据具体的限制来确定,比如本题确定分成16个文件,就是根据内存限制2GB的条件来确定的。

以上是关于只用2GB内存在20亿个整数中找到出现次数最多的数的主要内容,如果未能解决你的问题,请参考以下文章

面试被虐如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?

挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?

大量数据的问题

[算法]海量数据问题之一

6.3 40亿个非负整数中找到没出现的数

CCF - 201312-1 - 出现次数最多的数