1.bitmap位图
将数据以二进制位表示的结构。基本原理就是用一个bit 位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。
Bitmap常用于快速去重和计数操作。Bloom Filter就是一种基于Bitmap的概率性数据结构,用于检查元素是否在一个集合中。
假设有一个集合{1, 3, 4},我们可以用一个Bitmap来表示这个集合:
元素: 1 2 3 4 5 6
Bitmap: 1 0 1 1 0 0
2.bloom filter
Bloom Filter是一种空间效率非常高的概率性数据结构,用于判断一个元素是否属于某个集合,去重过滤场景。它非常适合用于处理大规模数据集,尤其是在需要高效查找和节省空间的场景中。虽然Bloom Filter可能会出现假阳性错误(即错误地认为某个元素在集合中),但它不会产生假阴性错误(即不会错误地认为某个实际存在的元素不在集合中)。
Bloom Filter的核心思想是利用多个哈希函数将元素映射到一个位数组(Bitmap)中。具体步骤如下:
-
初始化位数组:Bloom Filter使用一个大小为
m
的位数组,所有位最初都设置为0。 -
哈希函数映射:Bloom Filter配备了
k
个独立的哈希函数。每个哈希函数都将输入元素映射到位数组中的一个位置。 -
插入元素:当插入一个元素时,通过这
k
个哈希函数计算出k
个位置,将这些位置上的位设置为1。 -
查询元素:要查询一个元素是否存在时,同样通过这
k
个哈希函数计算出k
个位置,如果所有这些位置上的位都是1,则认为元素可能存在于集合中;如果任何一个位置上的位是0,则可以确定该元素一定不存在。
使用多个哈希函数的原因:
- 降低误判率(假阳性率)
- 降低哈希冲突。单个哈希函数容易造成哈希冲突,多个哈希函数可以提高鲁棒性。
- 优化空间利用率。使得分布更均匀。
2.1 优缺点
优点:空间效率高、插入速度快、查询速度快。增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)。
缺点:不可删除,删除可能会影响其他元素的判断;假阳性错误,因为有可能不同元素计算的哈希值一样。
2.2 应用场景
-
去重操作:在大规模数据处理中,Bloom Filter常用于快速判断某个元素是否已经存在于集合中,避免重复处理。
-
缓存策略:在分布式系统中,Bloom Filter可以用于判断某个请求是否已经缓存,如果没有则直接访问数据库或后端存储。
-
网络爬虫:网络爬虫可以使用Bloom Filter来判断URL是否已经被访问过,以避免重复抓取。
3.如何调参
如何选择参数?布隆过滤器的大小、假阳性率、元素存储数量都分别有什么关系?
- m-占用空间大小,单位:bit(8bit= 1字节B)
- n-要存储的样本数量
- q-假阳性率
- 单个样本大小不影响布隆过滤器大小,因为样本会通过哈希函数得到输出值。
哈希函数个数的计算:
计算失误率的公式:
例子:
不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64字节。要求该系统允许有万分之一以下的判断失误率,并且使用的额外空间不要超过30G。
n=100亿,p=0.0001,m=19.19n,m约为2000亿bit;
k= 14,需要14个哈希函数。再有m、n、k计算失误率为0.0006%。