Bitmap 算法


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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM