算法~布隆过滤器

这篇具有很好参考价值的文章主要介绍了算法~布隆过滤器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

布隆过滤器(Bloom Filter)是一种高效的概率数据结构,用于判断一个元素是否存在于集合中。它基于位数组和多个哈希函数,并具有以下特点:

Bloom Filter 是一个基于概率的数据结构:它只能告诉我们一个元素绝对不在集合内可能在集合内

  1. 快速查询:布隆过滤器具有快速查询的特性。它使用多个哈希函数将元素映射到位数组中的不同位置,查询时只需通过计算哈希值并检查对应的位是否被设置,即可判断元素是否可能存在于集合中。
  2. 空间效率高:布隆过滤器占用的存储空间相对较小。通过合理选择位数组的大小和哈希函数的数量,可以在较小的空间内存储大量的元素信息。
  3. 容错率可控:布隆过滤器可以通过调整位数组的大小和哈希函数的数量来控制容错率。容错率是指判断元素存在时的误判率,即可能将不存在的元素错误地判断为存在。较小的容错率会增加位数组的大小和哈希函数的数量。
  4. 不支持删除操作:布隆过滤器设计用于快速判断元素是否存在,但本身不支持删除操作。删除操作会导致位数组中的其他元素受到影响,可能会误判其他元素的存在性。

布隆过滤器适用于以下场景:

  • 快速成员检查:当需要快速判断一个元素是否存在于一个庞大的集合中时,布隆过滤器可以提供高效的成员检查功能。例如,网络爬虫可以使用布隆过滤器来避免重复爬取同一网页。
  • 缓存优化:布隆过滤器可以用于缓存系统中,提前过滤掉不会命中的数据,以减轻对后端存储的负载。
  • 防止缓存穿透:布隆过滤器可以用于防止缓存穿透,即当请求的数据不存在时,快速判断避免对底层存储进行无效查询。
  • 数据库查询优化:布隆过滤器可以用于减少数据库查询操作。例如,在一个查询系统中,可以使用布隆过滤器过滤掉一些明显不符合条件的查询,从而提高整体查询效率。

需要注意的是,布隆过滤器存在一定的误判率。由于多个元素可能哈希到同一位,因此在判断元素存在时,可能会发生冲突,导致错误的判断。因此,在使用布隆过滤器时,需要根据实际需求权衡容错率和空间占用,并在误判率可接受的范围内进行使用。

下面是一个使用 Mermaid 构建的 Markdown 结构图,展示了布隆过滤器的基本结构:

graph LR A(Bit Array) --> B(Hash Function 1) A(Bit Array) --> C(Hash Function 2) A(Bit Array) --> D(Hash Function 3) B -->|Hash Value 1| E(Bit Position 1) C -->|Hash Value 2| F(Bit Position 2) D -->|Hash Value 3| G(Bit Position 3)

在这个结构图中,布隆过滤器由三个主要组件组成:

  • Bit Array(位数组):用于存储元素的存在性信息。位数组是一个由多个位(或者说是二进制位)组成的数组,每个位代表一个位置。位数组的长度通常根据期望存储的元素数量和容错率进行选择。
  • Hash Functions(哈希函数):布隆过滤器使用多个哈希函数来将元素映射到位数组的不同位置。在结构图中,我们表示了三个哈希函数,分别为 Hash Function 1、Hash Function 2 和 Hash Function 3。
  • Bit Positions(位位置):通过哈希函数计算得到的哈希值将决定元素在位数组中的位置。在结构图中,我们用 E、F 和 G 来表示位数组中的不同位位置。

当要向布隆过滤器中添加元素时,首先通过多个哈希函数计算元素的哈希值,然后将对应的位位置在位数组中设置为 1,表示元素的存在性。

当要查询一个元素是否存在于布隆过滤器中时,同样通过多个哈希函数计算元素的哈希值,并检查对应的位位置是否都为 1。如果所有位位置都为 1,则可能存在这个元素;如果有任何一个位位置为 0,则可以确定该元素不存在。

请注意,上述结构图只是一个简化的表示,用于展示布隆过滤器的基本结构。实际的布隆过滤器还包括其他的配置参数和操作方法,例如位数组的大小、哈希函数的数量等。

java中使用guava包提供的BloomFilter

int expectedInsertions = 1000000;// 预期的插入元素数量
double fpp = 0.01; // 期望的误判率
com.google.common.hash.BloomFilter<String> bloomFilter = com.google.common.hash.BloomFilter
				.create(Funnels.stringFunnel(Charset.defaultCharset()), expectedInsertions, fpp);
bloomFilter.put("apple");
bloomFilter.put("pear");
bloomFilter.put("yellow");

System.out.println("apple:" + bloomFilter.mightContain("apple"));
System.out.println("pear:" + bloomFilter.mightContain("pear"));
System.out.println("red:" + bloomFilter.mightContain("red"));

结果文章来源地址https://www.toymoban.com/news/detail-748536.html

apple:true
pear:true
red:false

到了这里,关于算法~布隆过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法~布隆过滤器

    布隆过滤器(Bloom Filter)是一种高效的概率数据结构,用于判断一个元素是否存在于集合中。它基于位数组和多个哈希函数,并具有以下特点: Bloom Filter 是一个基于概率的数据结构:它只能告诉我们一个 元素绝对不在集合内 或 可能在集合内 快速查询:布隆过滤器具有快速

    2024年02月05日
    浏览(36)
  • 【算法系列 | 7】深入解析查找算法之—布隆过滤器

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第3讲,讲一下排序算法的选择排序(Selection Sort) 查找算法是很常见的

    2024年02月14日
    浏览(32)
  • 【数据结构与算法】哈希—— 位图 | 布隆过滤器 | 哈希切割

    🐱作者:一只大喵咪1201 🐱专栏:《数据结构与算法》 🔥格言: 你只管努力,剩下的交给时间! 哈希是一种映射思想,这里再讲解两种应用哈希思想的数据结构。 问题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数

    2024年02月02日
    浏览(44)
  • 【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分

    给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 解决方案 : 遍历 :遍历这40亿个整数,去判断该数是否在这40亿个整数中。时间复杂度是 O ( N ) O(N) O ( N ) 。 set :用 set 将这40亿个整数存起来,然后去判断这个数是否在

    2024年02月08日
    浏览(43)
  • 布隆过滤器及其应用

    布隆过滤器是一种数据结构,具有快速插入和查找的特性,能确定某个字符串一定存在或者可能存在。布隆过滤器有着高效的空间利用率,它不存储具体数据,只存储数据的关键标识,所以占用的空间较小。它的查询结果可能会存在一定误差,但是误差总体可控,同时不支持

    2024年02月03日
    浏览(32)
  • Redis----布隆过滤器

    目录 背景 解决方案 什么是布隆过滤器 布隆过滤器的原理 一些其他运用 比如我们在观看新闻或者刷微博的时候,会不停地给我们推荐新的内容,我们发现几乎没有重复的,说明后台已经进行了去重处理,基于如何去重,Redis给出了高效的方案---布隆过滤器 1.记录已经浏览过

    2024年02月09日
    浏览(29)
  • 布隆过滤器的原理

    布隆过滤器是一种用于检索一个元素是否在一个集合中的数据结构,具有高效的查询性能和较小的内存占用。 布隆过滤器的底层实现主要涉及以下几个步骤: 初始化数组: 首先,初始化一个比较大的数组,数组中的元素用二进制表示,初始值都为0。 Hash计算: 当一个新的元

    2024年01月18日
    浏览(28)
  • 位图以及布隆过滤器

    本文主要讲解哈希思想的实际应用,位图和布隆过滤器。 讲解位图之前我们先来解答这样一道腾讯的面试题 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】 很多人立马就想到了用哈希表或者红黑树,因为足够

    2024年02月08日
    浏览(43)
  • 布隆过滤器详解

    本文全部代码地址 布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于一个集合中.它的主要优点是速度快,空间占用少,因此在需要快速判断某个元素是否在集合中的场合得到广泛引用. 布隆过滤器就是 一个大型的位数组和几个不一样的无偏hash函数. 所谓无偏就是

    2023年04月22日
    浏览(44)
  • 高级数据结构与算法 | 布谷鸟过滤器(Cuckoo Filter):原理、实现、LSM Tree 优化

    如果对布隆过滤器不太了解,可以看看往期博客:海量数据处理(一) :位图与布隆过滤器的概念以及实现 布隆过滤器 局限 对于需要处理海量数据的时候,如果我们需要快速判断一条记录是否,通常会使用过滤器来进行验证,而其中最常见的就是布隆过滤器(Bloom Filter)—

    2024年02月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包