BloomFilter&python支持
BloomFilter&python支持
BloomFilter
布隆过滤器是一种概率空间高效的数据结构。它与hashmap非常相似,用于检索一个元素是否在一个集合中。
它在检索元素是否存在时,能很好地取舍空间使用率与误报比例。即Bloom Filter是会误判的,它只会把不存在于集合中的元素误判成存在于集合中,而不会把存在于集合中的元素误判成不存在集合中。
正是由于这个特性,它被称作概率性数据结构(probabilistic data structure)。
BloomFilter原理
布隆过滤器维护一个N位的位数组,其中N是位数组的大小。它还有另一个参数k,表示使用哈希函数的个数。这些哈希函数用来设置位数组的值。当往过滤器中插入元素x时,h1(x), h2(x), ..., hk(x)所对应索引位置的值被置“1”,索引值由各个哈希函数计算得到。注意,如果我们增加哈希函数的数量,误报的概率会趋近于0.但是,插入和查找的时间开销更大,布隆过滤器的容量也会减小。
为了用布隆过滤器检验元素是否存在,我们需要校验是否所有的位置都被置“1”,与我们插入元素的过程非常相似。如果所有位置都被置“1”,那也就意味着该元素很有可能存在于布隆过滤器中。若有位置未被置“1”,那该元素一定不存在。
记录元素
下面我们看一下向Bloom Filter插入字符串的具体过,就是把这个字符串str经过K个不同的hash函数计算得到的结果h1、h2、、、hK。然后在BitArrray的第h1、h2、、、hK的位置上置1。

判断元素
那么如何判断一个字符串是否存在呢
把这个字符串经过K个hash函数计算得到h1、h2、、、hK,然后逐个判断BitArray的第h1、h2、、、hK个位置是否是1
应用场景
Google著名的分布式数据库Bigtable以及Hbase使用了布隆过滤器来查找不存在的行或列,以及减少磁盘查找的IO次数
文档存储检查系统也采用布隆过滤器来检测先前存储的数据
Goole Chrome浏览器使用了布隆过滤器加速安全浏览服务
垃圾邮件地址过滤
爬虫URL地址去重
解决缓存穿透问题
python支持库BloomFilter
from bloom_filter import BloomFilter bloombloom = BloomFilter(max_elements=10000, error_rate=0.1)
# max_elements是布隆过滤器的容积,最多可以记录多少元素
# error_rate是错判率 # 向bloom添加元素
bloombloom.add('https://www.tianyancha.com/company/23402373')
bloombloom.add('https://www.tianyancha.com/company/23402372')
bloombloom.add('https://www.tianyancha.com/company/2340231')
bloombloom.add('https://www.tianyancha.com/company/23402')
bloombloom.add('https://www.tianyancha.com/company/234')
bloombloom.add('https://www.tianyancha.com/company/234023')
#判断URL是否在bloombloom.__contains__('https://www.tianyancha.com/company/23402373')
print(bloombloom.__contains__('https://www.tianyancha.com/company/23402373'))
s1 = 'https://www.tianyancha.com/company/23402373'
s2 = ""
print(s1 in bloombloom)
print(s2 in bloombloom)
结果:
True
True
False
优点:
1.全量存储但是不存储元素本身,在某些对保密要求非常严格的场合有优势
2.空间高效率
3.插入/查询时间都是常数O(k),远远超过一般的算法
缺点:
1.存在误算率(False Positive),随着存入的元素数量增加,误算率随之增加
布隆过滤器能确保某个元素“肯定不存在”,但是对于一些元素的判断会是“可能存在”
2.一般情况下不能从布隆过滤器中删除元素
3.数组长度以及hash函数个数确定过程复杂
4.无法得到元素本身
布隆过滤器并不会保存插入元素的内容,只能检索某个元素是否存在
BloomFilter&python支持的更多相关文章
- Linux下安装OpenCV+Python支持
以下说明在Linux下Python和OpenCV结合安装的过程,Python要使用OpenCV模块,则必须导入OpenCV提供的包,所以要提供Python支持,首先在安装OpenCV前安装必要的组件, ...
- 【转】Windows下使用VS2008编译OpenCV 2.1 添加Intel TBB和Python支持
Windows下使用VS2008编译OpenCV2.1 添加Intel TBB和Python支持 步骤: 1.仔细阅读OpenCV官网上的InstallGuide:http://opencv.will ...
- 多进程IPC与Python支持
多进程IPC与Python支持 linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因 ...
- python面试题之Python支持什么数据类型?
所属网站分类: 面试经典 > python 作者:外星人入侵 链接:http://www.pythonheidong.com/blog/article/67/ 来源:python黑洞网,专注py ...
- 开启VIM的Python支持
开启VIM的Python支持 2015年01月03日 02:57:58 forlong401 阅读数:16294更多 个人分类: VIPython http://www.tuicool.com/a ...
- LD_PRELOAD的妙用,让python支持自己编译的Sqlite
LD_PRELOAD的妙用,让python支持自己编译的Sqlite LD_PRELOAD=/usr/local/sqlite/lib/libsqlite3.so.0 python3 -c " ...
- Vim 8.0 版本安装方法及添加Python支持
利用Git安装 最简单也是最有效的方法 1. 获取Vim仓库: git clone https://github.com/vim/vim.git 2. 升级到最新的版本: cd vim git pul ...
- 卧槽,好强大的魔法,竟能让Python支持方法重载
1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...
- Python支持中文注释
三处设置,使Python的Eclipse开发环境(使用PyDev)支持中文 - (a)Eclipse的Window菜单Editors设置: Eclipse工具条 -> Window -> ...
随机推荐
- Who is better?
徐州网络赛A 所谓斐波那契博弈 考场推了个假规律自闭== import java.math.BigInteger; import java.util.ArrayList; import java.ut ...
- Oracle-SYSTEM表空间突然持续爆满
一般情况下,我们建完数据库后,都会给数据库指定一个新的默认表空间,不然会占用数据库系统表空间资源,导致数据库性能下降. 我们可以同过SQL语句找出改表空间占用空间前10的对象 SELECT * FRO ...
- js 扫码枪的输入
关于js 获取扫码枪的输入获取方式,之前在网上搜了好多,都是大同小异的,都是说扫码枪输入的时间间隔不会超过30毫秒.但事实上我拿了几台电脑测试的结果是,有的时间间隔甚至超过了100毫秒,所以用时间间隔 ...
- SecureCRT通过密钥登录
转载 https://blog.csdn.net/langkeziju/article/details/53024031 说明:一般的密码方式登录容易被密码暴力破解.所以一般我们会将 SSH 的端口 ...
- EasyHook
EasyHook实用指南 所谓实用指南就是全是干货,没那么多虚头巴脑的东西,真正要用的人会发现对自己有用的东西,浅尝辄止的人看起来会不知所云. FileMon自己实做的过程中遇到的问题: 1. exe ...
- Struts2测试题
今天给大家看一套我最近做的一套关于Struts2的题: 1.以下关于jQuery说法错误的选项是( D ). A.“$”为jQuery脚本库的默认全局变量名,即“$” = “jQuery” B.$.a ...
- 六:flask-自定义URL转换器
flask进行url参数匹配的时候,是继承的werkzeug.routing.BaseConverter库进行重写的 导入看源码 里面有所有的URL参数数据类型的判断 也就是说,可以继承过后实现自己的 ...
- Selenium学习之==>18种定位方式的使用
Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装 单数形式8种 # 1.id定位 al = driver.find_element_by_id('i1') ...
- windows 的cmd设置代理的问题
今天给公司一同事用cmd来安装gulp(npm install -g gulp), 死活安装不上,一直报一大堆的错误:经仔细查阅是代理的问题,故总结如下: 若公司的电脑是通过设置代理来访问外网,则需要 ...
- centos7配置NTP时间服务器
Network Time Protocol--NTP时间服务器,用来同步网络中各个计算机时间的协议. 通常将一台服务器配置为时间服务器,然后集群内其他服务器都来同步这台服务器的时间. 目的:集群内所有 ...