2.白银挑战——海量数据场景下的热门算法题
1 从40亿中产生一个不存在的整数
题目要求:给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务
1.1位图存储大数据的原理
位存储的核心是:我们存储的并不是这40亿个数据本身,而是其对应的位置
申请一个bit类型的数组bitArr(就是boolean类型),bitArr上的每个位置只可以表示0或1状态。遍历这40亿个无符号数,遇到所有的数时,就把bitArr响应位置的值设置为1.遍历完成后,再一次遍历bitArr,看看哪个位置上的值没被设置为1,这个数就不在40亿个数中。
1.2使用10MB来存储
如果只有10MB的内存,此时位图也不能搞定了,这里我们使用分块思想,时间换空间,通过两次遍历来搞定。
1.根据10MB的内存限制,确定统计区间的大小,就是第二次遍历时的bitArr大小。
2.利用区间计数的方式,找到那个计数不足的区间,这个区间上肯定有没出现的数
3.对这个区间上的数做bit map映射,再遍历bit map,找到一个没出现的数即可
1.3如何确定分块的区间
2.用2GB内存再20亿个整数中找到出现次数最多的数
题目要求:有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。
要求,内存限制为2GB
解决方法就是把包含20亿个数的大文件用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被散列到不同的小文件上,同时每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够优秀,然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样我们就得到了16个小文件中各自出现次数最多的数,还有各自的次数统计。接下来只要选出这16个小文件各自的第一名种谁出现的次数最多即可。
3.从100亿个URL中查找的问题
题目:有一个包含100亿个URL的大文件,假设每个URL占用64GB,请找出其中所有重复的URL。
4.40亿个非负整数中找到出现两次的数
题目要求:32位无符号整数的范围时0-4294967295,现在有40亿个无符号整数,可以使用最多1GB的内存,找出所有出现了两次的数
可以用bit map的方式来表示数出现的情况。申请一个长度为4294967295*2的bit类型的数组bitArr,用2个位置表示一个属出现的词频,占用1GB空间。遍历这40亿个无符号数,如果初次遇到Num,就把bitArr[num*2+1]和bitArr[num*2]设置为01,如果第二次遇到num,就把bitArr[num*2+1]和bitArr[num*2]设置为10,如果第三次遇到num,就把bitArr[num*2+1]和bitArr[num*2]设置为11.以后再遇到num,已经设置为11,就不再做任何设置。遍历完成后,再依次遍历bitArr,如果发现bitArr[i*2+1]和bitArr[i*2]设置为10,那么i就是出现了两次的数。