漫画:什么是Bitmap算法?

栏目: 编程工具 · 发布时间: 5年前

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

两个月之前——

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

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

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

要想统计所有使用苹果手机或者00后的用户总合该怎么做?

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

Select count(distinct Name) as 用户数 from table whare Phone = '苹果' or age = '00后' ;

漫画:什么是Bitmap算法?

两个月之后——

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

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

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

一周之后......

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

我们以上一期的用户数据为例,用户基本信息如下。按照年龄标签,可以划分成90后、00后两个Bitmap:

漫画:什么是Bitmap算法?

用更加形象的表示,90后用户的Bitmap如下:

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

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

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

25769803776L = 11000000000000000000000000000000000B

8589947086L = 1000000000000000000011000011001110B

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

1.解析Word0,得知当前RLW横跨的空Word数量为0,后面有连续3个普通Word。

2.计算出当前RLW后方连续普通Word的最大ID是 64 X (0 + 3) -1 = 191。

3. 由于 191 < 400003,所以新ID必然在下一个RLW(Word4)之后。

4.解析Word4,得知当前RLW横跨的空Word数量为6247,后面有连续1个普通Word。

5.计算出当前RLW(Word4)后方连续普通Word的最大ID是191 + (6247 + 1)X64 = 400063。

6.由于400003 < 400063,因此新ID 400003的正确位置就在当前RLW(Word4)的后方普通Word,也就是Word5当中。

最终插入结果如下:

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

漫画:什么是Bitmap算法?

官方说明如下:

* Though you can set the bits in any order (e.g., set(100), set(10), set(1),
* you will typically get better performance if you set the bits in increasing order (e.g., set(1), set(10), set(100)).
* 
* Setting a bit that is larger than any of the current set bit
* is a constant time operation. Setting a bit that is smaller than an 
* already set bit can require time proportional to the compressed
* size of the bitmap, as the bitmap may need to be rewritten.


复制代码

漫画:什么是Bitmap算法?

几点说明:

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

1.文中介绍的Bitmap优化方法在一定程度上做了简化,源码中的逻辑要复杂得多。比如对于插入数据400003的定位,和实际步骤是有出入的。

2.如果同学们有兴趣,可以亲自去阅读源码,甚至是尝试实现自己的Bitmap算法。虽然要花不少时间,但这确实是一种很好的学习方法。

EWAHCompressedBitmap对应的maven依赖如下:

复制代码
<dependency>
  <groupId>com.googlecode.javaewah</groupId>
  <artifactId>JavaEWAH</artifactId>
  <version>1.1.0</version>
</dependency>复制代码

—————END—————

喜欢本文的朋友们,欢迎长按下图关注订阅号 程序员小灰 ,收看更多精彩内容

漫画:什么是Bitmap算法?


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

企业应用架构模式

企业应用架构模式

Martin Fowler / 王怀民、周斌 / 机械工业出版社 / 2010-4 / 59.00元

《企业应用架构模式》作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的、关于解决方案的、不可或缺的手册。《企业应用架构模式》获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖。《企业应用架构模式》分为两大部分。第一部分是关于如何开发企业应用的简单介绍。第二部分是《企业应用架构模式》的主体......一起来看看 《企业应用架构模式》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试