做网站最好用的软件系统开发和网站开发
web/
2025/10/2 18:30:43/
文章来源:
做网站最好用的软件,系统开发和网站开发,企业咨询管理收费标准,网页设计代码设计的代码有哪些一、概述 布隆过滤器本质上是一个很长的二进制数组#xff0c;主要用来判断一个数据存不存在数组里#xff0c;如果存在就用1表示#xff0c;不存在用0表示#xff0c;它的优点是空间效率和查询时间都比一般的算法要好的多#xff0c;缺点是有一定的误识别率和删除困难。 …一、概述 布隆过滤器本质上是一个很长的二进制数组主要用来判断一个数据存不存在数组里如果存在就用1表示不存在用0表示它的优点是空间效率和查询时间都比一般的算法要好的多缺点是有一定的误识别率和删除困难。
二、实现原理 当一个元素被加入集合时通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点offset把它们置为 1。检索时我们只要看看这些点是不是都是 1 就大约知道集合中有没有它了如果这些点有任何一个 0则被检元素一定不在如果都是 1则被检元素很可能在。这就是布隆过滤器的基本思想。
布隆过滤器Bloom Filter是一个高空间利用率的概率性数据结构由二进制向量即位数组和一系列随机映射函数即哈希函数两部分组成。
当布隆过滤器判定某个值存在时其实这个值只是有可能存在当它说某个值不存在时那这个值肯定不存在这个误判概率大约在 1% 左右。
1.布隆过滤器-添加元素 当使用布隆过滤器添加 key 时会使用不同的 hash 函数对 key 存储的元素值进行哈希计算从而会得到多个哈希值。根据哈希值计算出一个整数索引值将该索引值与位数组长度做取余运算最终得到一个位数组位置并将该位置的值变为 1。每个 hash 函数都会计算出一个不同的位置然后把数组中与之对应的位置变为 1。通过上述过程就完成了元素添加操作。
2.布隆过滤器-判定元素是否存在 当我们需要判断一个元素是否存时首先对给定元素再次执行哈希计算得到与添加元素时相同的位数组位置判断所得位置是否都为 1如果其中有一个为 0那么说明元素不存在若都为 1则说明元素有可能存在。
三、布隆过滤器使用场景 1.解决Redis缓存穿透问题。 2.邮箱系统的垃圾邮件过滤功能也普遍用到了布隆过滤器用了这个过滤器平时也会遇到某些正常的邮件被放进了垃圾邮件目录中。 3.内容推荐布隆过滤器能准确过滤掉那些已经看过的内容没有看过的新内容它也会过滤掉极小一部分 (误判)但是绝大多数新内容它都能准确识别。
四、布隆过滤器实现方式 1.引入Guava的依赖实现
dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion32.0.1-jre/version
/dependency
2.代码实现如下
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;public class BloomFilterTest {public static void main(String[] args) {// 预期插入数量long capacity 100000L;// 错误比率double errorRate 0.001;//创建BloomFilter对象需要传入Funnel对象预估的元素个数错误率BloomFilterLong filter BloomFilter.create(Funnels.longFunnel(), capacity, errorRate);//put值进去for (long i 0; i capacity; i) {filter.put(i);}// 统计误判次数int count 0;// 我在数据范围之外的数据测试相同量的数据判断错误率是不是符合我们当时设定的错误率for (long i capacity; i capacity * 2; i) {if (filter.mightContain(i)) {count;}}System.out.println(count);}
}
结果为假如数据为100000容错率为0.001统计出来的误判个数是94。 因此布隆过滤器容错还是非常可以的当然也可以通过redis实现布隆过滤器这里就不说明了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85757.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!