布隆过滤器的简单介绍与实例(Bloom Filter)

2023-11-19

转载https://blog.csdn.net/leeafay/article/details/78681534

布隆在1970年提出了布隆过滤器(Bloom Filter),是一个很长的二进制向量(可以想象成一个序列)和一系列随机映射函数(hash function)。 
布隆过滤器可以用于检索一个元素是否在一个集合中。 
优点:占用空间小,查询快 
缺点:有误判,删除困难

1、原理

a. 添加元素:设计一个布隆过滤器

用栗子说明:假如我们有一个Bit Array(行阵列),含有11位数字(可以看成一个哈希表)。

索引   0 1 2 3

4

5 6 7 8 9 10
初始值  0 0 0 0 0 0 0 0 0 0 0


假设:有一个待检测的值:25 
第一步:将25化为二进制11001 
第二步:分别取奇数位和偶数位各自化成整数,比如上例:奇数位101,是5;偶数位10,是2(这两个就是生成的hashfunc) 
第三步:对Bit Array总位数取模,也就是哈希运算, 
5mod11=5,将索引5位的数置1 
2mod11=2,将索引2的数置1 
结果

索引   0 1 2 3

4

5 6 7 8 9 10
初始值  0 0 1 0 0 1 0 0 0 0 0

 
b. 查询元素:用布隆过滤器判断一个数是否存在

假如我们有一个已知的过滤器: 10100101010

索引   0 1 2 3

4

5 6 7 8 9 10
初始值  1 0 1 0 0 1 0 1 0 1 0

 
我们想知道118有没有在这个过滤器里出现过: 
首先,计算118的二进制表达: y=118=1110110 
h1(y)=14 mod 11 = 3 
h2(y)=5 mod 11=5 
右图在上表中,索引3为0,索引5为1,因此我们认为118没有出现过。 
因此没有出现过

c.hash function

a/b两个例子中的hash function是我们计算出来的。当我们设定hash function的时候,同样按照相同的方法计算哈希值(取模) 
添加元素时,用k个hash function将它hash得到bloom filter中k个bit位,将这k个bit位置1。 


判断元素是否在集合中时,用k个hash function将它hash得到k个bit位。若这k bits全为1,则此元素在集合中;若其中任一位不为1,则此元素比不在集合中(因为如果在,则在添加时就已经把对应的k个bits位置为1)。

2、应用:垃圾邮件过滤

3、误判率(FP)的计算

布隆过滤器只有FP,没有FN,即不会漏报,但是会有误报。当可以承受一些误报时,布隆过滤器比其它表示集合的数据结构有着很大的空间优势。

计算

Target:靶,也就是集合的大小 
Target=Size(BitArray)Target=Size(BitArray)
Dart:飞镖,也就是待计算的元素,为输入数据的量*hash函数的个数Dart=Size(NumOfInputElements∗NumHashfunc)Dart=Size(NumOfInputElements∗NumHashfunc)
0的误判率:F0=e−Dart/TargetF0=e−Dart/Target 
1的误判率为F1=(1−FP0)hashfuncF1=(1−FP0)hashfunc 
举个栗子: 
假如我们有10亿的阵列,5个hash函数,然后我们输入1000万的数据, 
因此 
Target=109Target=109 
Dart=108∗5Dart=108∗5 
F0=e−1/2=0.607F0=e−1/2=0.607 
F1=(1−F0)5=(0.393)5=0.00937

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

布隆过滤器的简单介绍与实例(Bloom Filter) 的相关文章

  • Angular2 之 单元测试

    单元测试需要掌握的知识点 karma conf js的配置 具体了解到每一项的意义 这样才能真正的了解这个配置是如何配置的 甚至才可以做到自己的配置 组件的测试 单独的service测试 Angular的测试工具 Angular的测试工具类
  • 飞机大战(C语言版)

    大一下要交课程设计 于是就用C语言写了一个飞机大战小游戏 没有用到第三方库 飞机和子弹的移动使用的光标移动函数 所以没有卡顿 其中w s a d分别表示上下左右 包括大写 空格发射子弹 游戏结束后可选择是否储存游戏数据 该程序复制后可直接使
  • git push错误: failed to push some refs to

    原因 当你在git上对它进行了在线修改 但是没有对本地库进行同步 这个时候你再次commit 想把本地库提交到远程git库中 就会出现push失败问题 简单来说 就是远程与本地存在不一致的commit情形 解决方法 确保远程代码没问题的情况

随机推荐

  • 【Java SE】抽象类和接口

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 一 抽象类 1 抽象类的概述 2 抽象类特点 3 抽象关键字abstract和哪些不可以共存 4 抽象类的细节 5 抽象类的作用 二 接口 1 什
  • 统计学习方法论概念

    1 统计学习包含监督学习 非监督学习 半监督学习和强化学习 2 监督学习 监督学习的任务是学习一个模型 使模型能够根据任意给定的输入 对模型的输出做出一个好的预测 监督学习分为学习和预测两个过程 由学习系统和预测系统组成 3 损失函数和风险
  • 【C++】迭代器 && vector中迭代器失效

    文章目录 1 什么是迭代器 2 迭代器与指针 3 迭代器的分类 3 1具体分类 3 2为什么要对迭代器分类 3 3迭代器的使用建议 4 vector迭代器失效 4 1迭代器失效及其危害 4 2哪些操作会导致迭代器失效 如何解决 1 什么是迭
  • 视觉SLAM十四讲笔记-6-3

    视觉SLAM十四讲笔记 6 3 文章目录 视觉SLAM十四讲笔记 6 3 6 3 实践 曲线拟合问题 6 3 1 手写高斯牛顿法 6 3 2 使用Ceres进行曲线拟合 Ceres 简介 安装Ceres 使用Ceres拟合曲线 6 3 3
  • JAVA往map添加元素_java list map在初始化的时候添加元素

    List list new ArrayList add First Object add Second Object add Third Object Map map new HashMap put First Key First Valu
  • 初始OAuth2.0

    1 什么是OAuth2 0 OAuth2 0 是目前使用非常广泛的授权机制 用于授权第三方应用获取用户的数据 举例说明 用户可以通过选择其他登录方式来使用gitee 这里就使用到了第三方认证 OAuth 引入了一个授权层 用来分离两种不同的
  • vue 修改标题名字

    1 直接修改 在main js中添加 document title 大屏控制 2 根据路由动态改变 https www cnblogs com CinderellaStory p 10858035 html
  • iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机?

    iPhone苹果手机15机型区域版本识别代码 CH代码为国行 LL代码为美版 ZP代码为港版 iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机 1 打开苹果iPhone15手机桌面上的 设置 2 在iPhone苹
  • OWASP ZAP安装遇到Error.A JNI error has occurred ,please check your installation and try again

    问题描述 我当时下载的是兼容版本 下载完成后双击zap bat发现运行一下就闪退 然后运行jar文件就报错 过程 最开始以为是java环境的问题 后面用java version去运行了一下 发现java环境是正常的 但又一直提示java的问
  • 4大技术亮点支撑应用优势 全新一代旗舰型行业无人机千巡翼X4发布

    随着无人机与数字成像技术的发展 无人机航测成为了重要的地理信息采集手段 也越来越受重视 据相关研报数据统计 预计2025年我国实景三维在自然资源领域的 以数据采集 处理为主的直接市场规模预计将达40亿元 推测2025年关联市场规模将达400
  • MFC设置控件文本字体、大小、颜色、背景

    1 修改字体 大小 声明一个CFont类型的类成员变量 CFont m editFont 然后在类的初始化函数OnInitDialog 中添加以下两行代码 设置静态文本字体大小 m editFont CreatePointFont 180
  • MFC编程实验(三):组件(列表框元素的增删)

    一 实验要求 创建一个对话框应用程序 实现如下布局 完成如下功能 1 初始状态 列表中有4个元素 2 可以在编辑框中输入新朋友的名字 点击 添加 按钮添加到列表框 同时清空编辑框中的名字 3 选中列表框中的一个名字 点击 删除 按钮可以删除
  • GDB 简略手册

    杂项 命令 用法 说明 h elp help 显示可用帮助文档 h CMD 显示关于指定命令的帮助 apr opos apr REGEXP 使用正则表达式搜索命令 i nfo info 显示可展示的信息 ENTER 无命令回车 重复执行上一
  • 接口测试总结

    第一部分 主要从问题出发 引入接口测试的相关内容并与前端测试进行简单对比 总结两者之前的区别与联系 但该部分只交代了怎么做和如何做 并没有解释为什么要做 第二部分 主要介绍为什么要做接口测试 并简单总结接口持续集成和接口质量评估相关内容 第
  • 手写系列之--call/apply/bind/防抖/节流

    call call 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数 语法 function call thisArg arg1 arg2 JavaScript中由于函数的this指向它的直接调用者 我们变更调用者即
  • 1668 最大重复子字符串

    题目描述 给你一个字符串 sequence 如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串 那么单词 word 的 重复值为 k 单词 word 的 最大重复值 是单词 word 在 sequence
  • 第48讲 第49讲--动态定位单元格区域1-End属性、动态定位单元格区域2、3-Currentregion UsedRange

    1 单元格区域 EntireRow返回该区域所在的整行对象单元格区域 EntireColumn返回该区域所在的整列 返回单元格所在的整行与整列 返回单元格对象 EntireRow 与EntireColumn Sub 整行与整列 Range
  • 制作一个“生日快乐”App,来自程序员的生日礼物~

    点击上方 码农的后花园 选择 星标 公众号 精选文章 第一时间送达 之前给大家制作了一个来自程序员的表白神器 本期带大家做一个 生日快乐 App 来自程序员的生日礼物 不要再说程序员不懂浪漫咯 往期精彩 Android App 开发的三种姿
  • hibernate 异常

    1 异常 org hibernate AnnotationException No identifier specified for entity异常 entity类是必须要主键的 否则就会报出这个异常 Id GeneratedValue
  • 布隆过滤器的简单介绍与实例(Bloom Filter)

    转载https blog csdn net leeafay article details 78681534 布隆在1970年提出了布隆过滤器 Bloom Filter 是一个很长的二进制向量 可以想象成一个序列 和一系列随机映射函数 ha