一、组成:
-
一个很长的二进制向量(集合)
-
多个映射函数
二、作用:
判断某个元素一定不在集合内或可能在集合内
三、背景:
集合中元素增加,所需存储空间和查询时间都会增加。比如邮件服务商存储垃圾邮件账号,一个亿的email地址需要1.6GB的内存空间,若是想要判断一个邮件账号是否为垃圾地址,则耗时更长
四、原理
布隆过滤器是
-
一个基于m位的比特向量(b1,b2…,bm),这些比特向量的初始值为0。
-
一系列的哈希函数(h1,h2…,hk),这些哈希函数运算后的哈希值范围在[1, m]内。
1. 插入
如下图,就是x、y、z三个元素插入到布隆过滤器中,并判断w值是否在集合中的示意图。
插入x值(对应红线),则将经过h1、h2和h3三个哈希函数映射到的比特向量上的值改为1。
y(对应绿线)和z(对应蓝线)值也一样操作。
2. 查找
-
通过布隆过滤器判断一个元素是否可能在集合中时,需对应的比特向量位置全为1。
-
一个位置为1,不代表是某个元素导致的,也可能是其他元素映射后导致的。
-
如果要查找w值,经过哈希映射后,可以发现有一个比特向量上的值不为1,那就可以判断,w值一定不在集合中。
五、优点:
-
布隆过滤器只需要哈希表的1/8或1/4的大小
-
布隆过滤器的插入、查询时间都是常数O(k)
六、缺点:
无法从布隆过滤器中删除元素
七、python实现
# -*- coding: utf-8 -*-
from pybloom import BloomFilter
# capacity是数据集容量大小(n), error_rate是能容忍的误报率(P)
f = BloomFilter(capacity=1000, error_rate=0.001)
print f.add('dog') # 当不存在该元素,返回False
print f.add('cat') # 当不存在该元素,返回False
print f.add('fish') # 当不存在该元素,返回False
print f.add('pig') # 当不存在该元素,返回False
print f.add('cat') # 若存在,返回 True
print len(f) # 当前存在的元素个数
原文:https://mp.weixin.qq.com/s/SJSxQu0j_pyplzOBi_544g