BitMap演算法詳解

2021-09-12 15:05:48 字數 2500 閱讀 4515

**:

所謂的bitmap就是用乙個bit位來標記某個元素所對應的value,而key即是該元素,由於bitmap使用了bit位來儲存資料,因此可以大大節省儲存空間。

基本思想:

這此我用乙個簡單的例子來詳細介紹bitmap演算法的原理。假設我們要對0-7內的5個元素(4,7,2,5,3)進行排序(這裡假設元素沒有重複)。我們可以使用bitmap演算法達到排序目的。要表示8個數,我們需要8個byte。

1.首先我們開闢乙個位元組(8byte)的空間,將這些空間的所有的byte位都設定為0

2.然後便利這5個元素,第乙個元素是4,因為下邊從0開始,因此我們把第五個位元組的值設定為1

3.然後再處理剩下的四個元素,最終8個位元組的狀態如下圖

4.現在我們遍歷一次bytes區域,把值為1的byte的位置輸出(2,3,4,5,7),這樣便達到了排序的目的

從上面的例子我們可以看出,bitmap演算法的思想還是比較簡單的,關鍵的問題是如何確定10進製的數到2進製的對映圖

map對映:

假設需要排序或則查詢的數的總數n=100000000,bitmap中1bit代表乙個數字,1個int = 4bytes = 4*8bit = 32 bit,那麼n個數需要n/32 int空間。所以我們需要申請記憶體空間的大小為int a[1 + n/32],其中:a[0]在記憶體中佔32為可以對應十進位制數0-31,依次類推:

a[0]-----------------------------> 0-31

a[1]------------------------------> 32-63

a[2]-------------------------------> 64-95

a[3]--------------------------------> 96-127

那麼十進位制數如何轉換為對應的bit位,下面介紹用位移將十進位制數轉換為對應的bit位:

1.求十進位制數在對應陣列a中的下標

十進位制數0-31,對應在陣列a[0]中,32-63對應在陣列a[1]中,64-95對應在陣列a[2]中………,使用數學歸納分析得出結論:對於乙個十進位制數n,其在陣列a中的下標為:a[n/32]

2.求出十進位制數在對應數a[i]中的下標

例如十進位制數1在a[0]的下標為1,十進位制數31在a[0]中下標為31,十進位制數32在a[1]中下標為0。 在十進位制0-31就對應0-31,而32-63則對應也是0-31,即給定乙個數n可以通過模32求得在對應陣列a[i]中的下標。

3.位移

對於乙個十進位制數n,對應在陣列a[n/32][n%32]中,但陣列a畢竟不是乙個二維陣列,我們通過移位操作實現置1

a[n/32] |= 1 << n % 32 

移位操作: 

a[n>>5] |= 1 << (n & 0x1f)

n & 0x1f 保留n的後五位 相當於 n % 32 求十進位制數在陣列a[i]中的下標

**實現:

public class bitmap 

// 判斷所在的bit為是否為1

public boolean exits(int n)

public void display(int row)

system.out.println("a["+i+"]" + list);}}

public static void main(string args);

bitmap map = new bitmap();

for(int i=0;i

執行結果如下:

temp:120has already exists

bitmap點陣圖展示

a[0][0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

a[1][1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

a[2][1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

a[3][0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

a[4][0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

應用範圍:可以運用在快速查詢、去重、排序、壓縮資料等。

詳解BitMap演算法

所謂的bitmap就是用乙個bit位來標記某個元素所對應的value,而key即是該元素,由於bitmap使用了bit位來儲存資料,因此可以大大節省儲存空間。首先用乙個簡單的例子來詳細介紹bitmap演算法的原理。假設我們要對0 7內的5個元素 4,7,2,5,3 進行排序 這裡假設元素沒有重複 我...

演算法系列 bitmap演算法詳解和實現

我們可以將bitmap看成是一種資料結構,所謂的bit map就是用乙個 或幾個 bit位來標記某個元素對應的state value 最基本的情況,使用1bit標示乙個關鍵字的狀態 可標示兩種狀態 但根據需要也可以使用2bit 標示4種狀態 3bit 標示8種狀態 當乙個狀態標示需要的位數達到32b...

演算法 bitmap演算法

所謂bitmap就是用乙個bit位來標記某個元素對應的value,而key即是這個元素。由於採用bit為單位來儲存資料,因此在可以大大的節省儲存空間 32位機器上,乙個整形,比如int a 在記憶體中佔32bit,可以用對應的32個bit位來表示十進位制的0 31個數,bitmap演算法利用這種思想...