生产实践中的经典算法-BitMap

一、BitMap原理

        是一个位图,用二进制来记录数据状态,本质就是字节表示法。一个int占4个字节,32bit。  用下标表示数值,下标索引由0~31。

        比如想存1,2,4,6。在字节数组中下标对应1,2,4,6位置的元素记为,其余为0。因为都是在A[0]中,A[0]=1+4+16+64=86。

        因为一个字节数组只能存32位,比如A[0]存0~31,32就存在A[1]中。比如存32,34,36。后续数字以此类推。

        那么如何确定给定的一个数M,应该存在哪个位置呢?  因为每个数组可以存32个,所以首先M/32得到应该存在数组的下标。比如90/32=2,存在A[2]中。存在92%32=26,存在A[2]的26个位置

 二、举例

1. 添加

        比如此时,0 1 4 6是存在的,想把3也添加进来,会创建和他一样长度的字节数组,3的位置记为1,其他为0。

        两个数组按位相或(有1则1,没1则0)                本质上就是1<<3 | A[0]

        如果想增加90,同理对90/32得出应该存在数组的第几个,90%32得到存的位置。1<<90%32|90/32。  对于一个M,A[M/32] | 1<< (M%32)

2. 删除

        比如此时保存了0 1 4 6,此时想删除4,和4位置为0,其余为1的数组相与(全1为1,有0则0)

想删除M,A[M/32] & ~(1<<M%32)

3. 查找

        想查询4在不在,3在不在

        判断M在不在,A[m/32] & (1<<m%32),如果不为0,就存在,如果位0,不存在

三、简单应用

1. 排序

        假设4 7 2 5 3,无重复

开启二进制数组,进行存入,此时设置一个1,依次左移7位进行相与=1,记录下标。复杂度位On

2. 去重

        20亿个整数,找到不重复的个数

        数字可能性:① 不存在  ② 存在且唯一  ③ 存在且不唯一。有三种状态,这时用两个比特来存,比如00代表不存在,01代表存在且唯一,10代表存在且不唯一。将20亿个数字依次存入

        比如此时创建A[10000],读到了3,将A[0]中,下标为3记为01,又再次读到了3,将下标更新为10。依次扫描记录

        这时只想统计01出现的次数(和00相或,结果为01的)

四、实际可能应用

        bitmap用作签到,把每一个bit位对应当月的一天,签到记为1,没签到记为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值