算法通关村——海量规模数据问题的处理方法

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就是出现了两次的数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值