版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/83893179
位图排序
位图排序利用的是二进制中每一位的值,要么是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));
}