Bit Map實現海量資料對映的簡單演算法

2021-06-18 14:46:41 字數 1886 閱讀 7012

bit-map實現海量資料對映的簡單演算法

最近一直在搞搜尋引擎,準確的說是丟了乙個月又開始鼓搗搜尋引擎,在做避免網頁重複搜尋時遇到了困難;打算用hash來對映url字串從而避免重複搜尋(神馬是hash我就不重複了,自己補資料結構去),但是考慮到網頁url的海量性,做乙個demo的搜尋引擎出來也不要太寒酸,所以設計的網頁索引量預計在數千萬到數億左右,如果用樸素的hash的話,6g的記憶體(本機上跑)的話,全部用上對映128位hash只可以做到對映46875000個數(雖然128位理論上能表示3.4028236692094*10的38次方),32位hash則為187500000個數(因為原則上32位hash可以表示4294967296個數,但由於記憶體限制).可以看出,hash對映資料的瓶頸主要是實際的硬體記憶體限制(理論上的防碰撞下次再講).

在網上鼓搗了一遍以及在各種參考資料參考書裡面鼓搗了下之後找到了乙個名為bit-map的演算法,注意,這可不是點陣圖的那個bitmap.它的思想是用乙個位表示乙個數,而非用8位,16位,32位或者64位甚至128位來表示乙個數,把記憶體在位級別上去當成線性表使用,更準確地說,把記憶體當做乙個連續的巨大的對映表,想像一下,這樣的話,乙個1gbyte的記憶體空間可以儲存對映80億左右的整數範圍.

話句話說,用128位整數儲存8位**號碼需要800mbytes+的空間,如果換做用bit-map方法來實現的話,這個空間消耗會一下子驟降到12mbytes左右,雖然只是線性級別的降低,但是結果依然令人驚喜.

然後呢?我們該如何實現呢?

假設我們申請了一段連續的int型別的記憶體空間intmap[max_len+1],然後把它的位表示畫出來:

然後,我們思考一下,我們能否用位運算完全代替這個演算法裡的所有算術運算(這是以前做競賽的後遺症,一看到32,64,128就往位運算處想).其實除2的冪和對2的冪取模是可以用位實現的.

對於除法,我們用》運算子實現,對於數n,n>>m的結果就是n/(2^m).

對於取模,我們用n=n&((1現在可以來看乙個例子了,就拿剛才那個對映8位**號碼的例子,例子的目的是將各個**號碼對映進map,從而使能夠查詢到某乙個號碼是否已經存在.

**如下:

#include#includeusingnamespace std;

//100000000/8=12500000

unsignedint map[3125001] ;

unsignedlong long int code ;

void init()

return;

}int findkey(unsigned long long int code)

int findbit(unsigned long long int code)

void setinmap(unsigned long long int code)

int search(unsigned long long int code)

int main(){

init();

cout

if(c=='i'){

cout<

cin>>code;

if(search(code)==0){

setinmap(code);

coutif(search(code)==0){

cout<

結果如下:

實現出來無壓力,可以看到只開了3125001的陣列,算一下只有十幾兆而已,下次來分享乙個更高階的用來判斷對映是否重複的演算法bloomfilter.

bitmap處理海量資料

什麼是bit map 所謂的bit map就是用乙個bit位來標記某個元素對應的value,而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。如果說了這麼多還沒明白什麼是bit map,那麼我們來看乙個具體的例子,假設我們要對0 7內的5個元素 4,7,2,5,...

bitmap 位儲存實現海量資料的標記

針對海量的資料,一般的記憶體無法儲存,提供一種位儲存的標記方法?如給定10億個數字,詢問其中任意乙個數字是否出現,採取傳統的儲存方式,以32位機器為例 乙個int占用32位,也就是4位元組 而bitmap的思想是,無符號int型別的範圍是確定的 即0 2的32次方 1 那麼將乙個int拆分開來看,其...

海量資料儲存 bit map思想

什麼是bit map 所謂的bit map就是用乙個bit位來標記某個元素對應的value,而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。如果說了這麼多還沒明白什麼是bit map,那麼我們來看乙個具體的例子,假設我們要對0 7內的5個元素 4,7,2,5,...