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支持的更多相关文章

  1. Linux下安装OpenCV+Python支持

    以下说明在Linux下Python和OpenCV结合安装的过程,Python要使用OpenCV模块,则必须导入OpenCV提供的包,所以要提供Python支持,首先在安装OpenCV前安装必要的组件, ...

  2. 【转】Windows下使用VS2008编译OpenCV 2.1 添加Intel TBB和Python支持

    Windows下使用VS2008编译OpenCV2.1 添加Intel TBB和Python支持 步骤: 1.仔细阅读OpenCV官网上的InstallGuide:http://opencv.will ...

  3. 多进程IPC与Python支持

    多进程IPC与Python支持 linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因 ...

  4. python面试题之Python支持什么数据类型?

    所属网站分类: 面试经典 > python 作者:外星人入侵 链接:http://www.pythonheidong.com/blog/article/67/ 来源:python黑洞网,专注py ...

  5. 开启VIM的Python支持

    开启VIM的Python支持 2015年01月03日 02:57:58 forlong401 阅读数:16294更多 个人分类: VIPython   http://www.tuicool.com/a ...

  6. LD_PRELOAD的妙用,让python支持自己编译的Sqlite

    LD_PRELOAD的妙用,让python支持自己编译的Sqlite LD_PRELOAD=/usr/local/sqlite/lib/libsqlite3.so.0 python3 -c " ...

  7. Vim 8.0 版本安装方法及添加Python支持

    利用Git安装 最简单也是最有效的方法 1. 获取Vim仓库: git clone https://github.com/vim/vim.git 2. 升级到最新的版本: cd vim git pul ...

  8. 卧槽,好强大的魔法,竟能让Python支持方法重载

    1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...

  9. Python支持中文注释

    三处设置,使Python的Eclipse开发环境(使用PyDev)支持中文 - (a)Eclipse的Window菜单Editors设置: Eclipse工具条 -> Window -> ...

随机推荐

  1. 苹果cms开启防红跳转后,提示模板文件不存在解决方法

    1,苹果cms开启防红跳转后,提示模板文件不存在(如下图)这是因为你使用的模板里面缺少苹果cms自带的防红跳转模板导致,遇到这种状况后需要把苹果cms默认自带的( template/default_p ...

  2. React 项目使用 React-router-dom 4.0 以上版本时使用 HashRouter 怎么控制 history

    不添加 history 时,来回点击 Link 会在控制台报错如下 Warning: Hash history cannot PUSH the same path; a new entry will ...

  3. ApiException

    ApiException 用于在catch中throw 异常,可以添加异常信息, throw new ApiException("线下绑卡异常!"); public class A ...

  4. Oracle-SQL程序优化3

    最近一个星期ETL无论在凌晨或是在中午的JOB执行过程中经常卡住,导致不能按时完成系统引擎的运行,对业务产生影响. 通过生成AWR报告,发现有三条SQL消耗大量的CPU,而且还没有执行完成被终止的.如 ...

  5. 图的普里姆(Prim)算法求最小生成树

    关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...

  6. legend3---Homestead常用操作代码

    legend3---Homestead常用操作代码 一.总结 一句话总结: 在虚拟机里面改变文件windows里面也会变,在windows里面改变虚拟机里面也会变,所以可以在windows里面编程或者 ...

  7. AI工程师职业规划和学习路线完整版

    AI工程师职业规划和学习路线完整版   如何成为一名机器学习算法工程师 成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能 力,这些能力中的每一项掌握起来都需要足够的努力 ...

  8. 四十、python中的生成器和迭代器

    A.生成器(包含yield的就是生成器) def func(): print(11) yield 1 print(22) yield 2 print(33) yield 3 print(44) yie ...

  9. Java定时器Timer

    Java定时器Timer在JDK库中,Timer类主要负责计划任务的功能,也就是在指定的时开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类,执行计划任 ...

  10. 使用 Dom4j 对XML操作!!!

    转自:http://blog.csdn.net/redarmy_chen/article/details/12969219 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件 ...