算法:BitMap算法实现

算法介绍:

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");

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值