bloom filter(布隆过滤器)

今天中邪了, 觉得看看bloom filter。 看看海量数据处理的经典算法。

这是1970年提出来。  是用于检测一个元素是不是一个集合的成员。 如果检测结果为True, 则该元素不一定在该集合中。 如果检测结果为False, 表明该元素一定在这个集合中。 这说明bloom filter 具有 100%的召回率。 每个检测请求返回的结果只有两种, 也就是“在集合内(可能错误)” 和 “绝对不在集合内”。 可见bloom filter 牺牲了正确率和时间, 换取空间的节省。

bloom filter的优点在于它的插入和查询元素均是常数的时间。但是当插入的元素越多, 判错的可能性就越大(false positive)。

下面给出简单的解释:

输入:

x: 一个要查询的元素。

S: a set of element(被查的集合)

输出:

--True if x in S

--False if x not in S

举一个例子: x = cow, S = {tree, cow, bird}

Q: x(cow)在集合中吗

bloom filter: 包含一个vector of n boolean values(或者是bit vector), 最开始这个vector的所有的集合均为false。  另外还包含k个独立的hash funcition: H0, H1, H2, .... Hk-1, 这些hash 函数给出的值域均在(0, 1, 2, 。。,  n -1)。
例如, H0(cow)∈(0, 1, 2, 。。,  n -1)。

对于S中的每一个元素s, 我们把vector 在H0(s), H1(s)......, Hk-1(s)的位置处均设置为True。  注意, 可能某一个位置可能会设置好多次的True。

下面我们计算false positive的概率:

注意, 刚开始, S = {A, G }, x= K, 我们要判断K是否在S中的时候, 就出现了false positive。

接下来, 化简得到:

求解如下:

我们的目的就是是p(false positive)越小越好。 有如下公式:

时间: 2024-12-13 06:48:36

bloom filter(布隆过滤器)的相关文章

Bloom Filter布隆过滤器

http://blog.csdn.net/pipisorry/article/details/64127666 Bloom Filter简介 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定

Bloom filter(布隆过滤器)概念与原理

写在前面 在大数据与云计算发展的时代,我们经常会碰到这样的问题.我们是否能高效的判断一个用户是否访问过某网站的主页(每天访问量上亿)或者需要统计网站的pv.uv.最直接的想法是将所有的访问者存起来,然后每次用户访问的时候与之前集合进行比较.不管是将访问信息存在内存(或数据库)都会对服务器造成非常大的压力.那是否存在一种方式,容忍一定的错误率,高效(计算复杂度.空间复杂度)的实现访问量信息的跟踪.统计呢?接下来介绍的布隆过滤器(BloomFilter)就可以满足当前的使用场景(注释:基数计数法同样

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

Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识别率(false positive),即布隆过滤器报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但是没有错误识别的情形(false negative),即如果某个元素确实没有在该集合中,那么布隆过滤器是不会报告该元素存在于集合中的,没有漏报的情形出现,召回率为百分之百. 算法描述 布隆过

Bloom Filter(布隆过滤器)原理

Bloom Filter(布隆过滤器)主要用于判断某个元素是否属于集合内,但是这种判断不是一定正确的. 经典问题: 假设你有数量非常庞大的URL集合,现在给你一个新的URL,要你快速判断这个URL是否在上述的URL集合中. 解决这个问题比较原始的方法是:先用一个数组把所有URL存起来,然后再扫描这个数组,判断里面是否有元素与新的这个URL相同.这样做会耗费非常大的空间和时间,是非常不妥的一种做法. 另一种非常快速的方法就是使用布隆过滤器了.如果布隆过滤器说一个元素在某个集合内,那么这个元素是很有

【redis】redis添加bloom filter布隆过滤器插件

前言 redis在4.0版本以后可通过插件的形式添加布隆过滤器,以下为具体操作. 操作 在https://github.com/RedisBloom/RedisBloom下载最新的release源码,在编译服务器进行解压编译: tar zxvf RedisBloom-1.1.1.tar.gz cd RedisBloom-1.1.1 make 得到动态库rebloom.so 启动redis时,如下启动即可加载bloom filter插件 ./redis-server /usr/local/redi

Bloom filters 布隆过滤器

在ITPUB上看到有人写到同一条语句连续执行两次,得出的结果截然不同,数据本身没有发生变化,关掉dynamic_sampling功能,多次查询结果是正常的.究竟是为什么? oracle通过内部函数使用布隆过滤对并行JOIN进行过滤.但是布隆过滤的精确度是依赖hash函数的好坏以及使用的hash函数数量决定的.你试试将_bloom_filter_enabled设为FALSE关掉布隆过滤:或者将_bloom_vector_elements设为一个稍大的数字.SQL> alter session se

布隆过滤器(Bloom Filter)的原理和实现

什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能 这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中? 常规思路 数组 链表 树.平衡二叉树.Trie Map (红黑树) 哈希表 虽然上面描述的这几种数据结构配合常见的排序.二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求.但是当集合里

[转载] 布隆过滤器(Bloom Filter)详解

转载自http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一

Bloom Filter(布隆过滤器)

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制矢量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难. 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路.但是随着集合中元素的增加,我们需要的存储空间越来越大.同时检索速度也越来