海量資料處理之Bitmap

2021-06-08 14:08:27 字數 2177 閱讀 9091

什麼是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(

位圖排序是一種效率極高(複雜度可達o(n))並且很節省空間的一種排序方法,但是這種排序方法對輸入的資料是有比較嚴格的要求(資料不能重複,大致知道資料的範圍)。位圖排序即利用位圖或者位向量來表示集合。舉個例子,假如有乙個集合,我們可以用乙個8位的二進位制向量set[1-8]來表示該集合,如果資料存在,則將set相對應的二進位制位置1,否則置0.根據給出的集合得到的set為,然後再根據set集合的值輸出對應的下標即可得到集合的排序結果。這個就是位圖排序的原理。

一.點陣圖排序的應用:

1.給40億個不重複的unsigned int的整數,沒有排過序,然後再給乙個數,如果快速判斷這個數是否在那40億個數當中。

因為unsigned int資料的最大範圍在在40億左右,40*10^8/1024*1024*8=476,因此只需申請512m的記憶體空間,每個bit位表示乙個unsigned int。讀入40億個數,並設定相應的bit位為1.然後讀取要查詢的數,檢視該bit是否為1,是1則存在,否則不存在。

2.給40億個unsigned int的整數,如何判斷這40億個數中哪些數重複?

同理,可以申請512m的記憶體空間,然後讀取40億個整數,並且將相應的bit位置1。如果是第一次讀取某個資料,則在將該bit位置1之前,此bit位必定是0;如果是第二次讀取該資料,則可根據相應的bit位是否為1判斷該資料是否重複。

二.點陣圖排序的實現

由於在c語言中沒有bit這種資料型別,因此必須通過位操作來實現。

假如有若干個不重複的正整數,範圍在[1-100]之間,因此可以申請乙個int陣列,int陣列大小為100/32+1。

假如有資料32,則應該將邏輯下標為32的二進位制位置1,這個邏輯位置在a[1]的最低位(第0位)。

因此要進行置1位操作,必須先確定邏輯位置:位元組位置(陣列下標)和位位置。

位元組位置=資料/32;(採用位運算即右移5位)

位位置=資料%32;(採用位運算即跟0x1f進行與操作)。

其他操作如清0和判斷兩個操作類似。

c語言實現程式:

/*

位圖排序 2011.10.18

*/ #include #define max 1000000

#define shift 5

#define mask 0x1f

#define digits 32

int a[1+max/digits];

void

set(int n) //

將邏輯位置為n的二進位制位置為1

//然後將1左移的結果與當前陣列元素進行或操作,相當於將邏輯位置為n的二進位制位置1.

void clear(int n)

int test(int n)

int main(int argc, char *argv)

while(scanf("

%d",&n)!=eof)

for(i=1;i<=max;i++)

return

0;}

在c++中提供了bitset這種集合,專門用來進行位操作,因此實現起來比較容易

c++版本:

/*

位圖排序c++stl實現 2011.10.19

*/ #include #include#define max 1000000

using

namespace std;

bitset1> bit; //

宣告乙個有(max+1)個二進位制位的bitset集合,初始預設所有二進位制位為0

int main(int argc, char *argv)

for(i=0;i<=max+1;i++)

return

0;}

bit map海量資料處理

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

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

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

海量資料處理專題(四) Bit map

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