位圖索引的一個應用實例

bitmap 是索引最長常見的一種實現方式。就是bit位的每一位,來作爲表示要索引的對象。通常位圖索引通常表達取值維度取值較少的數據.,最好是布爾值 比如

        

1

       婚否

0

       是否有房

0

       是否有車

0


比如上表中,對一個人描述,就可以用1000  表示
在取值較多(高基數)情況,也可以應用位圖,一是方便查詢,便於應用 OR AND 等操作,而是可以將bit位編成整數,這樣大大減少了存貯和傳輸的空間。
      比如這樣講吧,對於一個廣告位來講吧,可以對應很多個廣告合同。如果後端有個rpc服務,可以爲廣告位選擇最合適的合同。如果廣告位和廣告合同都很多,那麼這個數據傳輸量是很大的。爲了解決這個問題就是可以將廣告的合同編號,通過位圖索引來壓縮傳輸數據。
        對於一個廣告位而言。可以我講他對應所有的廣告位放入一個list中。通過遍歷list中的每一位,來構建該廣告位,對應投放合同的位圖索引(bitmap),下面的算法就是如何來夠構建這個位圖索引

bitmap 是可以想象爲一串大二級制。從低位到高位的每一個位置表示是表示從1到n的連續十進制數。如果list中最大數爲max。那麼我們可以用max位的二進制串表示list中所有數。
 java中32 (2的5次方)位表示一個整型。我們可以將這個大二進制串拆散,用多個整型表示。如果list中最大數爲max,那麼需要整型的數目,就可以用
     int size =  (max >> 5)+1 ;  
這個公式很好理解,左移5位,是除以2的5次方(32)。
通過size我們就能確定位圖的大小,   同理對list 中的一個數我們也可以通過這種方式找到它編碼後所在的整型(編碼後整型數字都是,按從低位到高排列)
int buket = bitIndexList.get(i) >>5;
不難想出 這個數字在整型中的位置,就是對32求餘,
       int index =  bitIndexList.get(i) & 0x1F;       
    對32求餘,可以用公式 n & (32-1)   表達  ,其實就是對低於32位數,其實低五位中1 保留,高於5位置全部設置爲0。另外一個方法是 2 n - (n>>5)<<5,這裏就不做詳細解釋了
    最後將這個廣告位設置爲1 就可以 int intBitSet = bitList.get(buket) | 1 << index;
 遍歷list 中所有值,就構建出廣告位對應的bitmap,這個方法應用很廣, 可以用它替代hashmap , 如果數據太大,hashmap 因爲頻繁衝突,就會向鏈表退化。使用位圖,就不存在,最好最壞的情況。當然你也可以使用布隆過濾器,但是要付出精確率的代價。這個方法也可以用在排序中,也就是《編程珠璣》中前言的內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章