当前位置:首页 >综合 >BloomFilter:如何在大规模数据集中进行快速搜索? 你需要输入一个电子邮件地址

BloomFilter:如何在大规模数据集中进行快速搜索? 你需要输入一个电子邮件地址

2024-06-30 20:48:36 [百科] 来源:避面尹邢网

BloomFilter:如何在大规模数据集中进行快速搜索?

作者:迷路的大规架构师 开发 架构 在设计应用程序时,我们经常会遇到这样的模数场景:检查某个元素是否存在于集合中。例如,据集当创建一个新的中进电子邮件帐户时,你需要输入一个电子邮件地址。行快系统会告诉你电子邮件地址是速搜索否已被占用。如果已经参加,大规你将测试不同的模数,直到找到可用的据集。

在设计应用程序时,中进我们经常会遇到这样的行快场景:检查某个元素是否存在于集合中。例如,速搜索当创建一个新的大规电子邮件帐户时,你需要输入一个电子邮件地址。模数系统会告诉你电子邮件地址是据集否已被占用。如果已经参加,你将测试不同的,直到找到可用的。

在后端,系统会根据数百万个现有电子邮件地址检查你的电子邮件地址,以检查是否存在匹配项。并且系统会在几分之一秒内回答你。传统的索引线性搜索无法快速给出结果。哈希映射可以完成这项工作,但它会占用大量内存空间。

BloomFilter:如何在大规模数据集中进行快速搜索? 你需要输入一个电子邮件地址

布隆过滤器是上述用例的最佳解决方案。它的最佳场景实践如下:

BloomFilter:如何在大规模数据集中进行快速搜索? 你需要输入一个电子邮件地址

  • 需要快速检查某个项目是否在列表中。
  • 列表很大,内存空间有限。

什么是布隆过滤器?

布隆过滤器(Bloom filter)是一种概率数据结构,由 Burton Howard Bloom 于 1970 年设计,用于检查元素是否是集合的成员。

BloomFilter:如何在大规模数据集中进行快速搜索? 你需要输入一个电子邮件地址

布隆过滤器提供的快速查找有一个陷阱——误报。误报是指集合中不存在某个元素,但系统告诉你它存在的情况。不过误报的概率通常比较低。

布隆过滤器如何工作?

布隆过滤器是m位的位向量,最初全部设置为 0。

例如,下面是一个 12 位布隆过滤器。所有位最初都是 0。位下方的数字表示该位的索引。索引从 0 开始到m-1(在本例中为 11)。

要将元素添加到布隆过滤器,我们需要k个哈希函数。每个要加入布隆过滤器的元素都会经过k个哈希函数,得到k个固定大小的哈希值。

接下来,我们对每个哈希值(在我们的例子中是哈希值 % 12 )取m的模,以获得小于或等于 m-1 的索引。通过操作获得的索引中存在的位在位向量中设置为 1。使用相同的方法继续将每个元素添加到布隆过滤器。

除了向过滤器添加元素外,我们还可以检查它们是否存在与过滤器中。为了检查元素是否存在,我们使用与上述相同的过程对元素执行哈希和取模。获得索引后,检查这些索引中存在的位的值,以推断该元素是否存在。通过下面的示例,来更好地理解这个概念。

请注意,你只能将元素添加到布隆过滤器或检查元素是否存在与过滤器中。添加后,无法从过滤器中删除元素。

例子

假设我们有一个 12 位布隆过滤器和 3 个哈希函数 h1(x)、h2(x)、h3(x)。首先,我们将向布隆过滤器添加元素。接下来,我们将检查过滤器中是否存在元素。

向过滤器添加元素

把字符串“white”添加到空的布隆过滤器中。

将它提供给我们示例中的三个哈希函数,并取 12 的模作为结果,如下:

将索引 2、10 和 7 处的位设置为 1。布隆过滤器将变成这样:

接下来,添加另一个元素“blue”。

将字符串提供给三个散列函数并取模,我们得到另外 3 个要设置的索引:

索引 4、1 和 11 处的位也将设置为 1。现在布隆过滤器如下所示:

检查元素是否在过滤器中

现在我们的布隆过滤器有一些元素(本例中为“white”和“blue”)。让我们检查集合中是否存在元素“purple”。

对“purple”执行相同的操作,找到它的哈希值并取模:

检查上面计算的索引处的位值。如果所有三个索引的位都是 1,我们可以说过滤器中可能存在“purple”。如果这些索引处的至少一位为 0,我们可以说过滤器中不存在“purple”。

由于上图中索引 6 和 9 的位为 0,我们知道“purple”不在过滤器中。

接下来,我们检查过滤器中是否有“blue”。

对“blue”执行哈希函数和取模来获得索引:

接下来,检查上述索引处的位值:

所有三个位置的位都已设置,那么元素“blue”可能出现在过滤器中。

布隆过滤器为什么会出误报?

我们之前提到布隆过滤器有时会给出误报结果。这就是为什么如果布隆过滤器在检查元素是否存在时给出肯定结果,我们只能说元素“可能”存在于集合中。为什么这样?为什么结果不是 100% 准确?

让我们用一个例子来证明一下。

布隆过滤器中有“white”和“blue”两个元素时,状态如下:

让我们检查一下过滤器中是否存在“black”。对“black”进行哈希和取模,如下:

接下来,检查布隆过滤器中索引 11、7 和 1 处的内容。

可以看到,所有三个索引处的位均是1。所以布隆过滤器告诉我们集合中可能存在“black”。

但是,由于我们只向过滤器添加了“white”和“blue”,我们一开始就知道“black”不存在!因此布隆过滤器在这种情况下给出了“误报”。

产生误报的过程是这样的:当“white”被添加到过滤器时,索引 7 的位被设置,而当“blue”被添加到过滤器时,索引 1 和 11 的位被设置。现在,当算法看到 11、7 和 1 的位已设置时,它判断“black”可能在过滤器中。

减少误报

如果应用程序需要较低的误报概率,可以通过一些方法来控制它。增加位数组的大小和散列函数的数量可以提高结果的效率并降低误报的概率。

然而,增加哈希函数的数量也会增加布隆过滤器的插入和查找操作的延迟。布隆过滤器的时间复杂度为 O(k),其中 k 是涉及的哈希函数的数量。

布隆过滤器的应用

作为一种可以快速检查元素成员关系且节省空间的数据结构,布隆过滤器具有众多应用。这里有些例子:

  • 缓存系统:在缓存系统中,布隆过滤器可以用来快速判断某个对象是否存在于缓存中,从而避免查询数据库或外部服务。
  • 网络爬虫:在网络爬虫中,布隆过滤器可以用来过滤已经抓取过的URL,从而避免重复抓取。
  • 反垃圾邮件:在反垃圾邮件系统中,布隆过滤器可以用来过滤已知的垃圾邮件地址,从而避免将邮件发送到这些地址。
  • 分布式系统:在分布式系统中,布隆过滤器可以用来维护分布式哈希表的键值对,从而避免向所有节点广播查询请求。
  • 数据库优化:在数据库中,布隆过滤器可以用来加速模糊查询,例如在大型电话号码列表中查找以特定数字开头的号码。

结论

到现在为止,希望你能更好地理解什么是简单的布隆过滤器、它是如何工作的,以及关于如何将其应用于现实生活用例的一些想法。基本设计可能会有所不同,具体取决于应用程序的要求。例如,计数布隆过滤器可以在需要删除元素的应用程序中实现。

责任编辑:华轩 来源: 今日头条 数据结构布隆过滤器开发

(责任编辑:娱乐)

    推荐文章
    • 少儿重疾险的最高保额是多少 少儿重疾险保额买多少合适?

      少儿重疾险的最高保额是多少 少儿重疾险保额买多少合适?在如今,少儿重疾险是比较受欢迎的,很多家长为了保障孩子的健康成长,都会购买少儿重疾险,那么少儿重疾险的最高保额是多少?少儿重疾险保额多少合适?下文就来带大家了解一下。少儿重疾险的保额一般在5~50万之 ...[详细]
    • 持续1个月,超8000+件新品打爆,抖音电商服饰行业的增量场

      持续1个月,超8000+件新品打爆,抖音电商服饰行业的增量场这是闺蜜间的常态——A:“逛街去吗?”B:“去啊,打算买一件T恤。你打算逛什么?”A:“没什么,就是想出门玩儿。”结果,A买了外套、T恤,B买了连衣裙。逛街,核心就在一个“逛”字,漫无目的与随心所欲才 ...[详细]
    • 《牧野之歌》抢先体验版现已上线!

      《牧野之歌》抢先体验版现已上线!《牧野之歌》抢先体验版现在推出啦!《牧野之歌》是一款3D视角的牧场游戏,由水滴工作室研发。大陆尽头的牧野镇受女神的余泽庇佑,让这片土地远离纷争,为这片土地带来丰饶。曾经是庇护所的牧野镇,在和平年代慢慢 ...[详细]
    • 知名品牌朕孩宝是如何在三年内创造出一个划时代精品的?

      知名品牌朕孩宝是如何在三年内创造出一个划时代精品的?朕孩宝,知名智能安全座椅品牌,隶属神工智能,专注于智能安全座椅领域,却在短短两三年的时间内奇迹般地创造出了一款可用称得上是划时代的新品类:智能子母安全座椅。纵观全球安全座椅行业的ISOFIX,及360 ...[详细]
    • 国家统计局:1

      国家统计局:111月15日,国新办举行新闻发布会介绍2021年10月份国民经济运行情况,国家统计局新闻发言人、国民经济综合统计司司长付凌晖介绍,固定资产投资平稳增长,高技术产业投资增势良好。1-10月份,全国固定资 ...[详细]
    • 卢伟冰发话:K50电竞版 骁龙8手机性价比之王

      卢伟冰发话:K50电竞版 骁龙8手机性价比之王2月份有很多搭载全新一代骁龙8处理器的旗舰新机发布,最有性价比的是哪一款呢?昨日晚间,Redmi总经理卢伟冰在其个人微博给出了答案,他称:“#K50电竞版#2022年搭载骁龙8处理器的旗舰性价比之王! ...[详细]
    • 官方预告来了!天玑8100明天见

      官方预告来了!天玑8100明天见2月28日消息,联发科官方微博今天带来了全新的天玑芯片预告:“天玑新品,明天见”结合时间来看,联发科将于明天发布的芯片就是天玑8000的升级款天玑8100了,该款处理器的主要竞品为骁龙888,采用的是 ...[详细]
    • 全球芯片需求下降 三星电子季盈利同比跌幅达96%

      全球芯片需求下降 三星电子季盈利同比跌幅达96%根据三星电子自己的初步估计,公司又迎来了一个糟糕的季度。这一次,公司警告说,与去年同期相比,季度营业利润下降了96%,比三个月前的三分之二暴跌还要糟糕。即使是新的Galaxy S23 系列的强劲销售也 ...[详细]
    • 中远海运全力畅通供应链物流 助力企业复工复产

      中远海运全力畅通供应链物流 助力企业复工复产面对疫情导致的运输挑战,中远海运快速开通“陆改水”“海铁联运”服务,全力畅通供应链物流,多措并举保障产业链运转顺畅的同时,助力企业复工复产。疫情期间,中 ...[详细]
    • 涉嫌侵犯隐私 加拿大对ChatGPT展开调查

      涉嫌侵犯隐私 加拿大对ChatGPT展开调查据报道,加拿大隐私专员办公室正调查 OpenAI 的生成式聊天应用 ChatGPT,因为该监督机构收到了一份投诉,指控 ChatGPT 在未经同意的情况下收集、使用和披露个人信息。加拿大隐私专员 Ph ...[详细]
    热点阅读