布隆过滤器雏形

未完待续.....

计算错误率

现在有一个空额布隆过滤器, 过滤器里的bit array的大小是m. 咱来插入一个元素. 这次插入过程中的第一个hash函数会算出一个位置, 然后把这个位置设置为1. 此时如果在这个过滤器中随机选取一个位置, 这个位置的值是1的概率为:

    (式①)

这个位置的值是0的概率为:

    (式②)

插入这个元素需要进行k个hash运算, 然后把相应的位置的值都改为1. 这个元素插入完之后, 从这个过滤器中, 随机取一个位置, 这个位置的值是0的概率为:

   (式③)

这个位置的值是1的概率为:

   (式④)

如果在这个布隆过滤器中, 插入了n个元素. 然后随机取其中一个位置, 这个位置的值是0的概率为:

    (式⑤)

这个位置的值是1的概率为:

    (式⑥)

现在这个布隆过滤器里有n个元素. 现在来了一个新元素. 这个新元素用k个hash函数, 分别计算了hash值, 结果k个位置在之前就已经被设置为了1. 这就是错误了, 把不存在于集合中的元素, 判断为了在集合中, 被称为假阳性. 这种情况的概率是:

    (式⑦)

上面式子整理一下指数nk, 就等价于下面这个式子:

    (式⑧)

这是一个极限公式:

上面的式⑧可以根据这个极限公式, 转化为下面这个式子:

    (式⑨)

函数 f 就是误判率了.

最优的哈希函数个数

根据上面这个公式, 可以将 f 转化为:

  (式⑩)

式10的表达式太长了...咱们引入两个新的符号p 和 g :

咱们回到话题"最优的hash函数个数k".

k是自变量, f是因变量. 让 f 取值最小的那个k值, 就是最有解. 也就是最优的hash函数个数.

让f最小, 也可以转化为: 让g最小. 所以咱们求一下"令g值最小的k值"

 (式⑪)

把上面这个k带入到g中, 可以得到:

想让g取最小值, 其实就是让 ln(p) * ln(1-p)  取最大值.

当p = 1/2 时 . ln(p) * ln(1-p) 取最大值. 也就是 g 取最小值. 也就是 f 取 最小值.

将 p = 1/2 带入式11, 得:

位数组的大小

咱们模拟一个场景: 使用布隆过滤器来做URL的过滤. 将含有不良信息的URL作为黑名单, 存入到布隆过滤器中, 进行过滤.

咱么假设全世界有u个URL. 其中有n个是含有不良信息的. 布隆过滤器的 `位数组` 的大小是m.

咱们把这n个黑名单URL插入到布隆过滤器中.

这n个URL, 在被访问时, 会直接被布隆过滤器判定为含有不良信息的URL.

但是如果布隆过滤器的误判率是ϵ的话, 那么会有 ϵ*(u - n) 个元素, 明明是正常的URL, 却会被布隆过滤器认定为是含有不良信息的URL.

在这个场景中, 布隆过滤器的作用就是判断URL, 判断并过滤掉有不良信息的URL. 他会正确地判断出n个黑名单URL, 还会误判ϵ*(u - n) 个URL.

所以这个布隆过滤器, 会过滤 n + ϵ*(u - n) 个URL. 而当前的布隆过滤器中, 实际只有n个元素.

所以当前的布隆过滤器的`位数组`的状态, 可以表示的集合数量为:

 (式⑫)

式⑫只是在刚才的那个特定条件下的`位数组`可以表示的集合数量.

如果咱们改变布隆过滤器的其中一个位. 那么此时就表示了新的ω个集合.

刚刚讲了, 只要改动其中一个位, 新的`位数组`就可以表示新的ω个集合. m 位的`位数组`共有 2m 个不同的组合来进行改变. 进而可以推出, m位的`位数组`可以表示的集合数量为:

全集中 n个元素的集合总共的数量为:

要让 m 位的位数组能够表示所有 n 个元素的集合, 必须有:

整理一下, 也就是:

如果n 远小于 ε·u

 (式⑬)

接下来咱们对于上式中的真数进行计算:

所以, 式⑬中的:

于是我们得出结论1 : 在错误率不大于 ϵ 的情况下, m 至少要等于 才能表示任意 n 个元素的集合.

在计算错误率的小节中, 最后得出了式⑨:

在计算最优函数个数的小节中, 定义了:

而且在最后p = 1/2 时, 为最优函数个数.

又根据上面小节的式⑪:

在取最优函数个数的时候:

咱们令 f ≤ ε

其中 

于是我们有了结论2:  如果想采用最优函数个数, 那么m值就得是结论1的 1.44倍.

总结一下结论1 和 结论2 :

如果想保证错误率不大于ε. 那么就m的最小值就得是

如果hash函数的个数想取最优值, 那么m的最小值就得是 

 

(式①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯)

[1].<<数学之美>>第23章. 作者: 吴军

[2].https://blog.csdn.net/maoke2005191/article/details/78977277

布隆过滤器(Bloom Filter) 未完待续的更多相关文章

  1. [转载]布隆过滤器(Bloom Filter)

    [转载]布隆过滤器(Bloom Filter) 这部分学习资料来源:https://www.youtube.com/watch?v=v7AzUcZ4XA4 Filter判断不在,那就是肯定不在:Fil ...

  2. 【面试突击】-缓存击穿(布隆过滤器 Bloom Filter)

    原文地址:https://blog.csdn.net/fouy_yun/article/details/81075432 前面的文章介绍了缓存的分类和使用的场景.通常情况下,缓存是加速系统响应的一种途 ...

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

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

  4. 布隆过滤器(Bloom Filter)的原理和实现

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  5. [转载] 布隆过滤器(Bloom Filter)详解

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

  6. 布隆过滤器(Bloom Filter)详解

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

  7. 浅谈布隆过滤器Bloom Filter

    先从一道面试题开始: 给A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL. 这个问题的本质在于判断一个元素是否在一个集合中.哈希表以O(1) ...

  8. 布隆过滤器 Bloom Filter 2

    date: 2020-04-01 17:00:00 updated: 2020-04-01 17:00:00 Bloom Filter 布隆过滤器 之前的一版笔记 点此跳转 1. 什么是布隆过滤器 本 ...

  9. 布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)

    布隆过滤器解决"面试题: 如何建立一个十亿级别的哈希表,限制内存空间" "如何快速查询一个10亿大小的集合中的元素是否存在" 如题 布隆过滤器确实很神奇, 简单 ...

随机推荐

  1. quartz定时任务cron表达式

    cron 表达式格式:秒 分 时 日 月 周 年(可选) 子表达式范围 字段名 字段解释 值范围 特殊字符 Seconds 秒 0~59 , - * / Minutes 分 0~59 , - * / ...

  2. [idea] SpringBoot整合swagger2实现CRUD

    一:创建SpringBoot ,在pom.xml文件中加入jar包 <dependency> <groupId>io.springfox</groupId> < ...

  3. R语言学习——图形初阶之折线图与图形参数控制

    plot()是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化):plot(x,y,type="b")表示将x置于横轴,y置于纵轴,绘制点集(x,y),然后使 ...

  4. LA3971 组装电脑

    思路:二分,就是在不超过b的预算下,使得品质的最小值最大化.关键还是判断函数吧. 假设答案为x,判断函数,就是每一个种类的配件的品质最基本的品质要大于x,然后找出最小的值.这样的配件品质之和的价格要小 ...

  5. 3Openwrt自定义CGI实现 前后端交互

    https://www.cnblogs.com/163yun/p/9834993.html 安装uhttpd. 在编译openwrt前,输入make memuconfig,查找Network -> ...

  6. 【vue】iView-admin2.0动态菜单路由

    vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...

  7. MYSQL GTID position

    MySQL5.6 新特性之GTID - jyzhou - 博客园 http://www.cnblogs.com/zhoujinyi/p/4717951.html MySQL · 答疑释惑 · GTID ...

  8. Nginx配置http跳转https访问

    Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 server{ listen ; s ...

  9. vagrant三网详解(团队/个人开发必看) 转

    vagrant三网详解(团队/个人开发必看)   Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点. 一.端口映射(Forwarded port) 顾名思义是指把宿主计算机 ...

  10. python工程师成长之路精品课程(全套)

    python工程师成长之路精品课程(全套)  有需要联系我:QQ:1844912514 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加易学.易读,非常适合快速开发. ...