布隆过滤器(Bloom Filter)是什么、作用、原理

一、组成:

  • 一个很长的二进制向量(集合)

  • 多个映射函数

二、作用

判断某个元素一定不在集合内可能在集合内

三、背景:

集合中元素增加,所需存储空间和查询时间都会增加。比如邮件服务商存储垃圾邮件账号,一个亿的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

猜你喜欢

转载自blog.csdn.net/u013288190/article/details/125750092
今日推荐