我的编程空间,编程开发者的网络收藏夹
学习永远不晚

布隆过滤器,你用对了吗?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

布隆过滤器,你用对了吗?

工作原理

(1) 初始化:布隆过滤器初始化时,创建一个长度为m的位数组(bit array),所有位初始化为0,并选择k个独立的哈希函数。

(2) 添加元素:将一个元素添加到布隆过滤器时,使用k个哈希函数对该元素进行哈希运算,得到k个哈希值(位置)。然后,将位数组中这k个位置的值设为1。

(3) 检查元素:要检查一个元素是否在布隆过滤器中,同样使用k个哈希函数对该元素进行哈希运算,得到k个哈希值(位置)。检查位数组中这k个位置的值:

  • 如果所有位置的值都是1,则判断该元素可能在集合中。
  • 如果有一个位置的值是0,则判断该元素肯定不在集合中。

示例展示

首先,一个空的布隆过滤器是一个 m 位的位数组,所有位都设置为零,如下所示:

我们需要使用 k个哈希函数来计算给定输入的哈希值。当我们想要将一个项目添加到过滤器中时,会设置索引h1(x)、h2(x)、… hk(x)处的位,其中索引是使用哈希函数计算的。例如,假设我们想要将“java”输入过滤器,我们使用3个哈希函数和一个长度为10的位数组,初始时所有位都设置为0。首先我们将计算哈希值如下:

h1(“java”) % 10 = 1
h2(“java”) % 10 = 4
h3(“java”) % 10 = 7

注意:这些输出仅用于解释。然后我们会将索引1、4和7处的位设置为1:

再次,我们想要输入“python”,同样地,我们将计算哈希值:

h1(“python”) % 10 = 3
h2(“python”) % 10 = 5
h3(“python”) % 10 = 4

将索引3、5和4处的位设置为1,如下图:

现在,如果我们想要检查“java”是否存在于过滤器中。我们将执行相同的过程,但这次是反向的。我们使用h1、h2和h3计算相应的哈希值并检查这些索引处的所有位是否都设置为1。如果所有位都设置为1,我们可以说“java”可能存在。如果这些索引处的任一位为0,则“java”肯定不存在。

为什么说:如果所有位都设置为1,我们可以说“java”可能存在?为什么有这种不确定性。让我们通过一个例子来理解这一点。假设我们想要检查“rust”是否存在,将使用h1、h2和h3计算哈希值:

h1(“rust”) % 10 = 1
h2(“rust”) % 10 = 3
h3(“rust”) % 10 = 7

如果我们检查位数组,这些索引处的位都设置为1,但我们知道“rust”从未被添加到过滤器中。索引1和7处的位是在我们添加“java”时设置的,索引3处的位是在我们添加“rust”时设置的。

因此,由于计算出的索引处的位已经被其他项目设置,布隆过滤器错误地声称“rust”存在,并生成了一个假阳性结果。根据应用程序的不同,这可能是一个巨大的缺点或者是相对可以接受的。

优缺点

优点:

  • 空间效率高:相比其他数据结构如哈希表,布隆过滤器的空间利用率非常高。
  • 查询速度快:查询操作只需要进行k次哈希运算和k次数组访问,速度非常快。
  • 插入操作高效:插入操作同样只需要进行k次哈希运算和k次数组访问,效率高。

缺点:

  • 误判率:布隆过滤器可能会误判,即可能会错误地认为某个元素在集合中(假阳性),但不会出现假阴性(即不存在的元素被误判为存在)。
  • 无法删除元素:标准的布隆过滤器不支持删除操作,因为删除操作可能会影响其他元素的查询结果。不过,可以使用计数布隆过滤器(Counting Bloom Filter)来支持删除操作。
  • 哈希函数选择:需要选择合适的哈希函数,以保证哈希值均匀分布,避免过多的冲突。

使用场景

  • 网页去重:在搜索引擎中,布隆过滤器可以用于判断网页是否已经被抓取过,从而避免重复抓取。
  • 缓存系统:在分布式缓存系统中,布隆过滤器可以用于快速判断某个数据是否在缓存中,从而减少对后端数据库的查询压力。
  • 垃圾邮件过滤:在邮件系统中,布隆过滤器可以用于快速判断邮件是否为垃圾邮件,提高过滤效率。
  • 数据库查询优化:在数据库系统中,布隆过滤器可以用于快速判断某个记录是否存在,从而减少磁盘I/O操作,提高查询效率。

总结

布隆过滤器是一种简单但非常有效的数据结构,特别适用于大规模数据的快速查找和去重等场景。尽管它有一定的误判率,但在很多应用中,这一点点误判是可以接受的。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

布隆过滤器,你用对了吗?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

布隆过滤器,你用对了吗?

布隆过滤器是一种简单但非常有效的数据结构,特别适用于大规模数据的快速查找和去重等场景。

什么是布隆过滤器?你学会了吗?

在对响应时间要求比较严格的情况下,如果我们有里面,那么随着集合中元素数量的增加,我们需要的存储空间越来越大,检索时间也越来越长,导致内存过多开销和时间效率变低。

你了解布隆过滤器的“大家族”吗?

布隆过滤器(Bloom Filter)是1970年由伯顿·霍华德·布隆(Burton Howard Bloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。

Java中的布隆过滤器你真的懂了吗

经常会听到大家说起布隆过滤器,但是很多人都只是听过名字,却并不知道其是怎么实现的。下面将详细介绍一下布隆过滤器,并且使用简单的代码演示
2023-05-18

Java中的布隆过滤器,你知道吗?

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

Java布隆过滤器怎么使用

本文小编为大家详细介绍“Java布隆过滤器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java布隆过滤器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通常你判断某个元素是否存在用的是什么?很多
2023-06-29

布隆过滤器算法用于搜索

布隆过滤器是一种具有许多实际应用的数据结构。它可以在浏览器、网络路由器和数据库中找到。

C++ BloomFilter布隆过滤器如何应用

这篇“C++ BloomFilter布隆过滤器如何应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++ BloomFil
2023-07-05

redis布隆过滤器的作用是什么

Redis布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。它可以高效地判断一个元素是否可能在集合中,但无法确保元素一定在集合中或者排除元素已经在集合中。布隆过滤器通常用于减少对数据库的查询次数,节省资源和时间。常见的应用
redis布隆过滤器的作用是什么
2024-04-09

牛哄哄的布隆过滤器,有什么用?

日常开发中,大家经常使用缓存,但是你知道大型的互联网公司面对高并发流量,要注意缓存穿透问题吗?

C++BloomFilter布隆过滤器应用及概念详解

布隆过滤器是由布隆(BurtonHowardBloom)在1970年提出的一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中
2023-03-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录