首页 > 其他分享 >布隆过滤器原理及实现

布隆过滤器原理及实现

时间:2023-08-22 20:01:18浏览次数:35  
标签:概率 frac 布隆 kn 哈希 过滤器 原理

1. 原理

布隆过滤器拥有K个哈希函数,当一个元素要加入布隆过滤器时,会使用K个哈希函数对其进行计算,得到K个哈希值,然后根据哈希值,在一维数组中把其对应下标的值置位1。

要判断某个数是否在布隆过滤器中,就进行K次哈希计算,得到哈希值,然后在位数组中判断哈希值对应位置是否都为1,如果都为1,就说明这个值可能在布隆过滤器中,需要进一步确认。

如果一个值不在过滤器中,那么他一定不存在,如果一个值在过滤器中,他并不一定存在,需要进一步确认

2. 误报率

误报率:一个不存在的值,其K个Hash值所对应位置都为1的概率。

推导

解释

m: 过滤器位数组长度
n:插入元素的个数
k:哈希函数的个数
p:假阳性(误报)概率

假定

  1. 位数组长m位
  2. 哈希函数对每个位置等概率插入
  3. 一共K个哈希函数
  4. 向bloom过滤器中插入n个值

那么

  1. 任意一位被设置为1的概率为\(\frac{1}{m}\)

  2. 不被设置为1的概率就是\(1-\frac{1}{m}\)

  3. 经过K个哈希函数,仍未被设置为1的概率就是\((1-\frac{1}{m})^k\)

  4. 插入n个值后,仍未被设置为1的概率是\((1-\frac{1}{m})^{kn}\)

    可变形为\(((1-\frac{1}{m})^{-m})^\frac{-kn}{m}\)

    对其中的\((1-\frac{1}{m})^{-m}\)进行变形

\[(1-\frac{1}{m})^{-m} \\ 令t = -m,有(1+\frac{1}{t})^t \\ 当t足够大时,由e的定义 \\ e=\displaystyle\lim_{x->\infty}(1+\frac{1}{x})^x \\ 所以, \displaystyle\lim_{m->\infty}(1-\frac{1}{m})^{-m} = e \\ \\ 因此, ((1-\frac{1}{m})^{-m})^\frac{-kn}{m} \approx e^{\frac{-kn}{m}} \]

  1. 被设置为1的概率就是

    \(1-e^{\frac{-kn}{m}}\)

  2. 现在要误报率,即K个散列函数计算出的位置的值都是1,这个概率是

    \(p = (1-e^{\frac{-kn}{m}})^k\) --公式1

随着m(位数组大小)的增加,假阳性概率会下降,同时随着插入元素个数n的增加,假阳性概率又会上升。

人们对上述公式进行分析后发现,对于给定的m和n,当 k=\(\frac{m}{n}\ln2\approx\frac{m}{n}*0.7\) 的时候p最小

将上述k的最佳值带入公式1,可得

\({\displaystyle p =\left(1-e^{-({\frac {m}{n}}\ln 2){\frac {n}{m}}}\right)^{{\frac { m}{n}}\ln 2}}\)

化简可得\(m=-\frac{n\ln^p}{(\ln2)^2}\),由此得出m的最佳值

上述公式怎么用?

当创建布隆过滤器时,用户需要提供预计插入的元素个数n和可接受的误报率p

  1. 通过n和p算出m
  2. 通过n和m算出k

3. golang实现

仿照guava完成,hash函数用的是golang提供,代码很简单,不到100行

https://github.com/INnoVationv2/corekv_diy/tree/bloom-filter

标签:概率,frac,布隆,kn,哈希,过滤器,原理
From: https://www.cnblogs.com/INnoVationv2/p/17649559.html

相关文章

  • 造成通信频段的变化的原理
    通信频段的变化主要是由频率规划的需要和无线电波传播的特点所决定的。随着各种通信技术的发展,可用的频谱资源变得越来越紧张,因此必须不断开发新的频段以满足通信需求。无线电波的传播特性会随频率的变化而变化。在低频段,电波传播的距离较短,损耗较大,但是由于可用频谱较宽,因此具有......
  • 跳槽前,最后撸一遍 Webpack 核心原理、babel、性能优化!
    又到一年金三银四,面试官今年最爱问点啥?说起前端工程师进阶,Webpack是一个绕不开的话题,每年都会很多新面试题源源不断的涌来,例如:Webpack的打包原理是什么?什么是loader,什么是plugin?什么是模热更新?有什么优点?Webpack之于前端,正如同gcc/g++之于C/C++。不论你用React、Vue还是Angu......
  • 【新手必备】Flutter开发入门实战详解,带你学习Flutter原理
    前言跨平台开发过于复杂不易实施而且性能不足,而Flutter的出现打破了这种尴尬的局面。Flutter与weex、reactnative相比,性能更强高流畅度,接近native,Flutter对于Android和IOS开发者来说,非常容易上手。特点Flutter采用Dart语言开发,Dart语言相当于Java的改进版本,语法跟Scala相近,提供了......
  • “梯度下降法”的原理
    梯度下降法是一个用于优化多变量函数的迭代方法。在深度学习和机器学习中,通常用它来优化损失函数,从而找到一个模型的最优参数。以下是梯度下降法的原理详解:目标:我们的目标是找到函数(f(\theta))的最小值,其中(\theta)是一个参数向量。在机器学习中,这个函数通常是损失函数或代价......
  • python @property装饰器实现原理
    @property装饰器可以使一个对象的方法变成属性访问,比较方便,那么它是如何实现的呢?下面是一个自己动手实现的例子:classMyProperty:def__init__(self,fget=None,fset=None):self.fget=fgetself.fset=fsetdef__get__(self,instance,o......
  • knn 算法的实现原理是怎样的
    K最近邻(K-NearestNeighbors,简称KNN)算法是一种用于分类和回归的基本机器学习算法。其原理是基于样本之间的距离度量,通过找出离待预测样本最近的K个训练样本,利用这K个样本的标签信息进行分类或回归预测。主要思想就是物以类聚人以群分的思想,关键就是KNN中K近邻中K的确定,和距离的定义......
  • 设计原理图:FMC141-四路 250Msps 16bits AD FMC子卡
     一、产品概述:   本板卡基于 FMC 标准板卡,实现 4 路 16-bit/250Msps ADC 功能。遵循 VITA 57 标准,板卡可以直接与xilinx公司或者本公司 FPGA 载板连接使用。板卡 ADC 器件采用 ADI 公司 AD9467 芯片,用户可以通过 FMC 接口配置芯片工作状......
  • java垮平台的原理-垃圾回收-day1
    目录1.跨平台原理2.垃圾回收1.跨平台原理2.垃圾回收(1)Java消除了程序员回收内存空间的职责,提供了系统级别的线程,跟踪内存空间的分配情况,在jvm空闲时,检查并释放内存,而C++,需要开发人员自己回收内存。(2)垃圾回收是在程序运行的过程中自动运行,程序员无法干预。(3)GC--垃圾回收......
  • 机械硬盘的工作原理
    机械硬盘1.机械手臂:读取数据2.磁道:存取数据3.扇区:划分磁道,一般划分的单位为521KB4.平均寻道时间:由于工业水平的限制,一般为5ms5.0ms,1r才能找到qq7200r/min=120r/s 1/120=0.0083s=0.83ms(0+0.83)/2=4.15ms平均机械硬盘寻找数据的时间=平均寻道时间+平均延迟时间=5+4.15=......
  • IMAP协议的历史及其工作原理
    IMAP(InternetMessageAccessProtocol)是一种邮件获取协议,它的历史可以追溯到1986年,由美国斯坦福大学研发。然而,尽管IMAP在当时已经存在,但并没有被广泛使用。直到2010年,随着网易的3.2亿免费邮箱用户全面默认开通IMAP服务,并升级服务提供更高级别的SSL加密,IMAP协议才开始得到广泛应用......