数据结构与算法:大数据2

有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。但是内存限制只有2G。

通常的做法是使用hashmap

(4字节int型)key---具体的某一种数

(4字节int型)value---这种数出现的次数

那么一条key-value记录占有8字节

当记录数为2亿时,大约占用1.6G内存

那么如果20亿数据全部不相同,明显内存会溢出


优化解决方法:

使用哈希函数进行分流成16个小文件,由于哈希函数的性质,同一种数不会被分流到不同文件,而且对于不同的数,因为哈希函数分流是比较均匀的分配的,所以一般不会出现一个文件含有2亿个不同的整数情况,每个文件含有的种树也几乎一样

然后分别计算出每个文件中出现次数的第一名。

然后对这些第一名全部拿出来进行排序即可


---------------------------------------------------------------------------------------------------------------------------


32位无符号整数的范围是0-4294967295.现在有一个正好包含了40亿个无符号整数的文件,所以在整个范围中必然有没有出现过的数,可以使用最多10M的内存,只用找到一个没出现过的数即可,该如何找。

如果用哈希表来记录所有的数,最差的情况下,将出现40亿个不同的数。就算不是最坏的情况,10M内存明显是不够的。

如果使用bitmap申请一个2^32-1的空间,也至少需要500M的空间。(前一篇博客讲解过)


优化方法:

分成64个区间,总数为42亿,一共有40亿,那么肯定会出现有的区间计数不足2^32/64。

随便找出一个区间a.

然后在遍历一次40亿数,与出现在a上的数做比较,a上的数使用bitmap统计,500多兆 /64=大约8M的空间就能找出来。

总结:

1.根据内存限制来决定区间大小,根据区间大小,得到有多少个变量,来记录每个区间的数出现的次数

2.统计区间上数的出现次数,叨叨不足的区间

3.利用bitmap对不满的区间,进行这个区间上的数的词频统计


---------------------------------------------------------------------------------------------------------------------------

某搜索公司一天的用户搜索词汇是海量的,假设有百亿的数据量,请设计一种求出每天最热100词的可行办法。

使用哈希函数进行分流成n个机器,n个机器又分流成n个小文件。

利用小根堆排序选出每个文件top100,然后再进行整理选出每台机器的top100,

最终再次整理得到总的top100

(利用堆排序处理topK 的问题比较方便,时间复杂度为nlogn)

发布于 2017-08-28

文章被以下专栏收录