目录

  • 布隆过滤器

    • 什么是布隆过滤器
    • 原理简介
    • 数学推导
    • 空间占用情况

布隆过滤器

昨天突然看到了一个布隆过滤器的介绍和一些用法,感觉很新奇,也很有意思,刚好趁着周末来写一篇博客。

什么是布隆过滤器

布隆过滤器?难道是这个?E起来,然后阻挡地方的飞行道具并减少伤害?

NO!NO!NO!当然不是这个,一篇技术博客怎么会扯到游戏呢?来来来,让我们先看一下布隆的E技能。

坚不可摧 E 消耗法力:30/35/40/45/50冷却时间:18/16/14/12/10 布隆朝一个方向举起盾牌,持续3/3.25/3.5/3.75/4秒,并使来自目标方向的第一次攻击变得无效。布隆还将拦截敌方的飞行道具,并将它们摧毁,减少30/32.5/35/37.5/40%的后续伤害。在举盾期间,布隆获得10%移动速度加成。

首先,我们设想一个场景,在某次开发中,你被要求你的网站的用户名不能重复,你应该怎么做?第一感觉当然就是将用户名存到数据库中间,然后当用户注册的时候,查看数据库是否存在这个用户名即可。可是,当你的网站用户量很大的时候比如说一亿,查询数据库毋庸置疑是一个耗时的操作,这个时候,你突然想到了哈希表,因为你知道哈希表的查询时间复杂度是O(1),可是我们可以算一下,一个用户名为四个汉字,一个汉字占用两个字节(Unicode情况下),那么一共有八亿个字节。一共占用763M的内存(这个里面不包括对象占用的空间,也不包括哈希表中浪费的空间),而实际情况占用的空间会比这个多得多。

那么有什么好方法解决这个问题呢?这个就是我们要讲的布隆过滤器。首先我们以布隆的技能来形象的解释下布隆过滤器的优缺点:

  • 并使来自目标方向的第一次攻击变得无效:如果布隆过滤器判断数据不存在则数据绝对不存在。
  • 布隆还将拦截敌方的飞行道具:这个就是布隆过滤器的特点,数据先经过布隆过滤器,查询数据是否已经存在。如果布隆过滤器判断用户名不存在/或者存在,数据才能够继续向下走。
  • 减少30/32.5/35/37.5/40%的后续伤害:在前面的判断中,可以判断数据绝对不存在,但是如果判断数据存在,则数据也可能不存在
  • 技能加点是不能取消的:布隆过滤器只能插入数据,而不能删除数据。

原理简介

布隆过滤器的原理和哈希表的原理有点类似,同样需要使用hash函数,但是在布隆过滤器中,需要使用多个hash函数。布隆过滤器的原理还是比较简单的。

我们有一个数组bitArray,对,就是一个位数组,长度位m。只存0和1那种。此时我们有一个key,和k个hash函数,因此我们可以得到k个key被hash过后的数。然后我们分别对hash过后的值取余(对m取余)得到x,然后将bitArray中x位置置为1。

原理图片如下所示(图片来源)

在前面我们介绍过布隆过滤器如果判断数据存在,实际上数据也可能不存在。如果将布隆过滤器应用于垃圾邮件过滤系统,则就会出现“宁可错杀一千,也决不放过一个”的这种情况。那么为什么会造成这种情况呢?实际上,这就和哈希表中哈希冲突的情况一样,因为可能会出现两个key值经过k个hash函数之后,取余之后的结果是一样的。所以,在布隆过滤器中可能会出现误判,所以有一个概念叫做误算率。

数学推导

上面我们知道布隆过滤器中,有一个误算率,当然我们是想将误判降低到最小(key的数量和数组bitArray的长度都是确定的)。so,让我们用数学公式来推导一下。

首先我们有n个key,bitArray的长度位m,hash函数的个数是k,失误率是p(一般很小),推导如下:

  1. 误判的概率:

    如果hash函数足够优秀(每一个key都等概率的分配到数组中的某一个位置)。对于一个hash函数来说,bitArray中某个位置被置1的概率是\(\frac{1}{m}\),则不被置1的概率是\(1-\frac{1}{m}\),因为我们有k个hash函数,所以在k个hash函数中,某个位置不被置1的概率是:
    \[ (1-\frac{1}{m})^k \]
    因为插入了n个key,某个位置置1的概率是:(不被置1的概率是\((1-\frac{1}{m})^{kn}\))
    \[ 1-(1-\frac{1}{m})^{kn} \]
    如果我们此时去查询某个key是否存在,出现误判(也就是说在bitArray中k个位置都出现了1)的概率是:
    \[ [1-(1-\frac{1}{m})^{kn}]^{k} \]

  2. 选择最小的误判概率:

    根据数学知识我们知道:

\[ lim_{n\rightarrow+\infty}(1+x)^{\frac{1}{x}} = e \]

​ 所以:
\[ [1-(1-\frac{1}{m})^{kn}]^{k} = [1-(1-\frac{1}{m})^{-m\frac{-kn}{m}}]^{k} = [1-e^{\frac{-kn}{m}}]^k \]
​ 然后令\(a=e^{\frac{-n}{m}}\) ,因此概率是:
\[ f(k)=(1-a^{k})^k \]
我们需要求得便是\(f(k)\)的最小值。对\(f(k)\)进行变换求导:
\[ \begin{align}&f(k) = (1-a^k)^k \\&lnf(k) = kln(1-a^k) \\&然后进行求导\\ &\frac{1}{f(k)}f'(k) = ln(1-a^k) - \frac{ka^klna}{1-a^k}\\&\because a=e^{\frac{-n}{m}} \\&\therefore a < 1\\&\therefore 0< f(k)=(1-a^{k})^k <1\\&令f'(k) = 0,则 ln(1-a^k) - \frac{ka^klna}{1-a^k} =0\\&\therefore (1-a^k)ln(1-a^k) = ka^klna = a^kln{a^k}\\&\therefore (1-a^k) = a^k \\&\therefore a^k = \frac{1}{2}\\&\therefore e^{\frac{-nk}{m}} = \frac{1}{2} \\&\therefore \frac{nk}{m} = ln2 \\&\therefore k = \frac{mln2}{n} = 0.7\frac{m}{n}\\&所以误判率p是:\\&[1-e^{\frac{-kn}{m}}]^k = (1-e^{ln\frac{1}{2}})^{\frac{mln2}{n}} \\&=(\frac{1}{2})^{-ln2\frac{m}{n}}\\&≈0.6185^\frac{m}{n}&\end{align} \]
从上面我们可以知道,如果想让误判率一直维持稳定,那么则m和n要维持线性增加。当然,如果是其他变量保持不变,也可以用上面的方法进行求出。

空间占用情况

在这里我们可以很简单的看出来,使用布隆过滤器之后,空间占用率还是蛮低的,还是以上面的例子举例:有一亿个用户,在我们保证保证错误率位0.01%的情况下,我们需要大概19亿位的空间来保存数据(大约是230M的空间)。其中需要的散列函数的个数\(k=13\)。相比前面还是节省了蛮多的空间。

markdown 写数学公式还是蛮爽的(●'◡'●)

转载于:https://www.cnblogs.com/xiaohuiduan/p/11488020.html

布隆过滤器及其数学推导相关推荐

  1. 什么是高并发高可用一致性?| 现代网站架构发展 | C 语言实现布隆过滤器

    大话高并发高可用一致性|网站架构发展|网络编程缓存|C 语言实现布隆过滤器 Bloom Filter 编程练习 | GTest 教程 两个部分分为本文章,一部分是布隆过滤器的实现指引. 一个提供的前置 ...

  2. Redis进阶:布隆过滤器(Bloom Filter)及误判率数学推导

    1 缘起 有一次偶然间听到有同事在说某个项目中使用了布隆过滤器, 哎呦,我去,我竟然不知道啥是布隆过滤器, 这我哪能忍?其实,也可以忍,但是,可能有的面试官不能忍!!! 于是,查询了布隆过滤器的相关知 ...

  3. 布隆过滤器(Bloom Filter)- 原理、实现和推导

    目录 算法背景 布隆过滤器–概念 布隆过滤器-原理 布隆过滤器-缺点 布隆过滤器-实现 布隆过滤器-应用 布隆过滤器-公式推导 算法背景 问题: 在开发中,经常要判断一个元素是否在一个集合中. 实现方 ...

  4. 《数学之美》第23章 布隆过滤器

    1 布隆过滤器的原理 一般来讲,计算机中的集合是用散列表(Hash Table)来存储的,优点是速度准确,缺点是耗费存储空间. 布隆过滤器是由伯顿布隆于1970年提出的.它实际上是一个很长的二进制向量 ...

  5. 布隆过滤器定义长度为m的数组,插入n个元素,k个哈希函数,已知m和n的值,k的值为多少时,求误判率最低的推导过程?

    布隆过滤器是怎么存储数据的? 这里m=11,数组长度为11,n=3,插入3个元素,分别是hello.how.yes,k=3,使用了3个哈希函数,每插入一个元素要经过三个哈希函数的运算. ①插入hell ...

  6. 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想

    转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

  7. 布隆过滤器(Bloom Filter)原理及优缺点剖析

    直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中. 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储 ...

  8. Redis bitmap、hyperlog、布隆过滤器、RoaringBitmap原理应用场景与日活的统计的具体应用

    传统方案-mysql 缺点: 1.空间占用大 2.统计逻辑复杂,比如 统计最近 30 天用户的累计活跃天(每个用户在 30 天里有 N 天使用 app,N 为 1-30,然后将月活跃用户的 N 天加总 ...

  9. [大数据处理]——布隆过滤器

    布隆过滤器 说到布隆这两个字大家可千万不要认为我们这里讲的是英雄联盟中的布隆大叔,今天我们所讲的布隆过滤器是一种大数据处理利器,他是由布隆算法Bloom Filter音译而来,是以Bitmap集合为基 ...

最新文章

  1. 综合评价模型的缺点_浅谈交通影响评价中不同交通预测方法的特性
  2. 【原创】POSTGRESQL 分区表初次体验
  3. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)
  4. Java内存模型与happens-before原则
  5. U盘启动盘恢复原来的大小
  6. 传统公司部署OpenStack(t版)简易介绍(六)——neutron模块部署
  7. Spring Boot功能实战
  8. 如何利用tcpdump抓包?
  9. 今天主要改了罗宾钢琴的首页图片缩放问题
  10. (2016弱校联盟十一专场10.2) E.Coins
  11. UE4 android开发
  12. SCI期刊名英文缩写查询
  13. 笔记本电脑怎么拆开后盖_联想笔记本电脑怎么拆开后盖_联想笔记本怎么拆
  14. Python属性使用@property和不使用@property的差别
  15. 实现网站二维码扫描登录
  16. 计算广告(五):搜索与竞价广告
  17. 安卓的网络视频播放器(简易版)
  18. iOS常用的第三方库
  19. longitudinal models | 纵向研究 | mixed model
  20. 传奇怎么设置不显示服务器,如何将传奇服务器未知神殿地图修改为不限制进出...

热门文章

  1. basic code
  2. LeetCode: Word Ladder
  3. VC++即时通讯+视频会议源码
  4. 【京东科技】视觉基础研究部研究型实习生招聘
  5. CVPR 2021 |针对强时序依赖,即插即用、混合注意力机制的 ACTION 模块
  6. 阿里箫疯:AI对抗攻击—原理及预防 (精彩直播回放)
  7. 迁移学习:迈向真正的人工智能
  8. C语言编程笔记丨一种很酷的 C 语言技巧
  9. 宠物狗图片分类之迁移学习代码笔记
  10. ResNet到底深不深?