[排序] 位图排序 - C/C++

版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/83893179

位图排序

位图排序利用的是二进制中每一位的值,要么是0,要么是1。0、1(是与不是)的逻辑清晰性,可以让我们很高效的处理一些事情

  1. 海量数据去重
  2. 海量整型数据排序(不会重复的数据)
  3. 位图法存数据
  4. 判断数据是否存在

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中如何实现

  1. 用每一个元素表示一个32位的二进制字符串,这样这个元素可以保留相邻32个号码是否存在的信息
  2. 数组范围就下降到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));
}

相关文章

  1. 初始位图排序-图文
  2. 位图排序应用

猜你喜欢

转载自blog.csdn.net/summer_dew/article/details/83893179