布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识别率(false positive),即布隆过滤器报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但是没有错误识别的情形(false negative),即如果某个元素确实没有在该集合中,那么布隆过滤器是不会报告该元素存在于集合中的,没有漏报的情形出现,召回率为百分之百。
 
算法描述
 
布隆过滤器实际上是一个位数组,元素数目为m,初始状态全部为0,还需要k个不同的哈希函数,每个哈希函数必须保证以统一的随机分布算法将给定的元素映射到位数组的某个位置上(1~m)。
 
添加元素至布隆过滤器中时,布隆过滤器并不会实际保存该元素数据,而是将该元素通过k个不同的哈希函数分别映射为k个位数组位置(1~m),然后将位数组对应k个位置的值设为1,此时表示该元素已存在于“集合”中。
 
检查元素是否存在于“集合”中时,同样将该元素通过k个不同的哗然函数映射为位数组的k个位置(1~m),如果位数组中某个位置对应的值为0,表示该元素不存在于“集合中”;如果位置中的这些位置对应的值全部为1,则有两种情况:
 
(1)该元素存在于“集合”中
(2)发生错误识别(false positive),即该元素实际并不存在于“集合”中
 
在一个简单布隆过滤器的实现中是没有方法可以区别这两种情况的。
 
如上图所示,布隆过滤器的位数组大小为18,哈希函数个数为3,集合中一共有三个元素{x,y,z},分别被映射到位数组上的不同位置(每个集合元素的映射由位数组上的有一个位置(值)表示)。现在判断元素w是否存在于该集合中,首先通过布隆过滤器的3个哈希函数得到位数组中三个位置坐标,然后判断位数组中这三个位置上的值是否全为1,由上图可知,有一个位置的对应值不为1,因此元素w不存在于该集合中。
 
简单布隆过滤器(位数组只有0和1两种状态)的实现不支持从集合中删除元素,因为删除元素意味着将位数组相应位置(由元素值通过哈希函数得出)的值全部置为0,但是简单布隆过滤器没有方法判断这些位置(值)是否被集合中的其它元素所使用,如果将正在被其它元素所使用的位置(值)置为0则会导致false negative出现,即元素实际存在于集合中,布隆过滤器却报告不存在。
 
关键实现
 
简单布隆过滤器实现涉及三个重要属性:位数组、哈希函数、误识别率。
 
假设位数组大小为m、集合元素数组为n、哈希函数个数为k、误识别率为p,则有以下公式:
 
以上关于布隆过滤器的介绍仅限于简单布隆过滤器,复杂实现及相应公司推导请参数http://en.wikipedia.org/wiki/Bloom_filter。

Bloom Filter(布隆过滤器)的更多相关文章

  1. Bloom Filter 布隆过滤器

    Bloom Filter 是由伯顿.布隆(Burton Bloom)在1970年提出的一种多hash函数映射的快速查找算法.它实际上是一个很长的二进制向量和一些列随机映射函数.应用在数据量很大的情况下 ...

  2. 【转】Bloom Filter布隆过滤器的概念和原理

    转自:http://blog.csdn.net/jiaomeng/article/details/1495500 之前看数学之美丽,里面有提到布隆过滤器的过滤垃圾邮件,感觉到何其的牛,竟然有这么高效的 ...

  3. 海量信息库,查找是否存在(bloom filter布隆过滤器)

    Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...

  4. Bloom Filter布隆过滤器原理和实现(1)

    引子 <数学之美>介绍布隆过滤器非常经典: 在日常生活中,包括设计计算机软件时,经常要判断一个元素是否在一个集合中.比如: 在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它 ...

  5. Bloom Filter(布隆过滤器)的概念和原理

    Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数.将hash函数对应的值的位数组置1,查找时 ...

  6. 硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战

    在Redis 缓存击穿(失效).缓存穿透.缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」. 码哥,布隆过滤器还能在哪些场景使用呀? 比如我们使用「码哥跳动」开发的「明日头条」APP 看 ...

  7. 大数据处理算法--Bloom Filter布隆过滤

    1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bloom Filter(BF)是一种空间效率很 ...

  8. 浅谈布隆过滤器Bloom Filter

    先从一道面试题开始: 给A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL. 这个问题的本质在于判断一个元素是否在一个集合中.哈希表以O(1) ...

  9. 布隆过滤器 Bloom Filter 2

    date: 2020-04-01 17:00:00 updated: 2020-04-01 17:00:00 Bloom Filter 布隆过滤器 之前的一版笔记 点此跳转 1. 什么是布隆过滤器 本 ...

  10. 布隆过滤器redis缓存

    Bloom Filter布隆过滤器算法背景如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构 ...

随机推荐

  1. pat 1060. Are They Equal (25)

    题目意思直接,要求将两个数转为科学计数法表示,然后比较是否相同  不过有精度要求 /* test 6 3 0.00 00.00 test 3 3 0.1 0.001 0.001=0.1*10^-2 p ...

  2. NSDateFormatter 格式说明

    格式化参数如下:    G: 公元时代,例如AD公元    yy: 年的后2位    yyyy: 完整年    MM: 月,显示为1-12    MMM: 月,显示为英文月份简写,如 Jan    M ...

  3. 《Android开发艺术探索》读书笔记 (11) 第11章 Android的线程和线程池

    第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界 ...

  4. 大牛对ACM入门菜鸟的一些话

    首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实 ...

  5. 第二部分面向对像基础第五章Strng类中方法的使用

    package com.java.oop.day2; import java.util.Calendar; import java.util.Formatter; import java.util.L ...

  6. (转)教你如何使用php session

    学会php session可以在很多地方使用,比如做一个后台登录的功能,要让程序记住用户的session,其实很简单,看了下面的文章你就明白了.     PHP session用法其实很简单它可以把用 ...

  7. 01-android快速入门

    adb Android debug bridge 安卓调试桥 创建模拟器,屏幕尽量小些,启动速度运行速度快 Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R ...

  8. 【C#学习笔记】一、基础知识

    1.1数据类型(P43) 类型 别名 允许的值 sbyte System.SByte -128~127 byte System.Byte 0~255 short System.Int16 -32768 ...

  9. Ext Sencha Cmd 6 环境安装

    Sencha Cmd安装笔记 在使用前端框架ExtJs前,需对其环境加以部署,对自己的安装过程加以记录. 建议大家在安装时,最好使用VPN,个中缘由,生在跳槽的程序袁应该都懂吧.不然ruby相关命令执 ...

  10. PAT-1041 Be Unique

    Being unique is so important to people on Mars that even their lottery is designed in a unique way. ...