大数据题目的解题技巧:
1)哈希函数可以把数据按照种类均匀分流
2)布隆过滤器解决数据服务器的负载管理问题
3)一致性哈希解决数据服务器的负载管理问题
4)利用并查集结构做岛问题的并行计算
5)位图解决 某一范围上数字的出现情况,并可以节省大量空间
6)利用分段统计思想,并进一步节省大量空间
7)利用堆、外排序来做多个处理单元的结果合并
【题目】
32位无符号整数的范围是0~4,294,967,295(2^32 -1),现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然存在没出现过的数。可以使用最多1GB的内存,怎么找到所有未出现过的数?
使用位图,需要 2^32 / 8 = 2^29字节 约等于 2500MB
【进阶】
内存限制为10MB,但是只用找到一个没出现过的数即可
申请一个int数组,长512,占用512 * 4B = 2 KB
将0~ 2^32 - 1 范围(即大小为2^32的范围)均分为512份,每个范围为2^32/512 = 2^23,统计40亿个数落在每个范围的个数。
因为整个2^32范围只有40亿个数,因此512个小范围中必定有某个范围最后统计的数字个数不足2^23。再按同样的方法对该范围再进行划分,最终找到未出现过的数。
【再进阶】
只使用三个变量,找到一个没出现过的数
2^32的范围,一分为二,用两个变量分别统计每个范围的词频,一定有某个范围词频不足2^32/2,再对该范围进行二分,一直二分下去。
【题目】
有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL。
哈希分流,URL -> 哈希值 -> 取模,重复的URL肯定进一个文件,再在小文件里统计重复URL。
布隆过滤器,边添加边查,有失误率。
【补充】
某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天热门Top100词汇的可行办法。
通过哈希表将海量文件分流到一个个小文件里去,重复的词汇只会出现在同一个小文件里。
统计每个小文件里所有词的词频,把所有(词汇-词频)放进基于词频的大根堆。
把所有大根堆的堆顶加入一个大根堆(总堆),每次从总堆弹出一个,并把相应大根堆的堆顶去掉,新的堆顶加入总堆。
【题目】
32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数,可以使用最多1GB的内存,找出所有出现了两次的数。
哈希函数分流:万能方法。
位图:每两个位表示一个数,00表示出现0次,01表示出现1次,10表示出现2次,11表示出现3次及以上。
【补充】
最多可以使用10KB内存,怎么找到这40亿个数的中位数
范围统计
10KB 可表示多大无符号整形数组 : 10KB/4B = 2500 取2048
0 ~ 2^32 - 1 范围等分为2048份
统计每个范围的词频,最终可以知道中位数在哪个范围,继续等分范围...
【题目】
10G文件里存满无序的int类型整数,给你5G内存,10G文件里的无序数排序,输出到另一个10G文件里
5G内存做小根堆,每条记录是(数字,词频),小根堆按数字大小组织,每条记录需要8字节,堆可以包含5G/8B = 5 * 2^27条记录。
考虑到堆本身占用的内存,假设堆可以包含2^27条记录。
把2^32范围分成大小为2^27的小范围,小范围的个数为2^5个。
使用小根堆统计第一个小范围里数字的词频,统计完输出排序后的数到新文件。
再使用小根堆统计第二个小范围里数字的词频...