[排序] 點陣圖排序 - C/C++
阿新 • • 發佈:2018-11-12
文章目錄
點陣圖排序
點陣圖排序利用的是二進位制中每一位的值,要麼是0,要麼是1。0、1(是與不是)的邏輯清晰性,可以讓我們很高效的處理一些事情
- 海量資料去重
- 海量整型資料排序(不會重複的資料)
- 點陣圖法存資料
- 判斷資料是否存在
C++如何實現
C++有bitset,很方便的可以讓我們實現對二進位制每一位的操作
使用例子
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
const int numcount = 10;
const int MAXNUM = 20;
int arr[numcount] = {2,20,13,7,2,18,16,5,1,0};
bitset<MAXNUM+1> bitmap;
//指定為置1
for (int i=0; i<numcount; i++)
{
bitmap.set(arr[i]);
}
//輸出排序結果;
for (int i=0; i<MAXNUM; i++)
{
if (bitmap.test(i) )
{
cout<<i<<" ";
}
}
}
C中如何實現
- 用每一個元素表示一個32位的二進位制字串,這樣這個元素可以保留相鄰32個號碼是否存在的資訊
- 陣列範圍就下降到10000000/32了
如對於89256,由於89256 mod 32=278餘8 --> 這樣我們應該置a[2789]中32位字串的第8位(從低位數起)為1
#define WORD 32
#define SHIFT 5 ////移動5個位,左移則相當於乘以32,右移相當於除以32取整
#define MASK 0x1F //16進位制下的31
#define N 10000000
int bitmap[1 + N / WORD];
/*
* 置位函式——用"|"操作符,i&MASK相當於mod操作
* m mod n 運算,當n = 2的X次冪的時候,m mod n = m&(n-1)
*/
void set(int i) {
bitmap[i >> SHIFT] |= (1 << (i & MASK));
}
/* 清除位操作,用&~操作符 */
void clear(int i) {
bitmap[i >> SHIFT] &= ~(1 << (i & MASK));
}
/* 測試位操作用&操作符 */
int test(int i) {
return bitmap[i >> SHIFT] & (1 << (i & MASK));
}