大資料中2Bitmap的思想

2021-06-26 04:10:41 字數 1704 閱讀 5206

/*

2-bitmap_main.cpp

在2.5億個整數中找出不重複的整數,注,記憶體不足以容納這2.5億個整數。

下面都假定為非負整數!!!

方案1:採用2-bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,

共需記憶體2^32 * 2 bit=1 gb記憶體,還可以接受。然後掃瞄這2.5億個整數,檢視bitmap中相對應位,如果是00變01,01變10,10保持不變。

所描完事後,檢視bitmap,把對應位是01的整數輸出即可。

*/#include#include#include /*

每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義

用char陣列儲存2-bitmap,不用考慮大小端記憶體的問題

2bitmap a[40];

也就是說把2bitmap看做一種資料型別,佔兩位。如2bitmap a[8];共佔8*2==16位,共2個位元組。

但是我們不能直接用指標或下標操作來定位a[i]。故只能通過對char型別資料進行運算,來得到相應的a[i].

如:char b[10], b[0]對應a[3],a[2],a[1],a[0],

b[1]對應a[7],a[6],a[5],a[4],

...........................

b[9]對應a[39],a[38],a[37],a[36]

即b[j]對應:a[j*4+3],a[j*4+2],a[j*4+1],a;//可以統計n*4個整數的情況

/*此時 2bitmap a[4*n];(當然不能在程式中這麼寫了)

a[i]為0,表示整數i沒有出現過;為1表示整數i出現1次,為2表示整數i出現多次,為3表示未定義

*///************************************

// method: get_value 獲取a[i]即b[j]中的第i%4 *2+1與i%4 *2 位

// fullname: get_value

// access: public

// returns: unsigned int

// qualifier:

// parameter: size_t i

//************************************

unsigned int get_value(size_t i)

//************************************

// method: set_value 設定a[i]為val,即設定b[j]的第index *2+1與index *2 位為val二進位制的後兩位

// fullname: set_value

// access: public

// returns: void

// qualifier:

// parameter: size_t i

// parameter: unsigned char val

//************************************

void set_value(size_t i, unsigned char val)

unsigned add_one(int idx)

else

}

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

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

關於bitmap結構的大資料場景應用

給定乙個檔案,裡面包含40億個整數,寫乙個演算法找出檔案中不包含的乙個整數,假設你有1gb的記憶體可以用。如果只有10mb 的記憶體呢?解析 引出bitmap結構。對於40億個整數,如果直接用int陣列來表示的話,需要40億 4 8b 40 10 8 4b 16gb,超出了記憶體要求。這裡我們使用b...

談談大資料程式設計的風格與思想

1 在寫程式之前,盡可能地理清思路,如果是複雜的設計,最好畫出流程圖或序列圖,然後安裝思路邊測試邊修正,會事半功倍 1 單一職責 2 開閉原則,對擴充套件開放對修改關閉 3 黎克特制代換原則,子類只能去擴充套件基類,而不是隱藏或覆蓋基類 4 依賴倒換原則 5 介面隔離原則,將大的介面打散成多個小介面...