分治,分布式。bitmap(位圖)及其公升級版bloom filter是處理海量資料常用的方法,這裡先介紹bitmap概念及其c++實現。
一 bitmap點陣圖
該資料結構描述了乙個有限定義域內的稠密集合,其中的每乙個元素最多出現一次並且沒有其他任何資料與該元素相關聯。即使這些條件沒有完全滿足(例如,存在重複元素或額外的資料),也可以用有限定義域內的鍵作為乙個表項更複雜的**索引。
所謂的bit-map就是用乙個bit位來標記某個元素對應的value, 而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。例如假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這裡假設這些元素沒有重複)。那麼我們就可以採用bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個bit(1bytes),首先我們開闢1byte的空間,將這些空間的所有bit位都置為0,如下圖:
遍歷第乙個元素4,則在第4為標1:
以此來推,遍歷完所有後結構:
我們現在遍歷一遍bit區域,將該位是bit 1的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。
二 c++實現
我們可以用乙個unsigned int型別的陣列或者向量來表示位圖,假設我們定義vectora,則 第i位可表示為a[i/32]的i%32位(其中,32*n+r = i,r為i%32,也就是i/32的餘數)。 由於計算機對位的操作比乘除法更有效率,這裡計算i/32可以用位移操作:i>>5;計算i%32可以用1&31。
若是乙個char陣列str,則str的第i位為i/8(i>>3)位址塊的第i%8(i&7)位.下面以char為例說明,int模擬可知。
#include#include#includeusing namespace std;
class bitmap
bitmap(int n)
~bitmap()
int get(int x)
bool set(int x)
};
資料結構 BitMap
問題 已知有n個整數,這些整數的範圍是 0,100 請你設計一種資料結構,使用陣列儲存這些資料,並提供兩種方法,分別是addmember和i ist.下面是這種資料結構的類的定義。思路1 用陣列儲存,查詢是否存在需要for迴圈n,有n個數那麼複雜度為o n 思路2 用陣列儲存,新增資料則arr in...
資料結構之BITMAP
給40億個不重複的無符號整數,沒排過序。給乙個無符號整數,如何快速判斷乙個數是否在這40億個數中。這個問題怎麼解決呢?1 將40億資料儲存起來 儲存在陣列 鍊錶 樹中 再和該數判斷是否相等。那我們思考一下需要多少記憶體 2 借助點陣圖bitmap解決。位圖 bitmap 是用乙個陣列中的每個資料的每...
資料結構 bitmap剖析
最近在看 程式設計珠璣 這本書。第1章中引入了bitmap 位圖 的資料結構。以前沒有接觸過,抽空研究了一下,記錄下來。書中描述的情景 1.最多1000萬個7位數 號碼 號碼不重複,實際大概800萬個 儲存在文字中 2.每隔一段時間要對號碼進行排序 3.程式模組最多可用1m bytes的記憶體,磁碟...