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

一、只用2GB内存在20亿个整数(32位)中找到出现次数最多的数

解题思路:

想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数。就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会溢出,所以哈希表的key占用4B,value占用4B,因此一条记录占用8B,在极端情况下,有20亿条记录,需要20亿*8B=16GB>2GB。

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

二、海量日志数据,提取出某日访问某网站次数最多的那个IP

首先是这一天,并且是访问指定网站的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个^32个IP。同样可以采用映射的方法, 比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大 的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。
算法思想:分而治之+Hash

1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

原文地址:https://www.cnblogs.com/xiaomoxian/p/5161428.html