今天看到海量資料處理演算法————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的。但是資源還是...