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

来源:互联网 发布:安卓网络嗅探器怎么用 编辑:程序博客网 时间:2024/04/30 01:12

问题:给定一个集合,集合中包含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 0