海量数据查找一个数是否存在

问题:给定一个集合,集合中包含50亿级以上的整数(无序,不重复),给定一个算法,查找该集合中是否存在某个数(内存限制1G)
Answer:
(1)40亿数据全部放入内存中,所需要的内存数:

40*10^8*4B=16G

这个明显无法一次性装入内存中。但是,如果我们用计算机中的一位来表示某个数出现与否,出现为1,不出现为0, 就可以减少内存使用量。比如在一块连续的内存区域,15出现,则将第15位置1。 这个就是Bit Map算法,此时所需要的内存:

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

符合要求,我们遍历一遍文件,将出现的数对应的那一位置1,然后遍历这些位, 找到第一个有0的位即可,这一位对应的数没有出现。放置完毕后,查看查找数位的数字为0,则返回false,为1,则返回true。

(2)我们可以将这么多的数据分成许多块, 比如每一个块的大小是1000,那么第一块保存的就是0到999的数,第2块保存的就是1000 到1999的数……实际上我们并不保存这些数,而是给每一个块设置一个计数器。 这样每读入一个数,我们就在它所在的块对应的计数器加1。处理结束之后, 我们找到一个块,它的计数器值小于块大小(1000), 说明了这一段里面一定有数字是文件中所不包含的。然后我们单独处理这个块即可。

参考文章:http://www.cricode.com/733.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值