什么是Bitmap算法?


本文的灵感来源于京东金融数据部张洪雨同学的项目经历,感谢这位大神的技术分享。

为满足用户标签的统计需求,小灰利用 MySQL 设计了如下的表结构,每一个维度的标签都对应着 MySQL 表的一列:

要想统计所有 90 后的程序员该怎么做呢?

用一条求交集的 SQL 语句即可:

SELECT COUNT(DISTINCT name) AS 用户数 FROM table WHERE age = '90后' AND occupation = '程序员'

要想统计所有使用苹果手机或者 00 后的用户总合该怎么做?用一条求并集的 SQL 语句即可:

SELECT COUNT(DISTINCT name) AS 用户数 FROM table WHERE phone = '苹果' OR age = '00后'

两个月之后——

———————————————

1.给定长度是 10 的 bitmap,每一个 bit 位分别对应着从 0 到 9 的 10 个整型数。此时 bitmap 的所有位都是 0。

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

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

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

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

要问此时 bitmap 里存储了哪些元素?显然是 4,3,2,1,一目了然。

bitmap 不仅方便查询,还可以去除掉重复的整型数。

1.建立用户名和用户 ID 的映射。

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

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

1.如何查找使用苹果手机的程序员用户?

2.如何查找所有男性或者00后的用户?

说明:该项目最初的技术选型并非 MySQL,而是内存数据库 hana。本文为了便于理解,把最初的存储方案写成了 MySQL 数据库。

 

转载:樊浩柏科学院


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM