Bit map介紹及其應用

2021-06-08 03:58:48 字數 1909 閱讀 7522

注:本文參考自  ,修正了其中的一些問題

感謝原作者

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

如果說了這麼多還沒明白什麼是bit-map,那麼我們來看乙個具體的例子,假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這裡假設這些元素沒有重複)。那麼我們就可以採用bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個bit(1bytes),首先我們開闢1byte的空間,將這些空間的所有bit位都置為0

0000

0000

然後遍歷這5個元素,首先第乙個元素是4,那麼就把4對應的位置為1(可以這樣操作 p+(i/8)|(0×01<<(i%8)) 當然了這裡的操作涉及到big-ending和little-ending的情況,這裡預設為big-ending),因為是從零開始的,所以要把第五位置為一

注:原文的1的放置順序為從左至右,本人認為不妥,正確的順序為以從右向左的順序,原因如下: 在 setbit 函式中,採用的是 0x01< 0

0010

000

然後再處理第二個元素7,將第八位置為1,,接著再處理第三個元素,一直到最後處理完所有的元素,將相應的位置為1,這時候的記憶體的bit位的狀態如下: 1

0111

100

然後我們現在遍歷一遍bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。下面的**給出了乙個bitmap的用法:排序。

#include #include #include //定義每個byte中有8個bit位

#define bytesize 8

void setbit(char *p, int pos)

*p = *p | (0x01 << (pos %bytesize));//將該bit位賦值1

return;

}void bitmap_sort_map()

; //bufferlen這個值是根據待排序的資料中最大值確定的

//待排序中的最大值是14,因此只需要2個bytes(16個bit)

//就可以了。

const int bufferlen = 2;

char *pbuffer = (char*) malloc(bufferlen * sizeof(char));

//要將所有的bit位置為0,否則結果不可預知。

memset(pbuffer, 0 , bufferlen);

int i,j;

for(i=0; i<9; i++)

int bit_value,bit_verify;

//輸出排序結果

for(i=0; i

注:原文中 在第二個for迴圈中

for(j=0; j < bytesize; j++)

} 可進行資料的快速查詢,判重,刪除,一般來說資料範圍是int的10倍以下

問題例項

1)已知某個檔案內包含一些**號碼,每個號碼為8位數字,統計不同號碼的個數。

8位最多99 999 999,大概需要99m個bit,大概10幾m位元組的記憶體即可。 (可以理解為從0-99 999 999的數字,每個數字對應乙個bit位,所以只需要99m個bit==1.2mbytes,這樣,就用了小小的1.2m左右的記憶體表示了所有的8位數的**)

2)2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。

將bit-map擴充套件一下,用2bit表示乙個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上,在遍歷這些數的時候,如果對應位置的值是0,則將其置為1;如果是1,將其置為2;如果是2,則保持不變。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map,都是一樣的道理。

Bitmap演算法應用

防火牆控制了某一目標ip的那些埠可以被使用者ip訪問,然而防火牆並沒有用一條規則直接限定某一使用者ip所能訪問的目標ip及其埠,而是在配置中設定了一組訪問控制規則,這些規則中既有允許訪問的目標ip及埠範圍,又有不允許訪問的目標ip及埠範圍。就某一目標ip而言,如何才能確定使用者ip能訪問該目標ip的...

SSE指令介紹及其C C 應用

sse是英特爾提出的即mmx之後新一代 當然是幾年前了 cpu指令集,最早應用在piii系列cpu上。現在已經得到了intel piii p4 celeon xeon amd athlon duron等系列cpu的支援。而更新的sse2指令集僅得到了p4系列cpu的支援,這也是為什麼這篇文章是講ss...

SSE指令介紹及其C C 應用

sse是英特爾提出的即mmx之後新一代 當然是幾年前了 cpu指令集,最早應用在piii系列cpu上。現在已經得到了intel piii p4 celeon xeon amd athlon duron等系列cpu的支援。而更新的sse2指令集僅得到了p4系列cpu的支援,這也是為什麼這篇文章是講ss...