资源限制技巧
1)布隆过滤器用于集合的建立与查询,并可以节省大量空间
2)一致性哈希解决数据服务器的负载管理问题
3)利用并查集结构做岛问题的并行计算
4)哈希函数可以把数据按照种类均匀分流
5)位图解决某一范围上数字的出现情况,并可以节省大量空间
6)利用分段统计思想、并进一步节省大量空间
7)利用堆、外排序来做多个处理单元的结果合并
题目一
32位无符号整数的范围是0~4,294,967,295,
现在有一个正好包含40亿个无符号整数的文件,
可以使用最多1GB的内存,怎么找到出现次数最多的数?
使用第四种方法:哈希函数将数据按种类进行分流,将其按种类分配进不同的小文件中,每条记录的key为整数,value为出现的次数
题目二
32位无符号整数的范围是0~4,294,967,295,
现在有一个正好包含40亿个无符号整数的文件,
所以在整个范围中必然存在没出现过的数。
可以使用最多1GB的内存,怎么找到所有未出现过的数?
使用方法五:位图解决某一范围上数字的出现情况,并可以节省大量空间
【进阶】
内存限制为 3KB,但是只用找到一个没出现过的数即可
利用分段统计思想、并进一步节省大量空间
统计词频,最极端的例子:如果给的内存只够存入两条记录,就将数分成两部分,前面2^32一条记录(统计数据在这个范围的个数),这样来判断不存在的数是不是在这个范围内
题目三
有一个包含100亿个URL的大文件,假设每个URL占用64B,
请找出其中所有重复的URL
哈希函数可以把数据按照种类均匀分流,将数据按种类分配进不同的小文件中,然后统计小文件中重复的url,最后汇总
【补充】
某搜索公司一天的用户搜索词汇是海量的(百亿数据量),
请设计一种求出每天热门Top100词汇的可行办法
哈希函数可以把数据按照种类均匀分流,将所有词汇按种类分配进入不同的小文件中,然后求出每一个文件中的前100,最后汇总求出总体的前100
题目四
32位无符号整数的范围是0~4294967295,
现在有40亿个无符号整数,
可以使用最多1GB的内存,
找出所有出现了两次的数。
位图解决某一范围上数字的出现情况,并可以节省大量空间,使用两位统计一个数,00代表出现0次,01代表出现一次,10代表出现2次,11代表出现2次以上
题目五
32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数
可以使用最多3K的内存,怎么找到这40亿个整数的中位数?
分段统计思想,将数分为各个区间,然后区间内统计词频,可以知道中位数在哪个区间中,然后再将该区间在分段求解。
题目六
32位无符号整数的范围是0~4294967295,
有一个10G大小的文件,每一行都装着这种类型的数字,
整个文件是无序的,给你5G的内存空间,
请你输出一个10G大小的文件,就是原文件所有数字排序的结果
利用堆、外排序:维护一个给定内存可以存下的小根堆,小根堆中按整数大小维护,同事纪律该数出现的频次。一轮过后堆内剩下的数都是最小的记录,然后重堆顶弹出按频次写入文件中,这样就排好序了
题目七
求一个大文件中出现次数最多的前100名
堆上堆的方式: 将大文件哈希成多个小文件,每个小文件按出现的频次建立大根堆。每个小文件弹出堆顶的数据再建立大根堆。在这个堆上堆中的数被选中后,其对应的小文件再弹出下一个数据到这个堆上堆结构中,如此就选出了次数最多的前100名