题目
有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数,内存限制为2GB。
思路
在整数中找到出现次数最多的数,通常做法是使用哈希表对出现的每一个数做词频统计,Key为整数,Value为出现的次数。本题中,32位的整数作为Key,需要4B空间,Value最大值为20亿(在20个数均为同一个数的情况下),用32位的整数完全可以存储,也需要用4B内存空间,这样,一个键值对需要占用8B的内存空间。在内存为2GB的情况下,最多能存储268435456条记录,显然,用2GB的内存空间统计会有风险。
解决方法把包含20亿条记录的大文件用哈希函数分成16个小文件,根据哈希函数的性质,同一个数不可能被分到不用的小文件上,同时,每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够好。然后对每一个小文件用哈希表统计其中每种数出现的次数,这样16个文件共产生16个出现次数最多的数,再求出出现次数最多的即可。