位圖算法,內存中連續的二進制位bit,用於對大量整型數據做去重和查詢。
舉個例子,給定一塊長度是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。
5. 把整型數3存入bitmap,對應存儲的位置就是下標為3的位置,將此bit置為1。
Bitmap不僅方便查詢,還可以去除掉重復的整型數。
使用場景:
開發一個用戶畫像系統,實現用戶信息的標簽化。用戶標簽包含用戶的社會屬性,生活習慣,消費行為。
通過用戶標簽,實現多樣的用戶群體統計,統計用戶的男女比例,統計喜歡旅游的用戶數量等。
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>