本文内容基于《漫画算法 小灰的算法之旅》,魏梦舒著。
1. Bitmap的巧用
Bitmap算法,又叫做位图算法,这里所说的位图并不是像素图片的位图,而是内存中连续的二进制位所组成的数据结构,该算法主要用于对大量整数做去重和查询操作。
1.1 查询
举个例子,假设给出一块长度为10bit的内存空间,也就是Bitmap,想要依次插入证书4、1、2、3,需要怎么做?
- 第1步:给出一块长度为10的Bitmap,其中的每一个bit位分别对应着从0到9的整型数。此时,Bitmap的所有位都是0;
- 第2步:把整型数4存入Bitmap,对应存储的位置就是下标为4的位置,将此bit设置为1;
- 第3步:类似第2步;
- 第4步:类似第2步;
- 第5步:类似第2步。
如果问此时Bitmap里存储了哪些元素,显然是4、3、2、1,一目了然。
1.2 去重
例如用Bitmap的形式存储用户标签,以标签为中心,一个标签对应多个用户,例如用户信息:
ID | Name | Sex | Age | Occupation | Phone |
1 | 小灰 | 男 | 90后 | 程序员 | 苹果 |
2 | 大黄 | 男 | 90后 | 程序员 | 三星 |
3 | 小白 | 女 | 00后 | 学生 | 小米 |
让每一个标签存储包含此标签的所有用户ID,每一个标签都是一个独立的Bitmap:
Sex | Bitmap |
男 | 1, 2 |
女 | 3 |
Age | Bitmap |
90后 | 1, 2 |
00后 | 3 |
Occupation | Bitmap |
程序员 | 1, 2 |
学生 | 3 |
Phone | Bitmap |
苹果 |