BAT面试题:解决有40亿数据,新增加数据是否重复问题

今天偶然看到一篇文章,说的是BAT的面试题,面试官问有40亿数据在文件中,当在进来一个数据的时候,这个数据是否在40亿数据里存在,本人本着,好奇的心去看了一下。当然没有看他所给的答案,自己解答了一下,下面请看思路:

首先很多人能够想到的是,40亿数据需要多大的内存,

40 * 10^8 * 4B = 16GB (大约值,因为不是按照2的幂来做单位换算)咱们来做一下计算

假设用 2 GB的内存去运行,肯定内存是不够的,如果面试官可以让用多台电脑的话,那么问题就很简单了,使用分布式,每台电脑上打上2GB大小的数据,之后去查找,有没有,这样差不多是秒级的,如果不让用呢?

那么咱们可以想到,int 类型 是32位的 那么2的32次方为多少呢?42亿多,这样是不是会想到位操作,那么来计算一下使用位操作会占多大的内存

40 * 10^8 b = 5 * 10^8 B = 0.5GB

0.5GB足够了 省下了电脑的钱,每一个数代表一个位,假如 40亿数字中 有 4 那么 位数的第4位为1,以此类推,40亿数字中有什么那么,他多代表的位就为1,没有的为0,这样,当有一个数进来的时候只需要检验一下这个数代表的位置为1还是0就可以了,这样差不多是毫秒级的

那么 如果 所给内存更小呢,假如100M,10M,等呢?

是不是就需要分块进行了呢,我们可以将这么多的数据分成许多块, 比如每一个块的大小是1000,那么第一块保存的就是0到999的数,第2块保存的就是1000 到1999的数……实际上我们并不保存这些数,而是给每一个块设置一个计数器。 这样每读入一个数,我们就在它所在的块对应的计数器加1。处理结束之后, 我们找到一个块,它的计数器值小于块大小(1000), 说明了这一段里面一定有数字是文件中所不包含的。然后我们单独处理这个块即可。接下来我们就可以用上边的位操作算法了。我们再遍历一遍数据, 把落在这个块的数对应的位置1。 最后我们找到这个块中第一个为0的位,其对应的数就是一个没有出现在该文件中的数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值