问题
给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数?
算法
可以使用位图法,位图法的主要思想是:一个int类型占4个字节,一个字节8个bit,那么如果用每一个bit代表一个数是否存在的话,那么可以代表4*8=32bit。可以表示0-31范围的数字。bit[32]的空间比int[32]要小的多。
另外一种用法是结合hash函数,这样0-31就不止32个数了。
例如:5,12,26这三个数字,将它用位图法表示的话,那么就是
bit[5]=1;bit[12]=1;bit[26]=1;其他为0;
判断a是否存在,可以看bit[a]是否为1。为1则表示存在。
Java实现
import java.util.BitSet;
public class SomeTest {
public static void main(String[] args) {
BitSet bitSet = new BitSet();
int[] num = new int[] { 5, 12, 26 };
for (int i = 0; i < num.length; i++) {
bitSet.set(num[i]);
}
int a = 15;
if (bitSet.get(a)) {
System.out.println(a + ",重复");
} else {
System.out.println(a + ",不重复");
}
a = 26;
if (bitSet.get(a)) {
System.out.println(a + ",重复");
} else {
System.out.println(a + ",不重复");
}
}
}
输出
15,不重复
26,重复