Bit_map就是用一个bit位来标记某个元素对应的Value,而key即是该元素。由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节省。
例如,要对0~7内的5个元素(4,5,2,5,3)排序(元素没有重复)。要表示8个数据,采用bit_map方法只需要8个bits(1bytes),。首先将bit都置为0,如图1
图1
然后遍历这个5个元素,首先第一个元素是4,则把4对应的位置置为1,因为从0开始计数,所以第5位置1,如图2
图2
然后再处理第二个元素7,将第8位置1,依次处理其他元素,相应位置1,如图3
图3
bit_map适用的范围:
可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下
#include<stdio.h>
#include<memory.h>
#define BYTESIZE 8
void SetBit(char* p,int posi)
{
printf("bitset/n");
printf("%d/n",posi);
for(int i=0;i<(posi/BYTESIZE);i++) //跳转到下一个字节
{
p++;
}
*p=*p|(0x01<<(posi%BYTESIZE)); //利用或操作设置相应位而不改变其他位
}
void BitMapSort()
{
int num[]={3,5,2,10,6,12,8,14,9,20,21};
const int BufferLen=3;
char* pBuffer=new char[BufferLen];
memset(pBuffer,0,BufferLen);
for(int k=0;k<11;k++)
{
SetBit(pBuffer,num[k]); //设置相关位
}
printf("output the sort result:/n");
for(int i=0;i<BufferLen;i++)
{
for(int j=0;j<BYTESIZE;j++)
{
// printf("output/n");
if((*pBuffer&(0x01<<j))==(0x01<<j)) //将字节中的数据与掩码(0x01<<j)做与操作然后做比较
{
printf("%d/n",i*BYTESIZE+j); //输出相关位代表数据
}
}
pBuffer++;
}
}
int main()
{
BitMapSort();
return;
}