BitMap算法学习
BitMap原理
BitMap是指用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。
例如存储一个Integer类型数字32位,用1个bit位就可以表示,大大节省了内存空间,因为bit位只能用0或者1,所以1表示存在,0表示不存在,其中数组下标的key值则代表该元素。如用bit数组表示(2,4,7),从0开始,下标为2,4和7的地方,对应的bit值为1。
0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
---|
2 4 7
Java代码实现原理
因为Java中没有bit数据类型,我们以字节Byte类型代替,一个字节有8个bit,所以我们在用Byte数组来将目标值转换为bit。比如说21在字节数组中为下图:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Byte[0]
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
Byte[1]
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|
23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
Byte[2]
上图可以看到Byte[2]中的第6位(下标从0开始则是5)值表示为1。
因此数num,其在
Byte数组的下标为 m = num/8 = n>>3
在bit上的位数下标为 n = num%8
利用bitmap中添加一个数则算法为
Byte[m] |= 1<<n
即先将1向左移动n个位置,代表此位置值为1,其余为0,然后与Byte[m]进行或运算,即将该值添加进BitMap中,同理也可以用于删除查找等等。