天天看點

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 算法

Bitmap不僅友善查詢,還可以去除掉重複的整型數。

使用場景:

開發一個使用者畫像系統,實作使用者資訊的标簽化。使用者标簽包含使用者的社會屬性,生活習慣,消費行為。

通過使用者标簽,實作多樣的使用者群體統計,統計使用者的男女比例,統計喜歡旅遊的使用者數量等。

1. 建立使用者名和使用者ID的映射:  1->me   2->you  3->he

2.讓每一個标簽存儲包含此标簽的所有使用者ID,每一個标簽都是一個獨立的Bitmap。

男[1,2]   女[3] 愛旅遊[2]  程式員[1,2]

3. 這樣,實作使用者的去重和查詢統計,就變得一目了然:

Bitmap 算法

Bitmap在做交集和并集運算的時候也有極大的便利。位運算的高性能。

男性的程式員  110&110=110

不能做非運算,并不是除了1,2的其他都是女性,其實隻有3是女性。除非提供一個全量的Bitmap,做異或即可。

Bitmap 算法

一個很長的Bitmap裡使用率低的話很浪費空間。

谷歌所實作的EWAHCompressedBitmap中,對存儲空間做了優化:

  

繼續閱讀