BitMap演算法原理及實現實現

2021-08-07 18:02:23 字數 3363 閱讀 8189

1. bitmap是什麼

bitmap是乙個十分有用的結構。所謂的bit-map就是用乙個bit位來標記某個元素對應的value, 而key即是該元素。由於採用了bit為單位來儲存資料,因此可以大大節省儲存空間。

2. bitmap優勢

舉個例子,有乙個無序有界int陣列,初步估計占用記憶體44=16位元組,這倒是沒什麼奇怪的;但是假如有10億個這樣的數呢,10億4/(102410241024)=3.72g左右。如果這樣的乙個大的資料做查詢和排序,那估計記憶體也崩潰了,有人說,這些資料可以不用一次性載入,那就是要存檔了,存檔必然消耗io。

如果用bitmap思想來解決的話,就好很多。乙個byte是佔8個bit,如果每乙個bit的值就是有或者沒有,也就是二進位制的0或者1,如果用bit的位置代表陣列值有還是沒有,那麼0代表該數值沒有出現過,1代表該陣列值出現過。也可以描述資料。具體如下圖:

現在假如10億的資料所需的空間就是3.72g/32,乙個占用32bit的資料現在只占用了1bit,節省了不少的空間,排序就更不用說了,一切顯得那麼順利。這樣的資料之間沒有關聯性,要是讀取的,你可以用多執行緒的方式去讀取。時間複雜度方面也是o(max/n),其中max為byte陣列的大小,n為執行緒大小。

3. bitmap演算法**實現

第一步: 構建特定長度的byte陣列(new byte[capacity / 8 + 1]),其中 capacity為整數陣列長度(如:10億個數字、40億個數字等);

byte bits = new byte[getindex(n) + 1];
第二步 : 計算數字num在byte中的位置(num/8);

/**

* num/8得到byte的index

* @param num

* @return

*/public int getindex(int num)

第三步: 計算數字num在byte[index]的位置(num%8);
/**

* num%8得到在byte[index]的位置

* @param num

* @return

*/public int getposition(int num)

第四步: 將所在的位置從0變成1.其他位置不變;

/**

* 標記指定數字(num)在bitmap中的值,標記其已經出現過

* 將1左移position後,那個位置自然就是1,然後和以前的資料做|,這樣,那個位置就替換成1了

第五步: 判斷指定數字num是否已存在;

/**

* 判斷指定數字num是否存在

* 將1左移position後,那個位置自然就是1,然後和以前的資料做&,判斷是否為0即可

第六步:重置某一數字對應在bitmap中的值;

/**

* 重置某一數字對應在bitmap中的值

* 對1進行左移,然後取反,最後與byte[index]作與操作。

測試**如下:

/**

* 建立bitmap陣列

*/public byte create(int n)

system.out.println(contains(bits, 11));

int index = 1;

for (byte bit : bits)

return bits; }

/*** 標記指定數字(num)在bitmap中的值,標記其已經出現過

* 將1左移position後,那個位置自然就是1,然後和以前的資料做|,這樣,那個位置就替換成1了

* @param bits

* @param num

*/public void add(byte bits, int num)

/*** 判斷指定數字num是否存在

* 將1左移position後,那個位置自然就是1,然後和以前的資料做&,判斷是否為0即可

* @param bits

* @param num

* @return

*/public boolean contains(byte bits, int num)

/*** num/8得到byte的index

* @param num

* @return

*/public int getindex(int num)

/*** num%8得到在byte[index]的位置

* @param num

* @return

*/public int getposition(int num)

/*** 重置某一數字對應在bitmap中的值

* 對1進行左移,然後取反,最後與byte[index]作與操作。

* @param bits

* @param num

*/public void clear(byte bits, int num)

/*** 列印byte型別的變數

* 將byte轉換為乙個長度為8的byte陣列,陣列每個值代表bit

*/public void showbyte(byte b)

for (byte b1 : array)

system.out.println(); }

@test

public void test()

bitmap原理及實現

以二進位制位來表示數字 例如 第27位為1,第28位為0。表示在map中27存在28不存在 實現 新增,即設定對應位為1 param arg return this public function set arg else return this 判斷數字是否存在 param arg return ...

bitmap原理和實現

我們知道乙個1g 1024m,1m 1024k,1k 1024byte,1byte 8bit,所以1個位元組等於8bit,也就是8個二進位制位,位圖法的概念是用乙個位 bit 來標記某個數的存放狀態,所以節省了大量的空間。以二進位制位來表示數字 例如 第27位為1,第28位為0。表示在map中27存...

BitMap的原理和實現

32位機器上,對於乙個整型數,比如int a 1,int佔4位元組,1位元組 8位 1 byte 8 bit 佔32bit位。如果每個數字用int儲存,那就是20億個int,因而占用的空間約為 2000000000 4 1024 1024 1024 7.45g 如果按位儲存就不一樣了,20億個數就是...