数据结构:位图

转自:https://blog.csdn.net/lucky52529/article/details/90172264

1. 定义

位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况,通常用来判断一个数据是否存在。

2. 位图应用

问题1:有20亿个无符号的整型数据,现在给定一个目标数字,判断这个数字是否在这20亿数据中。

解决思路

将这些数字排序好,再二分查找或者采用归并排序。

但问题并不在于查找这个数字的效率,而是这20亿个整形数据存储问题。一个int,4个字节,20亿int就需要差不多8G的内存。就算采用归并排序,也需要考虑磁盘文件多次读写的问题。

采用位图法,用一个bit位来表示一个数字[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwHSWoN2-1621061981972)(数据结构:位图.assets/截屏2021-05-15 上午10.26.14.png)]

这样,本来4个字节只能存储一个数字,现在使用位图就存储了32个数字。

3. 设计位图

class BitMap
{
public:
	BitMap(size_t range)
	{
		_bitTable.resize((range >> 5) + 1);
	}

	//标识一个数字在位图中的位置
	void SetBit(size_t x)
	{
		size_t index = x >> 5;
		size_t num = x % 32;

		_bitTable[index] |= (1 << num);
	}

	//取消数字在位图当中的标识.
	void RemoveBit(size_t x)
	{
		size_t index = x >> 5;
		size_t num = x % 32;

		_bitTable[index] &= ~(1 << num);
	}


	bool TestBit(size_t x)
	{
		size_t index = x >> 5;
		size_t num = x % 32;

		return _bitTable[index] & (1 << num);
	}

private:
	vector<int> _bitTable;
};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UAkTxEv5-1621061981974)(数据结构:位图.assets/截屏2021-05-15 下午2.58.37.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值