bitmap處理海量資料

2021-06-17 20:26:32 字數 3206 閱讀 1497

【什麼是bit-map】

所謂的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(如下圖:) 

然後遍歷這5個元素,首先第乙個元素是4,那麼就把4對應的位置為1(可以這樣操作 p+(i/8)|(0x01<

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

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

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

#include <memory.h>

#define bytesize 8

void setbit(char *p, int posi)   

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

return;   

}   

void bitmapsortdemo()   

;   

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

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

//就可以了。

const

int bufferlen = 2;   

char *pbuffer = new

char[bufferlen];   

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

memset(pbuffer,0,bufferlen);   

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

//輸出排序結果

for(int i=0;i<bufferlen;i++)//每次處理乙個位元組(byte)

}   

pbuffer++;   

}   

}   

int _tmain(int argc, _tchar* argv)     

【適用範圍】

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

【基本原理及要點】

使用bit陣列來表示某些元素是否存在,比如8位**號碼

【擴充套件】

bloom filter可以看做是對bit-map的擴充套件

【問題例項】

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的c語言實現

bitmap.h   /*

*bitmap的c語言實現

*/#ifndef _bitmap_h_

#define _bitmap_h_

/**功能:初始化bitmap

*引數:

*size:bitmap的大小,即bit位的個數

*start:起始值

*返回值:0表示失敗,1表示成功

*/int

bitmap_init(

intsize, 

intstart);  

/**功能:將值index的對應位設為1

*index:要設的值

*返回值:0表示失敗,1表示成功

*/int

bitmap_set(

intindex);  

/**功能:取bitmap第i位的值

*i:待取位

*返回值:-1表示失敗,否則返回對應位的值

*/int

bitmap_get(

inti);  

/**功能:返回index位對應的值

*/int

bitmap_data(

intindex);  

/*釋放記憶體*/

intbitmap_free();  

#endif

bitmap.c  

#include 

#include 

#include 

#include "bitmap.h"

unsigned char

*g_bitmap = null;  

intg_size = 0;  

intg_base = 0;  

intbitmap_init(

intsize, 

intstart)  

intbitmap_set(

intindex)  

intbitmap_get(

inti)  

intbitmap_data(

intindex)  

intbitmap_free()  

測試程式bitmap_test.c:  

#include 

#include "bitmap.h"

intmain()  

;  int

i;  

bitmap_init(100, 0);  

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

bitmap_set(a[i]);  

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

printf("/n"

);  

bitmap_free();  

return

0;  

}  

bit map海量資料處理

海量資料排序問題 檔案包含1千萬條 號碼記錄 10 7次方 每條記錄都是7位整數,沒有重複的整數。要求對檔案進行排序,注意大約只有1mb的記憶體空間可用,有充足的磁碟儲存空間可用。請設計乙個高效的演算法。1 運用多趟演算法 如果每個號碼都使用32位整數來表示,則在1mb儲存空間裡大約可以存25000...

海量資料處理之Bitmap

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

Bitmap和2 Bitmap海量資料處理問題

內容會持續更新,有錯誤的地方歡迎指正,謝謝 要解決上面的問題,都需可以用bitmap或2 bitmap。bitmap也就是位圖 引出bitmap 舉乙個小例子,有乙個無序整形陣列,也就占用記憶體3 4 12位元組,這很正常,但如果有1億個這樣的數呢?1億 4 1024 1024 1024 0.372...