所謂bitmap就是用乙個bit位來標記某個元素對應的value,而key即是這個元素。由於採用bit為單位來儲存資料,因此在可以大大的節省儲存空間
32位機器上,乙個整形,比如int a;在記憶體中佔32bit,可以用對應的32個bit位來表示十進位制的0-31個數,bitmap演算法利用這種思想處理大量資料的排序與查詢
優點:缺點:
示例:申請乙個int型的記憶體空間,則有4byte,32bit。輸入 4, 2, 1, 3時:
輸入4:
輸入2:
輸入1:
輸入3:
思想比較簡單,關鍵是十進位制和二進位制bit位需要乙個map對映表,把10進製對映到bit位上
假設需要排序或者查詢的總數n=10000000,那麼我們需要申請的記憶體空間為 int a[n/32 + 1].其中a[0]在記憶體中佔32位,依此類推:
bitmap表為:
a[0] ------> 0 - 31
a[1] ------> 32 - 63
a[2] ------> 64 - 95
a[3] ------> 96 - 127
......
下面介紹用位移將十進位制數轉換為對應的bit位
(1) 求十進位制數0-n對應的在陣列a中的下標
index_loc = n / 32即可,index_loc即為n對應的陣列下標。例如n = 76, 則loc = 76 / 32 = 2,因此76在a[2]中。
(2)求十進位制數0-n對應的bit位
bit_loc = n % 32即可,例如 n = 76, bit_loc = 76 % 32 = 12
(3)利用移位0-31使得對應的32bit位為1
#include #include #define shift 51.#define mask 0x1f
/** * 設定所在的bit位為1
* * t = o(1)
* */
void set(int n, int *arr)
/** * 初始化arr[index_loc]所有bit位為0
* * t = o(1)
* */
void clr(int n, int *arr)
/** * 測試n所在的bit位是否為1
* * t = o(1)
* */
int test(int n, int *arr)
int main(void)
else
} return 0;
}
演算法 bitmap演算法
在所有具有效能優化的資料結構中,我想大家使用最多的就是hash表,是的,在具有定位查詢上具有o 1 的常量時間。但hash table需要使用巨大的記憶體空間,顯然在處理大資料時會顯得力不從心。bitmap可以有效地節省記憶體的使用,它的思想其實就是用1bit來代替乙個index 通常是乙個unsi...
bitmap演算法簡介
今天看到海量資料處理演算法 bitmap 又稱為bitset,或者bit array 有意思的演算法。c 有乙個標頭檔案是。bitmap的思想就是資料壓縮。用乙個二進位制bit 0或者1 去標記某個元素對應的value,這就是bit map啊。由於使用bit單位儲存資料,所以可大大節省記憶體空間。下...
BitMap演算法詳解
所謂的bitmap就是用乙個bit位來標記某個元素所對應的value,而key即是該元素,由於bitmap使用了bit位來儲存資料,因此可以大大節省儲存空間。基本思想 這此我用乙個簡單的例子來詳細介紹bitmap演算法的原理。假設我們要對0 7內的5個元素 4,7,2,5,3 進行排序 這裡假設元素...