数据结构与算法:大数据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)