位圖算法,內存中連續的二進制位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>