bitMap算法是一个bit位来标记某一个元素对应的value值,key是对应的元素,由于BitMap使用bit位来存储数据,大大节省存储空间。
给定一个10位的bitMap,里面的数字代表下标序号:
{4,5,6,,7}可以直观的看到
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
实际应用实例
id | sex | class | age |
10001 | male | one | 19 |
10002 | female | one | 19 |
10003 | female | second | 20 |
让每一个维度属性生成一个BitMap
sex | bitMap(id) |
male | 10001 |
female | 10002,10003 |
class | bitMap(id) |
second | 10003 |
one | 10001,10002 |
age | bitMap(id) |
19 | 10001,10002 |
20 | 10003 |
可以从这三个对应的bitMap直观的看出对应的分布情况,实现用户的统计和查询就变得很简单了,性能也是比较高的。
与java中的hashset和hashtable也可实现这个效果,那么为什么就选择bitMap去实现那
Hashset和hashtable对应的用户的id存储的是int类型占4个字节【1个字节8个bit】
相当于占32bit,是bitmap的32倍,另外在处理交集和并集的时候有很大的便利。
另外有时候我们只需要求其中的一个属性的值:
例如求年龄是19岁的学生,两种方式一种是直接过滤出来一种如上面所生成的bitMap组合
第二种是进行非的处理,求非20岁的学生.
不能直接使用上面的结果去计算非20岁的学生个:
19岁的是两个
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
非19岁
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
按照这个计算此时的非20岁变成了8个,其实只有1个。不能直接进行非的运算
此时我们可以使用一个全量的和一个只有19岁的bitMap,我们可以通过全量的非去求非20岁的度量,使用异或的操作进行处理,及同位是0异位是1.
全量的:0000001110
19岁的:0000000110
非19的:0000001000
以上是bitMap的简单介绍和整理