演算法 bitmap演算法

2022-04-13 14:51:44 字數 1268 閱讀 5751

所謂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 5

#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;

}

1. 

演算法 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 進行排序 這裡假設元素...