布隆过滤器是怎么存储数据的?

这里m=11,数组长度为11,n=3,插入3个元素,分别是hello、how、yes,k=3,使用了3个哈希函数,每插入一个元素要经过三个哈希函数的运算。

①插入hello元素,需要经过3个哈希函数,得出3个不同的哈希值索引【1,3,6】,那么在1,3,6的位置设置为1。

②插入how元素,需要经过3个哈希函数,得出3个不同的哈希索引值【4,8,10】,那么在4,8,10的位置设置为1。

③插入yes元素,需要经过3个哈希函数,得出3个不同的哈希值索引值【0,1,3】,那么在0,1,3的位置设置为1。

④误判的情况:判断ok元素是否存在?ok这个元素经过3个哈希函数运算以后,得出的索引值也是【0,1,3】,这个索引值和yes元素是一样的,然而布隆过滤器认为ok这个元素是存在的,但实际上不存在的,因为哈希值冲突了。

设布隆过滤器的长度为m,插入n个素,进行k个哈希函数运算,已知m和n的值,问:当k的值为多少的时候,误判率最低?

解:

长度为m,插入1个元素,1个哈希函数运算的情况下,某一位是1的概率为:,那么某一位为0的概率就是 

长度为m,插入n个元素,1个哈希函数运算的情况下,一次插入1个元素(每次插入的元素可能有某几次是重复的),插入n次,相当于插入了n个元素,插入这么多次以后,某一位仍然为0的概率是

长度为m,插入n个元素,每插入一个元素之前就经过k个哈希函数运算的情况下,一次插入1个元素,插入n次,相当于插入了n个元素,插入这么多次以后,某一位仍然为0的概率是

反过来,某一位为1的概率就是

那么,某两位同时为1的概率就是 ,某三位同时为1的概率就是 ,某k位同时为1的概率就是,这个概率,就是误判率,因为检查是否有某个元素的时候,某k位同时为1,说明有这个元素,但这个元素是外来的,本身不存在于集合当中。

误判率  ,其中m,n都是常数,求这个函数是最小值的时候,k等于多少?

当m足够大的时候,也就是数组足够长的时候,能够确保误判率足够,此时,把式子变形:

因为m是一个很大的数字,可能是100万,1000万这个数量级别的,足以让趋近于 e

所以,

两边都取ln对数得:

 ,即 

令  ,那么 

两边求导:

因为,且,所以

式子两边同时乘以f(k)得到:

再令 

所以

提出一个

因为k是大于等于1的整数,b是大于1的数字, ,那么,t的取值范围就是(0,1)

那么研究在(0,1)的区间里面的正负性,我们发现当t=1/2 的时候, ,那么,咱们就来研究,这个导函数在区间和区间的正负性。

在研究正负性之前,咱们要先研究的极限和增减性。

首先来看极限:

研究函数  和函数  的极限,因为函数包含了这两种函数,所以咱们要研究它

当x -> 0+ 的时候,使用洛必达法则:

对函数  的分子以及分母 分别求导,得到分子是,分母是,这时候,分别在分子和分母同时乘以,得到,即 ,当x->0+ 的时候, 是趋近于0- 的,所以当x->0+ 的时候,函数  也是无限趋近于0的,并且是负数。

x->0+ 的时候 ,函数是无穷趋近于1的且小于1,是无穷趋近于0的,并且小于0,那么这两个数不是0/0或者∞/∞形式的,就不适用于洛必达法则去求极限了,直接得出极限是函数无穷趋近于0,并且小于0,一个有限的数乘以一个无穷趋近于0的负数,结果肯定是无穷趋近于0。

那么这时候当t->0+ 的时候, ,  不用说,咱们只要能够画出函数的图像,判断函数在区间(0,1)的正负性即可。

函数确认了3个点:

函数图像是怎么经过这3个点的呢?(0,0)和(1,0)是无限趋近的点。

再次对函数求导:

我们通过工具,发现,这个导函数的图像是这样的:

的区间,是单调递减的,

在区间 ,是单调递增的,

在区间 ,是单调递增的,

在区间 , 是单调递减的

知道函数经过了这三个点,(不包括(0,0)和(1,0),只能无穷趋近这两个点),也知道在某些区间的增减性了。

那么在区间,一定是先减后增的,图像必须这么画:

那么在区间,必须是先增后减的,图像必须这么画:

可见函数区间,单调递减,函数区间,,则单调递增,当时,,则

那么,当时候,误判率取得最小值,由于 ,

得出 ,

当知道数组长度m和插入数据量为n的时候,最优的哈希函数个数 k 为  个,(k属于正整数)

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

  1. 【Java】数组逆序操作。定义长度为10的数组,将数组元素对调并输出对调后的结果。

    题目:数组逆序操作.定义长度为10的数组,将数组元素对调并输出对调后的结果. 思路:把0索引和arr.length-1的元素交换,把1索引和arr.length-2元素交换--只要交换到arr.len ...

  2. GNU C的定义长度为0的数组

    原文地址:http://blog.csdn.net/ssdsafsdsd/article/details/8234736 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个 ...

  3. 不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标

    ES5版答案: Object.keys(Array.from({ length: 100 })); ES6版答案: Array.from(Array(100).keys()); loop循环: 1.  ...

  4. java数组逆序操作:定义长度为10的数组,将数组元素对调,并输出对调前后的结果

    public class shuZu2{     public static void main(String[] args){         int[] a = {0,1,2,3,4,5,6,7, ...

  5. js中数组插入、删除元素操作

    /** 删除数组元素:Array.removeArr(index)*/Array.prototype.removeArr = function (index) {if (isNaN(index) || ...

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

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

  7. 什么是布隆过滤器?如何使用?

    欢迎搜索 文章目录 一.布隆过滤器简介 二.布隆过滤器的结构 三.布隆过滤器应用 四.布隆过滤器的优缺点 五.布隆过滤器实战 六.总结 Redis缓存穿透可以通过布隆过滤器进行解决,那么什么是布隆过滤 ...

  8. 哈希(解决哈希冲突,封装map/set,哈希的应用{位图/布隆过滤器})

    文章目录 如何解决哈希冲突: ①闭散列:也叫开放定址法,如果发送哈希冲突了,就去找下一个空位置 ②开散列 -- 拉链法/哈希桶 封装map和set 哈希表的代码 封装的unordered_set 封装 ...

  9. 哈希表、位图、布隆过滤器

    目录 哈希的概念 哈希函数 哈希冲突和解决方法 闭散列 插入 查找 删除 开散列 插入 查找 删除 哈希表(开散列)整体代码 位图 位图模拟实现思路分析: 位图应用 布隆过滤器 本文介绍unorder ...

最新文章

  1. cannot access a closed file
  2. 胶囊网络升级新版本,推特2000+赞,图灵奖得主Hinton都说好
  3. 在无Yum源的环境安装软件(CentOS)
  4. python字符串怎么用_零基础如何使用python处理字符串?
  5. Java BigInteger类| bitCount()方法与示例
  6. ArrayList扩容
  7. Redis-与spring的集成(XML形式)
  8. Java 获取系统信息
  9. jQuery first()和last()函数示例
  10. Hive with as语法
  11. ADS内Smith Chart Utility消失了Palette如何找回
  12. 2019游戏 f1_F1 2019
  13. linux 中signal机制如何应用(一)
  14. NEWLAB之光照度传感综合实验(一)——实验介绍
  15. 【信息泄露】12306恐中招!400万数据遭泄露,请尽快更改密码!
  16. 荣耀play4tpro有没有鸿蒙,荣耀Play4Tpro有没有耳机孔?
  17. 代理商分销订货系统(电脑、H5、小程序、APP)多端全套源码
  18. 仿网易云音乐的滑动冲突处理效果
  19. 从0开始学习python7:Python中词频统计以及sort的排序用法
  20. Android之修改短信程序

热门文章

  1. python如何输出结果至剪贴板_将“print”的输出直接复制到剪贴板
  2. 肥猪流码农的逆袭之路(1)
  3. 如何使用10个小时搭建出个人域名而又Geek的独立博客?
  4. C语言中的hook和bait设计
  5. Win10 解决小娜助手占用过高CPU资源问题
  6. 视频文件头解析之---avi
  7. 怎样才是理想的程序员
  8. Mal-PEG3-acid,518044-40-1亲水性PEG间隔物增加了在水介质中的溶解度
  9. Coursera Python学习笔记(二)数据结构
  10. 基于遗传算法的卷积神经网络架构搜索