bitmap 位图算法

位图算法简单介绍

1.业务场景

有一批用户数据

id分别为 :1,2,3,4,5,6,7,8,9,10 ( int );

如果依赖java内存来进行存储的话,从数据大小的角度来说,1 int 32bit,存储该批数据内存大小使用 10 * 32 bit ,但此时我们的用户数据3000W条,

继续使用内存的情况下将使用 960000000bit 即0.11G ,如果用户数据3亿条…

2.bitmap结构

引出位图算法。给出长度是10的bit数组,每一个bit位分别对应着从0到9的10个

整型数(用户id),初始bit数组所有元素值都为0,  bit为二进制位,0表示没有值,1表示有值。

《bitmap 位图算法》

《bitmap 位图算法》

图1 数据结构为bit数组  大小为10 , 现在将用户id为 2,4两个用户写入bit数组,写入bit数组2跟4的位置,同时将bit的值从0调整到1

现在图2表示,一个10个大小bit的数组,存入了 2,4 。 


《bitmap 位图算法》

3.bitmap场景

用户画像功能 会给一个用户打上不同的标签,结构化场景如下:

《bitmap 位图算法》

《bitmap 位图算法》

为每一个用户标签创建一个bitmap数组,一个标签对应N多个用户,例如游泳bitmap,旅行bitmap ……

4.bitmap运算

业务需求要查询出 用户标签是 爱好上网并且喜欢旅行的用户,

爱好旅行bitmap数组内容如下.

《bitmap 位图算法》《bitmap 位图算法》

爱好上网的bitmap数组内容如下.

《bitmap 位图算法》

《bitmap 位图算法》

                                                            

直接对不同标签进行位运算0000011000&0000010000 = 0000010000;根据bitmap算法求出用户id为4的用户满足要求,或运算同理。

5.持久化

bitmap持久化可以简单的理解成 一个数字N就是一个用户标签A。

例如  N=123  二进制转换成 1111011, 根据bitmap算法推算出 A标签下存了0,1,3,4,5,6 元素。

点赞