布隆过滤器

布隆过滤器的定义:

布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在 1970 年提出的,bloom过滤器由长度为m的位向量或位列表(仅包含0或1位值的列表)组成,最初所有值都设置为0。用于检查值“可能存在集合中”或绝对不存在集合中。存在一定误判率。
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

布隆过滤器的原理解析

如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。

链表、树、散列表(哈希表)等等数据结构都是这种思路,但是随着集合中元素的增加,需要的存储空间越来越大;同时检索速度也越来越慢,检索时间复杂度分别是O(n)、O(log n)、O(1)。

布隆过滤器的原理是,当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组(Bit array)中的 K 个点,把它们置为 1 。检索时,只要看看这些点是不是都是1就知道元素是否在集合中;如果这些点有任何一个 0,则被检元素一定不在;如果都是1,则被检元素很可能在(之所以说“可能”是误差的存在)。

bloom过滤器基本上由长度为m的位向量或位列表(仅包含0或1位值的列表)组成,最初所有值都设置为0,如下所示。
在这里插入图片描述
为了向bloom过滤器添加一个项目,我们将其馈送到k个不同的哈希函数,并在结果位置将位设置为“1”。如您所见,在哈希表中,我们将使用单个哈希函数,结果只得到一个索引作为输出。但在bloom过滤器的情况下,我们将使用多个哈希函数,这将为我们提供多个索引。
在这里插入图片描述
正如您在上面的示例中所看到的,对于给定的输入“geeks”,我们的3个哈希函数将给出3个不同的输出 — 1、4和7。我们已经做了标记。
**加粗样式**
对于另一个输入“nerd”,散列函数给出了3、4和5。你可能已经注意到索引“4”已经被之前的“geeks”输入标记了。稍等,这一点很有趣,我们将很快讨论。

我们已经用两个输入填充了位向量,现在我们可以检查它是否存在。我们怎么能做到?

容易的就像我们在哈希表中做的那样。我们将用3个散列函数对“搜索的输入”进行散列,并查看结果索引所包含的内容。

在这里插入图片描述

所以,在搜索“cat”时,我们的散列函数会给出1、3和7。我们可以看到,所有的索引都已经标记为1。这意味着我们可以说,“也许‘猫’已经出现在我们的名单上了”。但事实并非如此。那么,出了什么问题?

事实上,没出什么问题。问题是,这是“假阳性”的情况。Bloom filter告诉我们,似乎之前已经插入了“cat”,因为应该用“cat”标记的索引已经被标记(尽管是用其他不同的数据)。

那么,如果是这样的话,它有什么帮助呢?那么,让我们考虑一下,如果“猫”会给我们1, 6, 7的输出,而不是1, 3, 7,那么会发生什么呢?我们可以看到,在3个索引中,6是“0”,这意味着它没有被之前的任何输入标记。这意味着显然“cat”以前从未插入过,如果是的话,6不可能是“0”,对吗?这就是bloom filter如何判断数据是否不在列表中。

如果我们搜索一个值,看到该值的任何哈希索引都是“0”,那么该值肯定不在列表中。

如果所有散列索引都是“1”,那么“maybe”搜索的值在列表中。

布隆过滤器的实战

方式1、手写布隆过滤器

方式2、redis实现

方式3、Google guava实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值