在20亿个随机整数中找出某个数m是否存在其中。
基于这个问题,我们可以使用位图来解答。
大致思路是将20亿个无序数映射到二进制数组(位图)中去,再去查看数组中是否存在m数,即某位是否为1。
- 所以最重要的是如何映射?
实现
在Java中,int占4字节,1字节 = 8位(1 byte = 8 bit)
如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/1024/1024)≈7.45G
如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为 (2000000000/8/1024/1024/1024)≈0.233G
可以看出使用二进制数组十分节约空间,提高性能。
一个int在32位,那么 int[0] 可以表示 0-31 ,int[1] 可以表示32-63…int temp[1+ N/32] ,其中N 表示要存储数的最大值,如下图所示。
所以想要表示一个数 M ,就将 int[M/32] 中的第 M%32 位置置为 1 ,具体可以使用异或运算。
如果想将数字 5 放入上面图片表示的数组中去,将1左移 5 位,与原数做异或运算。