算法介绍:
Bit-Map算法具有效率高,节省空间的特点,适用于对大量数据进行去重,查询等。
花了一个小时实现了一下
只要定义一下bitmap_type和BitMap_User的结构体就可以使用了
bitmap功能的实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//数据类型
#define bitmap_type int
// BITS_PER_WORD 与 MASK、SHIFT 是相匹配的,
// 如果 BITS_PER_WORD 为 8,则 SHIFT 为 3,MASK 为 0x07
// 如果 BITS_PER_WORD 为 64,则 SHIFT 为 6,MASK 为 0x3f
// 同样的存储位图的数组的元素类型也要发生相应的改变,BITS_PER_WORD == 8,char
// BITS_PER_WORD == 64, ⇒ long long
struct BitMap_User{
//位数代表的数字范围
int BITS_PER_WORD;
//位数全放置1
int MASK;
//位数
int SHIFT;
//一共多少个数
int Count;
unsigned int *List;
};
void bitmap_init(int Count, struct BitMap_User * BitMap_User)
{
BitMap_User->Count = Count;
switch (sizeof(bitmap_type))
{
case 1:
BitMap_User->BITS_PER_WORD = 8;
BitMap_User->MASK = 0x0f;
BitMap_User->SHIFT = 3;
break;
case 4:
BitMap_User->BITS_PER_WORD = 32;
BitMap_User->MASK = 0x1f;
BitMap_User->SHIFT = 6;
break;
default:
printf("数据类型不支持\r\n");
break;
}
BitMap_User->List = new unsigned int[1 + BitMap_User->Count / BitMap_User->BITS_PER_WORD];
memset(BitMap_User->List, 0, (1 + Count / BitMap_User->BITS_PER_WORD) * sizeof(bitmap_type));
}
//将自定位设定为1;
void bitmap_set(int bit_position,struct BitMap_User BitMap_User)
{
BitMap_User.List[bit_position >> BitMap_User.SHIFT] |= (1 << (bit_position & BitMap_User.MASK));
}
//将自定位设定为0;
void bitmap_clear(int bit_position, struct BitMap_User BitMap_User)
{
BitMap_User.List[bit_position >> BitMap_User.SHIFT] &= ~(1 << (bit_position & BitMap_User.MASK));
}
// 检查第i位的值
int bitmap_getState(int bit_position, BitMap_User BitMap_User)
{
return (BitMap_User.List[bit_position >> BitMap_User.SHIFT] & (1 << (bit_position & BitMap_User.MASK))) && 1;
}
测试程序如下
void main()
{
int man = 0,i;
//0 = x
//1 = y
//2 = z
struct BitMap_User BitMap_Basketball;
struct BitMap_User BitMap_Football;
bitmap_init(3, &BitMap_Basketball);
bitmap_init(3, &BitMap_Football);
bitmap_set(0, BitMap_Basketball);
bitmap_set(1, BitMap_Football);
bitmap_set(2, BitMap_Basketball);
bitmap_set(2, BitMap_Football);
printf("只喜欢篮球:");
for (i = 0; i < 3; i++)
{
if (bitmap_getState(i, BitMap_Basketball))
{
printf("%d,", i);
}
}
printf("\r\n只喜欢足球:");
for (i = 0; i < 3; i++)
{
if (bitmap_getState(i, BitMap_Football))
{
printf("%d,", i);
}
}
printf("\r\n即喜欢足球又喜欢篮球:");
for (i = 0; i < 3; i++)
{
if (bitmap_getState(i, BitMap_Football) && bitmap_getState(i, BitMap_Basketball))
{
printf("%d,", i);
}
}
printf("\r\n");
system("pause");
}