1. 程式人生 > >bitmap實現大資料排序和去重

bitmap實現大資料排序和去重

要點:

假如有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;
}