bit map海量資料處理

2021-06-16 21:29:25 字數 3213 閱讀 6083

海量資料排序問題:檔案包含1千萬條**號碼記錄(10**7次方),每條記錄都是7位整數,沒有重複的整數。要求對檔案進行排序,注意大約只有1mb的記憶體空間可用,有充足的磁碟儲存空間可用。請設計乙個高效的演算法。

(1)運用多趟演算法:如果每個號碼都使用32位整數來表示,則在1mb儲存空間裡大約可以存250000個號碼。因此,可以使用遍歷輸入檔案40趟的程式來完成排序。在第一趟中,將0至249999之間的任何整數讀入內在,對其進行排序後寫到輸出檔案中。第二趟遍歷250000至499999之間的整數,依此類推,到第40趟遍歷的時候對9750000至9999999之間的整數進行排序。

(2)運用位圖資料結構:使用乙個具有1000萬個位的串(約1.25mb)來表示這個檔案,其中當且僅當整數i在檔案中存在時,第i位為1。首先將所有的位都置為0,從而將集合初始化為空。然後通過讀入檔案中的每個整數來建立集合,將每個對應的位都置為1。最後掃瞄每一位,如果該位為1就輸出對應的整數,由此產生有序的輸出檔案。

#include #define bitsperword 32

#define shift 5

#define mask 0x1f

#define n 10000000

int a[1+n/bitsperword]; /* 表示1000萬個整數的位向量 */

/* 設定整數i所在的位 */

void set(int i)

/* 清除整數i所在的位 */

void clr(int i)

/* 測試位向量中是否有整數i */

int test(int i)

int main(void)

int a[10000000];

int main(void)

海量資料搜尋問題:乙個順序檔案包含40億個隨機排列的32位整數,找出乙個不在檔案中的32位整數。

(1)位圖技術:如果有足夠的記憶體,可以使用位圖技術。使用536870912個8位位元組形成的位圖來表示檔案的整數。通過掃瞄位圖即可找到缺失的整數。

(2)排序技術:通過對檔案進行快速排序,我們能夠找到缺失的整數。這時總的執行時間正比於nlogn。

(3)二分搜尋技術:如果僅有幾百個位元組的記憶體和幾個外部的臨時順序檔案可用呢?採用二分搜尋技術並結合多趟演算法。第一遍通過多趟讀取40億個輸入整數,並把起始位為0的整數寫入乙個順序檔案,把起始位為1的整數寫入另乙個順序檔案。這兩個檔案中有乙個檔案最多包含20億個整數,接下來將該檔案用作當前輸入並重複探測過程,但這次探測的是第第二個位。如果原始的輸入檔案包含n元素,那麼第一遍將讀取n個整數,第二遍最多讀取n/2個整數,第三遍最多讀取n/4個整數,依此類推,最後我們可以找到缺失的整數。所以總的執行時間正比於n。

bitmap的定義:所謂的bit-map就是用乙個bit位來標記某個元素對應的value, 而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。

使用bitmap實現8位**號碼的儲存,能夠實現**號碼的插入、刪除、查詢。

使用bitmap演算法。8位**號碼總共有0-99999999個號碼,每位代表乙個**號碼,需要12500000個位元組的記憶體來儲存**號碼

實現過程如下:

#include #include #include #include #define szlong_size 5

#define szlong_mask 31ul

#define __bit_set_n(n) (0x1<<(n&szlong_mask))

void set_bit(void *base, unsigned long nr)

void clear_bit(void *base, unsigned long nr)

int main()

另外乙個例子:

bitmap.h  

/* *bitmap的c語言實現

*/

#ifndef _bitmap_h_

#define _bitmap_h_

/* *功能:初始化bitmap

*引數:

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

*start:起始值

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

*/

int bitmap_init(int size, int start);

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

*index:要設的值

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

*/

int bitmap_set(int index);

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

*i:待取位

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

*/

int bitmap_get(int i);

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

*/

int bitmap_data(int index);

/*釋放記憶體*/

int bitmap_free();

#endif

bitmap.c

#include #include #include #include "bitmap.h"

unsigned char *g_bitmap = null;

int g_size = 0;

int g_base = 0;

int bitmap_init(int size, int start)

int bitmap_set(int index)

int bitmap_get(int i)

int bitmap_data(int index)

int bitmap_free()

測試程式bitmap_test.c:

#include #include "bitmap.h"

int main()

; 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;

}

海量資料處理之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...

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

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