位图的理论

位图的原理:当我们来记录一组0~n的数时,我们可以用哈希表来记录,但每记录一个数字,就会

使用一个int型;其实我们可以用一个int型的32位来表示32个数,如果有对应位上就标为1,没有

就为0;然而如果想表示超过31的数该怎么办呢?我们可以用多个int拼接表示,例如当我们要记录

33时,我们可以再第二个int型的第2个bit位上标为1。

说完位图的大体原理,再来说说具体该怎么操作:

1.该创建多少int型?

如果只有1个数,我们只需1个整形;如果有32个数,也只需要1个整形。所以只需要n/32向上取整

个数的整形。对于向上取整,如果a和b为非负数,可以采用(a+b-1)/b的写法,所以需要创建

(n+31)/32个int

2.当要处理一个数时,怎样找到对应的位置?

例如,我们要处理64这个数,首先我们要先找到64所在的整形数,第1个int表示0~31,第二个表示

32~63,所以64在第三个int上,其对应的int的下标为64/32;找到对应的int,再应该找其在int的

哪个位上,在n%32上。

3.具体的操作

1)将n加入到位图里:

int add(int n){
   int pos1=n/32;
   int pos2=n%32;
   s[pos1]|=1<<pos2;//s是int的集合
}

2)将n移除:

int remove(int n){
  int pos1=n/32;
  int pos2=n%32;
  s[pos1]&=~(1<<pos2);
}

3)翻转n:

int reverse(int n){
  int pos1=n/32;
   int pos2=n%32;
  s[pos1]^=1<<pos2;
}

4)判断是否存在n:

bool contain(int n){
 int pos1=n/32;
 int pos2=n%32;
 return s[pos1]>>pos2&1;
}

以上是一些基本的操作,还有可以有一些拓展的功能,可参考leetcode 设计位集

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值