位图模拟实现

位图(BitMap):


位图是一个数组的每个数据的每个二进制位表示一个数据,0表示数据不存在,1表示数据存在。通常用来判断一个数据存在或者不存在。


优点:节省空间


位图代码实现:


#include<vector>
using namespace std;

class BitSet
{
public:
	BitSet(size_t n)
	{
		_a.resize((n >> 5) + 1, 0);
	}

	void Set(size_t n)		//设置
	{
		//先计算在那个区间
		size_t index = n >> 5;
		//在计算在那个位上
		size_t pos = n % 32;
		_a[index] |= (1 << pos);
	}

	void ReSet(size_t n)		//复位重新置为0
	{
		//先计算在那个区间
		size_t index = n >> 5;
		//在计算在那个位上
		size_t pos = n % 32;
		_a[index] &= ~(1 << pos);
	}

	bool Test(size_t n)			//判断某一个位置是0还是1
	{
		//先计算在那个区间
		size_t index = n >> 5;
		//在计算在那个位上
		size_t pos = n % 32;
		//直接与1相与
		return _a[index] & (1 << pos);
	}

protected:
	vector<size_t> _a;
};

位图面试题分析:


题目:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】


分析:


(1)计算占用空间大小:40亿int数据如果存起来大概需要16G的空间(显然要想直接将这16G的数据放到内存中现在的大多数计算机还是达不到的);

(2)采用位图这种存储结构,计算需要的空间大小;

(3)因为一个数存在不存在只需要用两种状态就可以表示出来(1存在,0不存在);

(4)所以一个int数据有32个位,可以表示32个数据存在不存在,因此16G的数据用位图来存在只需要500M左右的空间;

(5)500M大小的数据现在的内存还是可以比较容易的表示出来。


图示分析:





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_happiness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值