位图算法,内存中连续的二进制位bit,用于对大量整型数据作去重和查询。java
举个例子,给定一块长度是10bit的内存空间,依次插入4,3,2,1,怎么存储?程序员
1. 给定长度是10的bitmap,每个bit位分别对应着从0到9的10个整型数。此时bitmap的全部位都是0。算法
2. 把整型数4存入bitmap,对应存储的位置就是下标为4的位置,将此bit置为1。性能
3. 把整型数2存入bitmap,对应存储的位置就是下标为2的位置,将此bit置为1。优化
4. 把整型数1存入bitmap,对应存储的位置就是下标为1的位置,将此bit置为1。google
5. 把整型数3存入bitmap,对应存储的位置就是下标为3的位置,将此bit置为1。spa
Bitmap不只方便查询,还能够去除掉重复的整型数。code
使用场景:blog
开发一个用户画像系统,实现用户信息的标签化。用户标签包含用户的社会属性,生活习惯,消费行为。内存
经过用户标签,实现多样的用户群体统计,统计用户的男女比例,统计喜欢旅游的用户数量等。
1. 创建用户名和用户ID的映射: 1->me 2->you 3->he
2.让每个标签存储包含此标签的全部用户ID,每个标签都是一个独立的Bitmap。
男[1,2] 女[3] 爱旅游[2] 程序员[1,2]
3. 这样,实现用户的去重和查询统计,就变得一目了然:
Bitmap在作交集和并集运算的时候也有极大的便利。位运算的高性能。
男性的程序员 110&110=110
不能作非运算,并非除了1,2的其余都是女性,其实只有3是女性。除非提供一个全量的Bitmap,作异或便可。
一个很长的Bitmap里使用率低的话很浪费空间。
谷歌所实现的EWAHCompressedBitmap中,对存储空间作了优化:
<dependency> <groupId>com.googlecode.javaewah</groupId> <artifactId>JavaEWAH</artifactId> <version>1.1.0</version> </dependency>