BitMap

应用情景

为了帮助公司精准定位用户群体,需要开发一个用户画像系统,实现用户信息的标签化。用户标签包含用户的社会属性、生活习惯、消费行为等如下信息:姓名、性别、职业、年龄、产品型号等。

统计所有90后的程序员:Select count(distinct Name) as 用户数 from table whare age = '90后' and Occupation = '程序员' ;

统计所有使用苹果手机或者00后的用户和:Select count(distinct Name) as 用户数 from table whare Phone = '苹果' or age = '00后' ;

随着系统的的发展,用户标签越来越多,拼接出的SQL语句过长且不利于维护,性能堪忧。

BitMap应运而生

BitMap用于对大量整型数据进行去重和查询。给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。此时bitmap的所有位都是0。

把整型数4存入bitmap,对应存储的位置就是下标为4的位置,将此bit置为1。

把整型数2存入bitmap,对应存储的位置就是下标为2的位置,将此bit置为1。

把整型数1存入bitmap,对应存储的位置就是下标为1的位置,将此bit置为1。

把整型数3存入bitmap,对应存储的位置就是下标为3的位置,将此bit置为1。

此时bitmap里存储了哪些元素?显然是4,3,2,1,一目了然。Bitmap不仅方便查询,还可以去除掉重复的整型数。

如何将BitMap进行应用?

建立用户名和用户ID的映射:

让每一个标签存储包含此标签的所有用户ID,每一个标签都是一个独立的Bitmap。

这样,实现用户的去重和查询统计,就变得一目了然:

与Hash相比,优势所在?

HashSet和HashMap同样可以实现用户的去重和统计,为什么要使用BitMap?

如果用HashSet或 Hashmap存储的话,每一个用户ID都要存成int,占4字节即32bit。而一个用户在Bitmap中只占一个bit,内存节省了32倍!

如何进行查询?

使用BitMap在用户群做交集和并集的运算,十分方便。

查找使用苹果手机的程序员用户:

查找所有男性或者00后的用户:

BitMap缺点

BitMap不支持【非运算】,如果想查找非90后的用户,无法使用BitMap

90后用户的Bitmap如下:

这时候可以直接求得90后的用户吗?直接进行非运算?

显然,非90后用户实际上只有1个,而不是图中得到的8个结果,所以不能直接进行非运算。

如何使用BitMap进行非运算?

同样是刚才的例子,我们给定90后用户的Bitmap,再给定一个全量用户的Bitmap。最终要求出的是存在于全量用户,但又不存在于90后用户的部分。

如何求出呢?我们可以使用异或操作,即相同位为0,不同位为1。

参考文献:https://juejin.cn/post/6844903769201704973

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值