布隆过滤器 浅析 - 20181119

本文深入探讨了BloomFilter算法,一种高效的空间节省型数据结构,用于检查元素是否存在于集合中。介绍了其工作原理,包括位图和哈希函数的应用,以及查询过程中的可能误报。同时,分析了算法的优点,如查询效率高和空间节约,以及缺点,如存在一定的误差率和无法删除元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.引言

  • BloomFilter算法,是一种大数据排重算法。牺牲精度,达到高效利用空间的目的。
  • 可以过滤无效请求,恶意攻击。
  • 只记录特征,不记录原始数据
  • 查询特征值不存在,就代表没有数据;特征值存在,则代表数据可能存在。

二.优缺点

  • 优点:
    1.查询时间复杂度 O(k) 一个较小的常数
    2.极度节约空间
    3.不存储数据本身,对源数据有一定保密性
  • 缺点:
    1.有一定误差
    2.不能删除

三.详解

1.布隆过滤器
布隆过滤器,它是一种节省空间的概率数据结构(就是 位图 + 哈希)。主要功能是检查一个元素是否在给定的集合中。说它是一种概率数据结构是因为每次对它的查询会返回 2 种结果;一种是“可能在集合中”,也就是说它可能会误报,这个误报是有一定概率的,后面我们会详细介绍这个概率。另一种结果是“一定不在集合中”,这个结果是肯定的,也就是不会漏报。

2.位图(bitmap)
布隆过滤器=位图+哈希。那么什么是位图呢?位图(bitmap)我们可以理解为是一个 bit 数组,每个元素存储数据的状态(由于每个元素只有 1 bit,所以只能存储 0 或 1 这 2 种状态)适用于数据量超大,但是数据的状态很少的情况。比如判断一个整数是否在给定的超大的整数集中。
3.
它先定义一个长度为 m 的位图数组,初始值都为 0 ,然后定义 k 个不同的符合随机分布的哈希函数,添加一个元素的时候通过 k 个哈希函数得到 k 个 hash 值,将它们映射到位图数组中(当然计算出来的 hash 值可能超过了 m,那么就需要扩容,java 中 BitSet 的扩容方案是 Math.max(2 * 当前长度, 计算出来的 hash 值); )
在这里插入图片描述
4.
查询的时候把这个元素作为 K 个哈希函数的输入,得到 K 个数组的位置。如果这些位置中有任意一个是 0,说明元素肯定不在集合中。如果这些位置全部为 1,那么该元素很可能是在集合中,因为也有可能这些位置是被其他元素设置的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值