数据结构————一种标记数组————位图(2.0)

一、简单介绍

位图就是用每一位 来标记一个数是否存在, 相比bool类型, 极大的节省了空间。

如果你想存maxn个数,最多只要 开maxn/32 + 1个 int(32位)的数组就行。

位图的操作:
①初始化为零,表示数数字都不存在
②标记某个数字
③删除某个数字的标记
④查询某个数字是否存在

二、实现原理:
1、初始化为0:

这个很简单,就是将数组初始化为0, 每一位就变为0了。

2、标记某个数字:

举个例子, 如果你想将 数字1206标记:
首先 1206 整除32 == 32
然后 1026 mod 32 ==2
所以只要将 下标为32的数组元素中第2位标记为1就行了。
实现 :bitmap[1026/32] |= 1<<(1026%32);
1026/32 可以换成1026>>5 , 1026%32 可以换成1026&31
在这里插入图片描述
↓ 存完1026 后 bitmap[32]的二进制变化 ↓ ↓
在这里插入图片描述

3、删除操作

同样是1026.
只要将 下标为32的数组元素第2位标记为0就行了。

实现:bitmap[1026/32]=bitmap[1026/32] & ~1(1026%32)。
~:是按位取反操作, 要删除的位为0其他位为1, 这样就不影响其他位了。
①按位取反
在这里插入图片描述

4、查询操作:

同样也是1026.
如果你想看这个数是否存在, 就看它对应的位置(32,2)是否标记为1就行。
所以只要 return bitmap[1026/32]&1<<(1026%32);
如果存在返回值为1&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值