原理

有 40 亿个不重复的 Interger 类型数字,没排序。给一个数字,判断这个数字是否在 40 亿个整数里面?

40 亿个 Integer,用数组存储的话,内存占用为 40亿 * 4 byte, 约等于 4GB。

也可以改变存储方式,用 bit 位的索引来表示一个数字,bit 位置位,表示这个数字存在。这种存储方式叫做 Bitmap,内存占用为 40亿 * 1 bit, 约等于 128MB, 内存占用节省了 32 倍。

但 Bitmap 只能存不重复的数字。

实现

大专栏  数据结构 - Bitmap>Q: 使用 Bitmap 存储后,如何判断一个数字是否已经存在?A: 数字就是索引,通过索引找到那个 bit 位就好了,接着通过位运算判断那个 bit 位是否置位就好了。

应用

除了可以判断数字是否存在,还可以对 Bitmap 做交并集操作。两个 Bitmap, 做与操作,就相当于做交集,可以得到在在两个 Bitmap 中都存在的数字有哪些。同理做或操作就相当于做并集。

举个实际的例子,比如用户由 UserId 标识,用户有一些 Boolean 标签,比如是否是程序员、是否使用 iOS 系统。如果许多场景需要针对标签做交并集操作,比如想要获取既是程序员、又是使用 iOS 系统的用户。就可以考虑建立一个程序员 Bitmap,一个 iOS Bitmap。通过位操作来完成交并集操作,提高性能。

02-13 23:30