一、位图(Bitmap)
1. 定义
位图是一种紧凑的数据结构,用二进制位(0 或 1)来表示数据的存在与否。每个位对应一个元素,通常用于表示一个集合。
2. 特点
- 空间效率高:每个元素只占用 1 个二进制位。
- 查询速度快:通过位运算可以快速判断元素是否存在。
- 适合稠密数据:当数据范围较小且密集时,位图非常高效。
3. 实现
-
使用数组或整数的二进制位表示数据。
-
示例:用位图表示 0 到 7 的数字集合:
位图:01010101 表示:数字 1、3、5、7 存在,其他数字不存在。
4. 应用场景
- 去重:判断某个元素是否已经存在。
- 排序:对一组整数进行排序。
- 索引:用于数据库或搜索引擎的索引。
5. 优缺点
-
优点:
- 空间占用小。
- 查询和插入操作的时间复杂度为 O(1)。
-
缺点:
- 只能存储整数类型的数据。
- 数据范围较大时,空间占用会显著增加。
二、布隆过滤器(Bloom Filter)
1. 定义
布隆过滤器是一种概率型数据结构,用于判断一个元素是否存在于一个集合中。它通过多个哈希函数将元素映射到位图中。
2. 特点
- 空间效率高:使用位图存储数据。
- 允许误判:可能存在误判(即判断元素存在,但实际上不存在),但不会漏判。
- 适合海量数据:当数据量非常大时,布隆过滤器可以显著减少存储空间。
3. 实现
- 使用一个位数组和多个哈希函数。
- 插入:将元素通过多个哈希函数映射到位数组中,并将对应位置为 1。
- 查询:检查元素通过多个哈希函数映射的位置是否都为 1。如果都为 1,则可能存在;否则一定不存在。
4. 应用场景
- 缓存穿透:防止恶意查询不存在的缓存数据。
- URL 去重:判断一个 URL 是否已经被爬取。
- 垃圾邮件过滤:判断一封邮件是否是垃圾邮件。
5. 优缺点
-
优点:
- 空间占用小。
- 查询和插入操作的时间复杂度为 O(k),其中 k 是哈希函数的数量。
-
缺点:
- 存在误判率。
- 不支持删除操作。
三、位图与布隆过滤器的区别
| 特性 | 位图(Bitmap) | 布隆过滤器(Bloom Filter) |
|---|---|---|
| 数据结构 | 位数组 | 位数组 + 多个哈希函数 |
| 存储内容 | 精确存储元素是否存在 | 概率性判断元素是否存在 |
| 误判率 | 无 | 有 |
| 空间占用 | 较小(适合稠密数据) | 更小(适合海量数据) |
| 查询速度 | O(1) | O(k)(k 为哈希函数数量) |
| 适用场景 | 去重、排序、索引 | 缓存穿透、URL 去重、垃圾邮件过滤 |
| 支持删除 | 支持 | 不支持 |