当前位置: 首页 > news >正文

BloomFilter原理学习

文章目录

  • BloomFilter简单介绍
  • BloomFilter中的数学知识
    • fpp(误判率/假阳性)的计算
    • k的最小值
    • 公式总结
  • 编程语言实现
    • golang的实现
      • [已知n, p求m和k](https://github.com/bits-and-blooms/bloom/blob/master/bloom.go#L133)
  • 参考

BloomFilter简单介绍

BloomFilter我们可能经常听到也在使用, 它的特点是如果判断结果为"不存在", 则一定不存在; 如果判断为存在, 则可能存在. 如下图示例说明当我们判断z元素存在时, 其实是不存在的, 即存在有概率性.
BloomFilter原理示意

如上图, 长为m=16的二进制向量, 初始全为0; k=3(即添加一个元素需要将3个bit设置为1), 对n=3个元素进行添加操作.

BloomFilter几个关键量定义:
m: 二进制向量大小(多少个二进制位)
n: 要存放的元素个数
k: 哈希函数的个数, 或者说每添加一个元素都要进行k次计算
fpp或者简写为p: 误判率(false positive rate), 即 使用bloomfilter判断为存在时, 但实际不存在的概率

BloomFilter中的数学知识

fpp(误判率/假阳性)的计算

BloomFilter主要的数学原理是: 在某一范围内(1<=x<=m)1<=x<=m)1<=x<=m)(x为整数, m通常是很大的, 如106级别10^6级别106级别), 任意选取两个整数i,j,i和j可重复选取i, j, i和j可重复选取i,j,ij可重复选取, 则其相等的概率是非常小的: mm2=1m\dfrac{m}{m^2}=\dfrac{1}{m}m2m=m1

我们假定hash计算是均匀的, 即每次hash会随机地将m位中的一位设置为1. 那么:

  • 一次hash计算(如h1(x)h1(x)h1(x))后, 任一位被 置为1 的概率为: 1m\dfrac{1}{m}m1
  • 一次hash计算(如h1(x)h1(x)h1(x))后, 任一位 还是0(即未被置为1) 的概率为: 1−1m1 - \dfrac{1}{m}1m1
  • 添加一个元素(如bloomFilter.Add(x), 即执行k次hash)后, 任一位还是0的概率为: (1−1m)k(1 - \dfrac{1}{m})^k(1m1)k
  • 添加n个元素后(如上图中的n=3个元素:x,y,z), 任一位还是0的概率为: (1−1m)kn(1 - \dfrac{1}{m})^{kn}(1m1)kn , 任一位为1的概率为 1−(1−1m)kn1- (1 - \dfrac{1}{m})^{kn}1(1m1)kn
  • 如果将1个新的元素,添加到已存在n个元素的BloomFilter中,则任一位已经为1的概率与上面相同,为:1−(1−1m)kn1- (1 - \dfrac{1}{m})^{kn}1(1m1)kn .
    那么添加这个新元素时, k个比特都为1(相当于新元素和已有元素已经分不清了)的概率(此即为新插入元素的误识别率)为:
    p=[1−(1−1m)kn]kp = [1- (1 - \dfrac{1}{m})^{kn}]^{k} p=[1(1m1)kn]k

通常来说, m是一个非常大的数(1MiB内存就有220×8≈800万2^{20}\times{8}\approx 800万220×8800个bit), 并且我们有: lim⁡x→∞(1+x)1x=e{ \lim\limits_{x \to \infin} (1+x)^{\frac{1}{x}} = e}xlim(1+x)x1=e
那么在工程实践中, 可以认为p的近似值为:
p=[1−(1−1m)kn]k=[1−(1−1m)−m×−knm]k≈(1−e−knm)k(当m很大时,将−1m看作x)\begin{aligned} p &= [1- (1 - \dfrac{1}{m})^{kn}]^{k} \\ &= [1- (1 - \dfrac{1}{m})^{-m\times\frac{-kn}{m}}]^{k} \\ &\approx (1-e^{-\frac{kn}{m}})^{k} \enspace (当m很大时, 将 -\dfrac{1}{m}看 作x) \end{aligned} p=[1(1m1)kn]k=[1(1m1)m×mkn]k(1emkn)k(m很大时,m1看作x)

k的最小值

计算过程参考: https://cs.stackexchange.com/questions/132088/how-is-the-optimal-number-of-hashes-is-derived-in-bloom-filter

已经遗忘的知识:

  1. 求导公式: (ln⁡x)′=1x(\ln{x})^{'} = \dfrac{1}{x}(lnx)=x1
  2. 求导公式: (enx)′=nenx(\bold{e}^{nx})^{'} = n\bold{e}^{nx}(enx)=nenx

在某些情况下, 我们对n, m, 的值可以给一个估算值, 以此来获得最小的p(即尽可能准确判断), 那么k就是一个变量了, 问题就变为求 (1−e−knm)k(1-e^{-\frac{kn}{m}})^{k}(1emkn)k的最小值.
f(k)=(1−e−knm)kf(k)=(1-e^{-\frac{kn}{m}})^{k}f(k)=(1emkn)k, 那么
两边取对数有:ln⁡f(k)=ln⁡(1−e−knm)k=kln⁡(1−e−knm)设g(k)=kln⁡(1−e−knm),那么:g′(k)=ln⁡(1−e−knm)+knme−knm1−e−knm令x=e−knm,x∈(0,1),那么有h(x)=ln⁡(1−x)−x1−xln⁡x(注意k用−mnlnx替换)=(1−x)ln⁡(1−x)−xln⁡x1−x(x∈0,1)\begin{aligned} & 两边取对数有: \\ & \ln f(k)=\ln (1-e^{-\frac{kn}{m}})^{k} = k \ln(1-e^{-\frac{kn}{m}}) \\ & 设 g(k) = k\ln{(1-e^{-\frac{kn}{m}})}, 那么:\\ & g{'}(k) = \ln{(1-e^{-\frac{kn}{m}})} + k\dfrac{\frac{n}{m}e^{-\frac{kn}{m}}}{1-e^{-\frac{kn}{m}}} \enspace \\ & 令 x = e^{-\frac{kn}{m}}, x \in(0, 1), 那么有 \\ & h(x) = \ln(1-x) - \dfrac{x}{1-x} \ln x \enspace (注意k用-\dfrac{m}{n}lnx替换) \\ & \enspace \enspace \enspace \enspace = \dfrac{(1-x) \ln(1-x)-x \ln x}{1-x} \enspace (x\in{0, 1}) \end{aligned} 两边取对数有:lnf(k)=ln(1emkn)k=kln(1emkn)g(k)=kln(1emkn),那么:g(k)=ln(1emkn)+k1emknmnemknx=emkn,x(0,1),那么有h(x)=ln(1x)1xxlnx(注意knmlnx替换)=1x(1x)ln(1x)xlnx(x0,1)

h(x)=(1−x)ln⁡(1−x)−xln⁡x1−x(x∈0,1)h(x) = \dfrac{(1-x)\ln(1-x)-x \ln x}{1-x} \enspace (x\in{0, 1})h(x)=1x(1x)ln(1x)xlnx(x0,1), 不难看出:

  1. x=12时,h(x)=0x=\dfrac{1}{2}时, h(x)=0x=21,h(x)=0
  2. x>12时,h(x)<0x>\dfrac{1}{2}时,h(x)<0x>21,h(x)<0
  3. x<12时,h(x)>0x<\dfrac{1}{2}时,h(x)>0x<21,h(x)>0

站在巨人的肩膀上, 我们可以直接在这里看:
显然在x∈(0,1)范围内,当x=0.5时,h(x)最小x\in(0, 1)范围内, 当x=0.5时, h(x)最小x(0,1)范围内,x=0.5,h(x)最小, 此时k=mnln2k=\dfrac{m}{n}ln2k=nmln2

在这里插入图片描述
也就是说:
k<mnln2k <\dfrac{m}{n}ln2k<nmln2时(想象k非常接近0), x=e−knmx = e^{-\frac{kn}{m}}x=emkn会非常接近1, 此时x>12x>\dfrac{1}{2}x>21,
h(x)<0h(x)<0h(x)<0 ⇒ f(k)在变小;
k>mnln2k >\dfrac{m}{n}ln2k>nmln2时(想象k非常接近0), x=e−knmx = e^{-\frac{kn}{m}}x=emkn会非常接近0, 此时x<12x<\dfrac{1}{2}x<21,
h(x)>0h(x)>0h(x)>0 ⇒ f(k)在变大;
所以k=mnln2k=\dfrac{m}{n}ln2k=nmln2时会使得f(k)f(k)f(k)最小, 即此时p最小.

公式总结

  1. 误判率公式: p=[1−(1−1m)kn]kp = [1- (1 - \dfrac{1}{m})^{kn}]^{k}p=[1(1m1)kn]k
  2. 误判率近似公式(当m很大时): p≈(1−e−knm)kp \approx (1-e^{-\frac{kn}{m}})^{k}p(1emkn)k
  3. 已知m, n, k的最小值(近似)为: k=mnln⁡2≈0.7mnk=\dfrac{m}{n}\ln{2} \approx 0.7\dfrac{m}{n}k=nmln20.7nm
  4. 已知n, p, 且k取最小时, m=−nln⁡p(ln2)2m=-\dfrac{n\ln{p}}{(ln2)^{2}}m=(ln2)2nlnp

编程语言实现

golang的实现

https://github.com/bits-and-blooms/bloom

已知n, p求m和k

func EstimateParameters(n uint, p float64) (m uint, k uint) {m = uint(math.Ceil(-1 * float64(n) * math.Log(p) / math.Pow(math.Log(2), 2)))k = uint(math.Ceil(math.Log(2) * float64(m) / float64(n)))return
}

参考

  1. https://en.wikipedia.org/wiki/Bloom_filter
  2. https://cs.stackexchange.com/questions/132088/how-is-the-optimal-number-of-hashes-is-derived-in-bloom-filter

(完)

相关文章:

BloomFilter原理学习

文章目录BloomFilter简单介绍BloomFilter中的数学知识fpp(误判率/假阳性)的计算k的最小值公式总结编程语言实现golang的实现[已知n, p求m和k](https://github.com/bits-and-blooms/bloom/blob/master/bloom.go#L133)参考BloomFilter简单介绍 BloomFilter我们可能经常听到也在使…...

C语言老题新解第1-5题

文章目录1 互不相同且无重复数字2 企业利润提成3 两个完全平方数4 判断一年的第几天5 三个整数比较大小1 互不相同且无重复数字 1 有1, 2, 3, 4四个数字&#xff0c;能组成多少互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 最简单当然是三重循环嵌套在一起…...

【数据库系列】MQSQL历史数据分区

互联网行业企业都倾向于mysql数据库&#xff0c;虽说mysql单表能支持亿级别的数据量&#xff0c;加上索引优化下查询速度&#xff0c;勉强能使用&#xff0c;但是对于追求性能和效率的互联网企业&#xff0c;这是远远不够的。Mysql数据库单表数据量到达500万左右&#xff0c;达…...

MyBatis常用的俩种分页方式

1、使用 limit 实现分页 select * from xxx limit m,n # m 表示从第几条数据开始&#xff0c;默认从0开始 # n 表示查询几条数据 select * from xxx limit 2,3 # 从索引为2的数据开始&#xff0c;往后查询三个。2、3、4 (1) 创建分页对象&#xff0c;用来封装分页的数据 PS…...

RPC通信原理解析

一、什么是RPC框架&#xff1f; RPC&#xff0c;全称为Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种计算机通信协议。 比如现在有两台机器&#xff1a;A机器和B机器&#xff0c;并且分别部署了应用A和应用B。假设此时位于A机器上的A应用想要调用位于B机…...

【蓝桥杯集训·周赛】AcWing 第93场周赛

文章目录第一题 AcWing 4867. 整除数一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4868. 数字替换一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4869. 异或值一、题目1、原题…...

蓝桥杯-刷题统计

蓝桥杯-刷题统计1、问题描述2、解题思路3、代码实现3.1 方案一&#xff1a;累加方法(超时)3.2 方案二1、问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数…...

Linux入门教程||Linux Shell 变量|| Shell 传递参数

Shell 变量 定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff0c;PHP语言中变量需要&#xff09;&#xff0c;如&#xff1a; your_name"w3cschool.cn"注意&#xff0c;变量名和等号之间不能有空格&#xff0c;这可能和你熟悉的所有编程语言都不一…...

[算法和数据结构]--回溯算法之DFS初识

回溯算法——DFSDFS介绍(Depth First Search)DFS经典题目1. 员工的重要性2. 图像渲染3.被围绕的区域4.岛屿数量5. 电话号码的字母组合6.数字组合7. 活字印刷8. N皇后DFS介绍(Depth First Search) 回溯法&#xff08;back tracking&#xff09;&#xff08;探索与回溯法&#x…...

【LeetCode每日一题】——680.验证回文串 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 贪心算法 二【题目难度】 简单 三【题目编号】 680.验证回文串 II 四【题目描述】 给你一个字…...

【C语言进阶:指针的进阶】你真分得清sizeof和strlen?

本章重点内容&#xff1a; 字符指针指针数组数组指针数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析这篇博客 FLASH 将带大家一起来练习一些容易让人凌乱的题目&#xff0c;通过这些题目来进一步加深和巩固对数组&#xff0c;指…...

【前端必看】极大提高开发效率的网页 JS 调试技巧

大家好&#xff0c;我是前端西瓜哥。本文讲解如何使用浏览器提供的工具进行 JS 代码的断点调试。 debugger 在代码中需要打断点的地方&#xff0c;加上 debugger&#xff0c;表示一个断点。浏览器代码执行到该位置时&#xff0c;会停下来&#xff0c;进入调试模式。 示例代码…...

【春招面经】视源股份前端一面

前言 本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09; 文章目录前言本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09;问题总结介绍一下项目的来源以及做这个项目的初衷一直监听滚动&#xff0c;有没有对性能产生影响&a…...

插件化开发入门

一、背景顾名思义&#xff0c;插件化开发就是将某个功能代码封装为一个插件模块&#xff0c;通过插件中心的配置来下载、激活、禁用、或者卸载&#xff0c;主程序无需再次重启即可获取新的功能&#xff0c;从而实现快速集成。当然&#xff0c;实现这样的效果&#xff0c;必须遵…...

tftp、nfs 服务器环境搭建

目录 一、认识 tftp、nfs 1、什么是 tftp&#xff1f; 2、什么是 nfs&#xff1f; 3、tftp 和 nfs 的区别 二、tftp的安装 1、安装 tftp 服务端 2、配置 tftp 3、启动 tftp 服务 三、nfs 的安装 1、安装 nfs 服务端 2、配置 nfs 3、启动 nfs 服务 一、认识 tftp、…...

汇编系列03-不借助操作系统输出Hello World

每天进步一点点&#xff0c;加油&#xff01; 上一节&#xff0c;我们通过汇编指令&#xff0c;借助操作系统的系统调用实现了向标准输出打印Hello world。这一节我们打算绕过操作系统&#xff0c;直接在显示屏幕上打印Hello world。 计算机的启动过程 当我们给计算机加电启…...

TPU编程竞赛系列|算能赛道冠军SO-FAST团队获第十届CCF BDCI总决赛特等奖!

近日&#xff0c;第十届中国计算机学会&#xff08;CCF&#xff09;大数据与计算智能大赛总决赛暨颁奖典礼在苏州顺利落幕&#xff0c;算能赛道的冠军队伍SO-FAST从2万余支队伍中脱颖而出&#xff0c;获得了所有赛道综合评比特等奖&#xff01; 本届CCF大赛吸引了来自全国的2万…...

【C++】AVL树,平衡二叉树详细解析

文章目录前言1.AVL树的概念2.AVL树节点的定义3.AVL树的插入4.AVL树的旋转左单旋右单旋左右双旋右左双旋AVL树的验证AVL树的删除AVL树的性能前言 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个共同点是&#xff1…...

C/C++开发,无可避免的多线程(篇四).线程与函数的奇妙碰撞

一、函数、函数指针及函数对象 1.1 函数 函数&#xff08;function&#xff09;是把一个语句序列&#xff08;函数体, function body&#xff09;关联到一个名字和零或更多个函数形参&#xff08;function parameter&#xff09;的列表的 C 实体&#xff0c;可以通过返回或者抛…...

elisp简单实例: taglist

从vim 转到emacs 下,一直为缺少vim 中的tablist 插件而感到失落. 从网上得到的一个emacs中的taglist, 它的功能很简陋,而且没有任何说明, 把它做为elisp的简单实例,供初学者入门倒不错,我给它加了很多注释,帮助理解, 说实话,感觉这百行代码还是挺有深度的,慢慢体会,调试才会有收…...

Azure AI基础到实战(C#2022)-认知服务(3)

目录 OpenFileDialog 类上一节代码的API剖析ComputerVisionClientExtensions.ReadAsync MethodReadHeaders ClassReadHeaders.OperationLocation Property探索ReadHeaders加上调试代码可用于 Azure 认知服务的身份验证标头使用单服务订阅密钥进行身份验证使用多服务订阅密钥进行…...

aws apigateway 使用restapi集成lambda

参考资料 代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...

HTML基础

HTML 基础 文章目录HTML 基础列表标签无序列表有序列表自定义列表表格标签表格基本标签表格基本结构表格完整结构&#xff1a;合并行和合并列表单标签input 系列标签属性标签text 标签radio 标签 单选框file 标签 文件选择button 标签 按钮input系列标签总结button按钮标签sele…...

ThreadPoolExecutor参数 keepAliveTime allowCoreThreadTimeOut

/*** Timeout in nanoseconds for idle threads waiting for work.* Threads use this timeout when there are more than corePoolSize* present or if allowCoreThreadTimeOut. Otherwise they wait* forever for new work.*/ private volatile long keepAliveTime;等待工作的…...

什么是Hibernate框架?

简单介绍&#xff1a;Hibernate框架是当今主流的java持久层框架之一&#xff0c;是一个开放源码的ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;它对JDBC进行了轻量级的封装&#xff0c;使得JAVA开发人员可以使用面向对象的编…...

指针面试笔试题练习

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨星光…...

docker(三)仓库的搭建、官方私有仓库的加密和认证

文章目录一、docker仓库二、仓库Registry工作原理三、搭建本地私有仓库四、配置镜像加速器五、私有仓库的加密认证1.非加密下上传拉取2.insecure registry3.仓库加密4.仓库认证一、docker仓库 什么是仓库 Docker 仓库是用来包含镜像的位置&#xff0c;Docker提供一个注册服务器…...

FPGA实现SDI视频编解码 SDI接收发送,提供2套工程源码和技术支持

目录1、前言2、设计思路和框架SDI接收SDI缓存写方式处理SDI缓存读方式处理SDI缓存的目的SDI发送3、工程1详解4、工程2详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案&#xff1a; 一是使用专用编解码芯片&#xff0…...

Android 基础知识4-3.5 RadioButton(单选按钮)Checkbox(复选框)详解

一、RadioButton&#xff08;单选按钮&#xff09; 1.1、简介 RadioButton表示单选按钮&#xff0c;是button的子类&#xff0c;每一个按钮都有选择和未选中两种状态&#xff0c;经常与RadioGroup一起使用&#xff0c;否则不能实现其单选功能。RadioGroup继承自LinearLayout&a…...

用代码实现解析解的方式求解_梯度下降法思路_导函数有什么用_接23节---人工智能工作笔记0026

这里24节,25节,介绍了一下人工智能高等数学要学习的一些内容,初步了解了一下,微积分中用到的知识~微分~以及导数这里... 然后接着23节,我们还是继续,走人工智能的主线,先把整体的人工智能的内容学习一遍,然后再去回去看数学知识更有目的性. 然后首先来回顾一下,这里机器学习,其…...