位图是一种特殊的数组,由01组成,通常来说每一个01序列对应一个特殊的值,从而方便数值的快速定位。
比如下面这两道题:
1.找出一个不在5TB个整数中存在的数。
一般来说我们可以用Hash来做,但是题目中强调了5TB这个数字就表示空间资源有所限定,如果依次遍历数字建立Hash表,太过于浪费。
此时可以用位图来做,5TB的数,其中必然有重复的数字,假设一共有4GB个不重复的数字,由位图的每一bit表示一个数,则需要4GB/8字节的内存空间,512M,然后我们依次遍历这个数集,将对应的位置置1,最后遍历数组,得到第一个为0的位置代表的数字即可。
2.找出1中只出现一次的数字
关键点在于只出现一次,于是我们可以用2bit去表示,00,01,10分别表示“未出现”,“出现一次“,”出现多次“。
又因为32位整数,得需要2*4GB/8=1GB,所以基本还可以存入内存,否则可以先分区。
初始化bitmap为00,然后依次遍历这5TB个数,如果是00,则置为01,如果是01,则置为10,如果是10则不变。