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. window.location.href 兼容性问题 (ie 浏览器下设置失效)

    window.location.href 兼容性问题 (ie 下设置失效) window.location.href = "../index.html" (ie 浏览器失效) wi ...

  2. Selenium-webdriver+八种元素定位

    进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素 ...

  3. 【Django】搭建Django administration并登录

    Python自带一个后台管理系统,这个后台管理系统搭建与登陆呢? 新建项目Django_Admin 文件结构目录如下: 创建APP 在pycharm下方的terminal终端中输入命令: python ...

  4. linux下libusb的安装与测试

    0.libusb的介绍:参考[1] 1.环境:vmware_fedora_10(linux-2.6.x) 2.获取源代码:http://sourceforge.net/projects/libusb/ ...

  5. node.js npm 操作 模块化开发 cnpm镜像安装

    模块(包) 传统引入 js 的缺点 整个网页,我们写了一个 js 文件,所有的特效都在里面 耦合度太高,代码之间关联性太强,不便于后期维护 变量容易 全局污染 如果将 复杂的 js 文件,拆成多个功能 ...

  6. 字符串在PHP比较运算中的变化

    由于PHP的弱类型性质,你可以做一些奇怪的事情,其中​​一些是好的,其中一些将使你掉到坑里面去.比如: ;   if ( $a == true && $b == false & ...

  7. 代码测试:unsigned char*图像数据转换成OpenCV中Mat类型

    直接使用Mat的构造函数,把指针的位置赋给下面中的data就OK了: Mat(int rows, int cols, int type, void* data, size_t step=AUTO_ST ...

  8. SpringIOC容器创建过程

    在测试时,经常使用这种方式来创建spring容器 //创建基于注解的springIOC容器 ApplicationContext applicationContext = new Annotation ...

  9. 阶段3 1.Mybatis_03.自定义Mybatis框架_7.自定义Mybatis的编码-实现基于注解配置的查询所有

    注解的方式,这里进行修改.上面注释的是原来xml的方式. 在dao类里面加上注解 创建注解类 声明注解的生命周期为Runntime 改变注解出现的位置,在Mehtod方法上 写完之后这里就不报错了. ...

  10. oracle 日期格式操作

    原文转自:http://hi.baidu.com/gzfvb/blog/item/5062b7f008eb70a8a50f5206.html   Oracle日期格式:   to_date(" ...