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

图解布隆过滤器和布谷鸟过滤器实现原理

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

图解布隆过滤器和布谷鸟过滤器实现原理

1、布隆过滤器

    布隆过滤器的原理是对一个key进行n个hash算法获取n个值,然后通过这些值在比特数组中将这n个值对应的bit位设为1,如下图所示的:

图片图片

    我们元数据通过两个哈希函数函数之后得到2和7两个值,然后将2和7这个两个值对应的bit位上的值设置为1,这样我们就将元数据存放到布隆过滤器上。

    查询元数据是否在布隆过滤器上的时候,我们一样对元数据进行两次哈希得到对应的哈希值,然后通过哈希值在布隆过滤器上寻找对应的bit位上的值是否都是1,可能有如下的情况:

(1)如果bit位上不都是1,说明当前元数据不在布隆过滤器上,如下所示:

图片图片

   (2)如果bit位上都是1,如下所示:

图片图片

    那么此时只能说明当前元数据可能在布隆过滤器上,因为布隆过滤器存在一定的误判,下面解释为什么bit位上全是1但是元数据不一定在布隆过滤器上,如下图所示:

图片图片

    元数据“龙虾”和元数据“编程”通过哈希函数添加到布隆过滤器上,但是元数据“龙虾编程”没有添加到布隆过滤器上。当我们通过哈希函数计算元数据“龙虾编程”的哈希值后,寻找对应bit位上的发现其值都是1,这就出现了误判的情况。为了减少布隆过滤器的误判率我们可以增加哈希函数的个数(如原来两个哈希函数,现在我们增加到4个哈希函数)。

    布隆过滤器存在一定的弊端,如不支持删除元素,一旦对位数组进行了赋值后无法将其删除,并且其空间利用率也是较低的。

2、布谷鸟过滤器

    布隆过滤器不支持删除元素,而布谷鸟过滤器支持删除元素、支持动态添加元素并且效率比布隆过滤器效果更高。

    布谷鸟过滤器底层是桶数组构成的,而且桶中可以通过参数来设置每个桶存储多少个元素,如下如所示的布谷鸟过滤器:

图片

   每个桶中有四个指纹位置,意味着一次哈希计算后布谷鸟有四个“巢“可用,而且四个巢是连续位置。桶中的元素不是我们的元数据,而是通过哈希函数生成bit位,这个bit位我们称之为指纹。

2.1 布谷鸟过滤器的桶位置计算函数

    布谷鸟过滤器的插入是通过两个不独立的哈希函数计算出当前元素需要存储到哪两个桶中,函数如下所示:

图片图片

    h1是直接通过hash函数得到一个下标,这就是第一个桶的位置;h2通过h1下标与前面的指纹值的哈希结果进行异或,这样就得到第二桶的位置。h1和h2是通过异或的关系得到,这样也是布谷鸟过滤器设计的精妙之处,我们通过一个桶的位置就可以计算出另一个桶的位置。

2.2 布谷鸟过滤器添加元素

    第一步通过指纹哈希函数得到对应的指纹(如指纹值为5),随后通过哈希元数据得到第一个桶的位置(如桶1的位置是2),然后拿第一个桶的位置与指纹的哈希值异或得到第二个桶的位置(如桶2的位置是4)。

    假设每个桶中可以存放两个元素,通过计算得到桶的位置之后就需要判断两个桶中是否还有位置存放当前元素的指纹值,可能的情况如下所示:

(1)如果两个桶中都有位置存放指纹值,那么会随机挑选一个桶来存放指纹值,如下所示:

图片图片

(2)一个桶中已经存满了,另一个桶还有位置,此时会选择另外的桶存放指纹,如下所示:

图片图片

(3)两个桶都存满了指纹值

    如果两个桶都存满了指纹值,这个时候布谷鸟过滤器就会随机挑选一个桶并将桶中的随机的一个指纹值踢掉,把当前的指纹值存放进去,如下所示:

图片图片

    此时被踢掉的元素会去寻找它的另一个桶(因为每个元数据有两个桶),那么寻找桶的过程就是通过异或的哈希函数实现的,如下所示:

图片图片

    极端的情况下,指纹3存在的另一个桶中也满了,此时就会在桶中随机剔除一个指纹(假设为指纹x),指纹x也就重复指纹值3的过程,这样就会一直递归直到找到桶将所有的指纹存放下去。当然我们也是可以设置递归的次数,不会让其无限制的递归下去。

    随着插入的元素增多,布谷鸟过滤器的插入复杂度也就逐渐上升,因为桶的数据越满,那么它的踢出数据的频率就越高,所以需要重新计算的次数也会变多。

2.3 布谷鸟过滤器查询元素

    由于每个元素都是通过两个并不独立的哈希函数计算之后只会存在特定的桶中,所以查找的时候只会在特定的桶位置拿到桶中所有的指纹值,然后将桶中的指纹值与当前的元数据指纹值做对比,如下所示:

图片图片

    我们此时只需要判断是否有元数据的指纹值,如果比对成功那么就证明元数据存在布谷鸟过滤器中(存在也不一定是真存在),反之就就不在布谷鸟过滤器中。

2.4 布谷鸟过滤器的元素分布

    布谷鸟过滤器在插入的时候并不会先去判断这个桶中是否存在相同的指纹,而是直接插入元数据的指纹,这也就代表同一个桶中存在多个相同的指纹,如下图所示:

图片图片

也可能出现在布谷鸟过滤器中多个桶中存在同样的指纹,如下图所示:

图片图片

    这样就出现了同样的指纹出现在不同的桶中这也就给查询带来一定的假阳性。

2.5 布谷鸟过滤器的删除元素

    因为我们存放的是元数据的指纹,因此我们通过查询逻辑找到对应桶中的所有指纹,然后找到元数据的指纹,直接删除这个指纹,如下所示:

图片

    但是我们这里需要注意的是,同一个桶中可能会存在多个指纹的相同的副本,此时也就被删除了。

总结:

    布隆过滤器和布谷鸟过滤器都有各自的特点,所以也就有各自的使用场景。

(1)如果需要一个成熟、简单且不需要删除元素的概率型数据结构,布隆过滤器是一个很好的选择。

(2)如果需要支持删除操作并且对误报率有更严格的要求,布谷鸟过滤器可能是更好的选择。在选择数据结构时,需要考虑实际应用的需求和性能要求。

免责声明:

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

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

图解布隆过滤器和布谷鸟过滤器实现原理

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

下载Word文档

猜你喜欢

图解布隆过滤器和布谷鸟过滤器实现原理

我们元数据通过两个哈希函数函数之后得到2和7两个值,然后将2和7这个两个值对应的bit位上的值设置为1,这样我们就将元数据存放到布隆过滤器上。

什么是布隆过滤器?如何实现布隆过滤器?

以下我们介绍了什么是布隆过滤器?它的使用场景和执行流程,以及在 Redis 中它的使用,那么问题来了,在日常开发中,也就是在 Java 开发中,我们又将如何操作布隆过滤器呢?

Python实现布隆过滤器

转载自:http://blog.csdn.net/demon24/article/details/8537665http://blog.csdn.net/u013402746/article/details/28414901        
2023-01-31

Java布隆过滤器的原理和实现分析

数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长所以布隆过滤器是为了解决数据量大的一种数据结构。本文就来和大家详细说说布隆过滤器的原理和实现,感兴趣的可以了解一下
2022-11-13

如何在 Java 中实现布隆过滤器?(java怎么实现布隆过滤器)

在Java开发中,布隆过滤器是一种用于快速判断元素是否存在的数据结构。它具有高效的空间和时间复杂度,特别适用于大规模数据的去重和判断。下面将详细介绍如何在Java中实现布隆过滤器。一、了解布隆过滤器的原理布隆过滤器的核心
如何在 Java 中实现布隆过滤器?(java怎么实现布隆过滤器)
Java2024-12-22

Java中的布隆过滤器原理实现和应用

Java中的布隆过滤器是一种基于哈希函数的数据结构,能够高效地判断元素是否存在于一个集合中。它广泛应用于缓存、网络协议、数据查询等领域,在提高程序性能和减少资源消耗方面具有显著优势
2023-05-17

Java怎么实现布隆过滤器

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

Redis 布隆(Bloom Filter)过滤器原理与实战

布隆过滤器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出,它是一种 space efficient 的概率型数据结构,用于判断一个元素是否在集合中。

使用golang怎么实现一个布谷鸟过滤器

本文章向大家介绍使用golang怎么实现一个布谷鸟过滤器的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、数据打包、虚拟机处理、
2023-06-06

基于php+redis实现布隆过滤器

本文详细介绍了基于PHP+Redis实现布隆过滤器的方法,该过滤器是一种概率性数据结构,用于快速判断元素是否存在集合中。Redis提供原生布隆过滤器支持,可以使用自定义PHP类简化其使用。布隆过滤器具有高空间效率、快速查找、近似查询和可扩展性等优势,但也有误报、不可变和不支持删除的局限性。通过利用Redis布隆过滤器,开发人员可以优化PHP应用程序的集合成员资格测试和存储需求。
基于php+redis实现布隆过滤器
2024-04-02

Java的布隆过滤器如何实现

今天小编给大家分享一下Java的布隆过滤器如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。BitMap现代计算机用二进
2023-06-29

SpringBoot+Redis如何实现布隆过滤器

小编给大家分享一下SpringBoot+Redis如何实现布隆过滤器,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!简述关于布隆过滤器的详细介绍,我在这里就不再赘述一遍了我们首先知道:BloomFilter使用长度为m bi
2023-06-29

冷饭新炒:理解布隆过滤器算法的实现原理

布隆过滤器是「一种空间高效概率性的数据结构」(百科中原文是a space-efficient probabilistic data structure),该数据结构于1970年由Burton Howard Bloom提出,「作用是测试一个元

布隆vs布谷鸟:哪种过滤器最适合你的大数据需求?

布隆过滤器(Bloom Filter)和布谷鸟过滤器(Cuckoo Filter)是两种概率型数据结构,用于快速而高效地检查一个元素是否属于一个集合。尽管它们都能够用于这一目的,但在实现细节、性能特点和使用场景上存在不同。

布隆过滤器的Python实现(标准、计

github:bloompy布隆过滤器的Python3实现,包括标准、计数、标准扩容、计数扩容。更新自pybloom。安装pip install bloompy使用通过bloompy你可以使用四种布隆过滤器标准布隆过滤器标准布隆过滤器只能进
2023-01-31

编程热搜

  • 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动态编译

目录