【c++】bitmap的实现

@最近被问到怎么在很多数据(如20亿)中实现快速查找,没有答上来…

@假设是用unordered_map来实现,查找效率为O(N),假设元素为int类型,则需要20亿*4Bytes,这显然太占资源

@后来了解到bitmap,也就是所谓的位图,用一两bit表示该数是否出现过,例如int为8字节,32位,则可存进0-31的数,则20亿数需要20亿/32Bytes,这样便大大节约了资源

@实现代码如下,主要实现其添加、删除与查找,通过位运算实现:
1.如实现查找功能,则通过int_/32可知该数应该属于第几组,通过int_%32可知该数在该组的下标树,通过与1<<location则可知查找的该位置是否为1判断该数是否存在
2.添加与删除功能原理类似,不再赘述…

class my_bitmap {
public:
	my_bitmap(){
		memset(a, 0, sizeof(a));
	};
	//添加
	void insert(const int& int_) {
		int arr = int_ / 32;
		int location = int_ % 32;
		a[arr] |= (1<<location);
	}
	//删除
	void erase(const int& int_) {
		int arr = int_ / 32;
		int location = int_ % 32;
		a[arr] &= ~(1<<location);
	}
	//查找
	void find(const int& int_) {
		int arr = int_ / 32;
		int location = int_ % 32;
		if (a[arr] & 1 << location) {
			cout << "is find!" << endl;
		}
		else cout << "is not find!" << endl;
	}
private:
	int a[100];//可以存100*32个数
};

@代码若有误,欢迎指正!!!
@理解若有误,欢迎指正!!!
@bitmap还能够实现快速排序、快速去重,有兴趣的可以自己了解下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值