算法通关村十五关——海量数据场景下的热门算法题

1.从40亿中产生一个不存在的数

1.位图存储数据

我们可以使用bit map的方式来表示数出现的情况。具体地说,是申请一个长度为4294967295的bit类型的数组bitArr(就是boolean类型),bitArr上的每个位置只可以表示0或1状态。8个bit为1B,所以长度为4294967295的bt类型的数组占用500MB空间,遍历这40亿个无符号数,遇到所有的数时,就把btAr相应位置的值设置为1。遍历完成后,再依次遍历btAr,看看哪个位置上的值没被设置为1,这个数就不在40亿个数中,遍历完bitArr之后,所有没出现的数就都找出了。

2.分块区间存储

将数据平均分为64个区间,第一次遍历,先申请长度为64的整型数组countArr[0.63],countArr[用来统计区间i上的数有多少。遍历40亿个数,根据当前数是多少来决定哪一个区间上的计数增加。例如,如果当前数是3422552090,3422552090/67108864=51,所以第51区间上的计数增加countArr[51]++。查看哪个区间的计数少于67108864,找到后对40亿个数据进行第二次遍历。假设这个区间是第37区间,此次遍历只关心第37区间上的数,如果这个数在第37区间上,就bitArr[num-67108864*37]的值设为1。遍历完40个亿数后,在bitArr_上没有被设成1的位置,也就是第i位。67108864*37+i就是没出现过的数。

2.用2GB内存在20亿个整数中找到出现次数最多的数

要求:内存限制为2GB

解决办法是把包含20亿个数的大文件用哈希函数分成16个小文件,然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样我们就得到了16个小文件中各自出现次数最多的数,还有各自的次数统计。接下来只要选出这16个小文件各自的第一名中谁出现的次数最多即可。

3.从100亿个URL中查找的问题

题目:有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL。

用哈希分流的思路来处理,将100亿字节的大文件通过哈希函数分配到100台机器上,然后每一台机器分别统计分给自己的URL中是否有重复的URL,同时哈希函数的性质决定了同一条URL不可能分给不同的机器

4.40亿个非负整数中找到出现两次的数

题目要求:32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数,可以使用最多1GB的内存,找出所有出现了两次的数。

用bit map的方式来表示数出现的情况,是申请一个长度为4294967295x2的bit类型的数组bitArr,用2个位置表示一个数出现的词频,遍历这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,发现此时bitArr[num*2+1]和bitArr[num*2]已经被设置为11,就不再做任何设置。遍历完成后,再依次遍历bitArr,如果发现bitArr[i*2+1]和bitArr[i*2]设置为10,那么就是出现了两次的数。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值