bitmap算法 --位图算法
位图不是像素图片,而是内存中连续的二进制位(bit),用于对大量整型数据做去重和查询
例题:给定一块10bit的内存空间,想要依次插入整型数4,2,1,3
解法:
10bit每一位的的值为0,当插入4时,此时下标 4 的位置,bit值置为1,剩下三个数类似。。。
应用:例:一个用户对应多个标签
解法:思路逆转。一个标签对应多个用户
1、建立用户名和用户ID的映射
2、让每一个标签存储包含次标签 的所有用户ID,每一个标签都是一个独立的BItmap
3、这样实现用户的去重和查询统计就一目了然
HashSet和HashMap同样可以实现用户去重,但是每一个用户ID都存成int,占4个字节,即32bit,而bitmap只占1个,内存节省了32倍。
并且,在用户做交集(且)、并集(或)的时候有极大的优势。
缺点:无法进行非运算,例如查找非90后用户。。。
需要有全量用户,然后使用异或,相同位为1,不同位为0
谷歌对bitmap做了优化的地方
bitmap存储于long数组中,long数组的每一个元素都可以当做是64位的二进制数,也就是整个bitmap的子集,谷歌把这些子集叫做word
word分为两种,直接存储数据的叫LW,存储跨度信息的叫RLW
1、当创建一个空的bitmap时,初始长度只有4个word,随着数据的不断插入,word数量会随之扩充
2、当插入的ID值很大时,采用RLW