bitmap演算法簡介

2021-06-29 06:06:07 字數 2842 閱讀 7342

今天看到海量資料處理演算法————bitmap(又稱為bitset, 或者bit array), 有意思的演算法。

c++ 有乙個標頭檔案是。 

bitmap的思想就是資料壓縮。 用乙個二進位制bit(0或者1)去標記某個元素對應的value, 這就是bit + map啊。

由於使用bit單位儲存資料, 所以可大大節省記憶體空間。下面舉乙個使用bitmap 的例子。

我們要對0-7內的五個元素進行排序, 假設這5個元素為(4, 7, 2, 5, 3)。 假設元素沒有重複的。 要表示8個數, 我們需要8個bit。也就是1byte.

下面我們只需要開闢1byte的空間, 對這個1byte的所有的bit都初始化為0。

如下: 0000 0000

我們可以規定, 有如下的map。 

0000 0000 ---> 0

0000 0010 ---> 1

0000 0100 ---> 2

0000 1000 ---> 3

0001 0000 ---> 4

0010 0000 ---> 5

0100 0000 ---> 6

1000 0000 ---> 7

以上的map是我們預設的, 不需要去另外開闢空間存這個對映**(不過我們也可以吧index設為從1開始, 就有如下對映:

0000 0001 ----> 1

0000 0010 ----> 2

.............................

1000 0000 -------> 8 )

試著想想, 如果我們直接存放, 需要 8 x sizeof(int) = 32byte。

但是由於我們使用了bitmap, 我們只需要8 x 1 bit = 1byte既可以。 好節省空間啊。 節省32倍。 太牛了。

下面我們就應用這乙個byte儲存著5個元素, 得到的儲存資訊如下:

首先, 輸入第乙個元素4, 對應如下:

0001 000.

第二個元素輸入是7, 所以將第8位設定為1, 變成如下:

1001 0000

最終, 如下:

1011 1100代表著所有的元素4, 7, 2, 5, 3。

然後我們遍歷一遍bit區域, 將改為編號是1的編號(索引)輸出, 就是(2, 3, 4, 5, 7)。

#include #include using namespace std;

int main() ;

bitset<8> mybit; // default constructor all to 0

for(int i = 0; i < 5; ++i)

cout << mybit << endl;

cout << "sorting using bitmap: ";

for(int i = 0; i < 8; ++i) }}

執行結果如下:

這樣, 我們就在o(n)的線性時間內完成了排序操作。 太好了, 就想counting sort的效能。 

注意, 使用bitmap 的前提是出現的元素不重複的, 這是這個演算法的缺點。

現在在舉乙個bitmap演算法例子。

使用bitmap 實現8位(表示10進製位)**號碼的儲存, 插入, 查詢, 刪除等操作。

分析:    首先, 我們知道, 8位**號碼總共有0----999999999個號碼。 我們使用bitmap的辦法, 每乙個bit(二進位制位)代表乙個8個數字的**號碼。

需要 100000000bit = 100000000/8 = 12500000bytes的記憶體進行儲存, 也就是12.5m的記憶體空間進行儲存。

關鍵是map的對映表, 如下:

我們需要申請的記憶體大小為 :

int arr[1 + n / 32], 我們當然可以使用下面的bitset class了,但是這裡重新造輪子, 只是為了說明原理。

arr[0]在記憶體中占用32bit, 可以對應0 - 31, 依次類推, bitmap 表如下:

arr[0] ------> 0 --- 31

arr[1] -------> 32 -- 63

arr[2] --------> 64 -- 95

arr[3] ---------> 96 --- 127

...........................

就這樣, 完成了對映。 

bitmap的應用如下:

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

(2)去重資料而達到壓縮資料

int型變數a的第k位清0,即a=a&~(1<

將int型變數a的第k位置1

, 即a=a|(1<

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

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

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

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

演算法 bitmap演算法

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

演算法 bitmap演算法

在所有具有效能優化的資料結構中,我想大家使用最多的就是hash表,是的,在具有定位查詢上具有o 1 的常量時間。但hash table需要使用巨大的記憶體空間,顯然在處理大資料時會顯得力不從心。bitmap可以有效地節省記憶體的使用,它的思想其實就是用1bit來代替乙個index 通常是乙個unsi...

Bitmap處理 之一 簡介

眾所周知 android 記憶體分配比較蛋疼,過多的載入bitmap,如果不處理好會造成很頭疼的問題 outofmemoryerror.造成這個問題的大致就那麼幾個原因 第一 移動裝置的資源是有限的,對於單個應用程式,系統虛擬機器通常會分配16m,當然現在基本都是32m,甚至有64m的。但是資源還是...