bitmap實現大資料排序和去重
阿新 • • 發佈:2019-01-12
要點:
假如有10億元素,全部資料讀進記憶體,佔用 1000000000 * 4 / 1024 / 1024 /1024 ≈ 3.725 G,爆炸!
解決方法:
bitmap演算法,每一位都能表示一位數字,10000000000 / 8 / 1024 / 1024 / 1024 ≈ 0.116 G,節約了31倍的空間!
程式碼:
#define SIZEBIT 1000000000 #define SIZE SIZEBIT/32 + 1 void cleanAll(unsigned int* bitmap) { for (int i = 0; i < SIZE; ++i) bitmap[i] = 0; } void set(unsigned int* bitmap, unsigned int index) { bitmap[index / 32] |= 1 << index % 32; // 利用 | 進行置1操作,如有重複元素,只會保留一個,故可去重。 } void clean(unsigned int* bitmap, unsigned int index) { bitmap[index / 32] &= ~(1 << index % 32); // 利用 ~ 和 & 進行置0操作,即刪除元素。 } int get(unsigned int* bitmap, unsigned int index) { return bitmap[index / 32] & (1 << index % 32); // 利用 & 進行取元素操作。 } void sort(vector<int> &a) // 將元素存入bitmap陣列中,元素其實自動排序,只要bit == 1,即說明有此元素。 { unsigned int bitmap[SIZE]; cleanAll(bitmap); for (int i = 0; i < a.size(); i++) { set(bitmap, a[i]); } for (int i = 0; i < SIZEBIT; ++i) { if (get(bitmap, i)) cout << i << endl; } } int main() { vector<int> a = { 1, 3, 2, 5, 2 }; sort(a); // 輸出 1 2 3 5 system("pause"); return 0; }