/*
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 介面隔離原則,將大的介面打散成多個小介面...