zoukankan      html  css  js  c++  java
  • 布隆过滤器(Bloom Filter)

    在大数据的实时处理系统中,累加型的计算(PV统计)可以使用累加器解决;非累加型的计算(UV统计),需要损失一定准确率来保证执行效率,对最终值进行估算。其中一种估算方法便是布隆过滤器。

    BF是一种二进制向量数据结构,拥有很高的空间和时间效率。其基本原理是使用长度为m的位数组M存储集合信息,同时使用k个相互独立的哈希函数K将数据集D映射到位数组空间。通过K的映射,D的每个元素在M中都占有k位,对应的位置置1。计算是个元素是否在D中时,通过K计算映射位置,k个位置全部为1时,表示该元素已存在。否则,表示该元素不在数据D中,此时可以考虑将新增元素加入D,并将M的对应位置置1;也可以不做任何操作,只返回过滤结果(具体视业务情况而定)。

    BF的优点是空间效率和查询效率都远远超过一般的算法,缺点是有一定的误判率(假正例False positives)和删除困难,但是没有漏判的情形(即假反例False negatives),所以,使用BF算法的UV会比真实UV要小。鉴于BF的特点,该算法的使用场景需要允许误判的产生。1)BF为什么会有误判的情况?D通过K映射到M时,某个元素的k个映射值可能会和已有的元素映射完全重叠(不需要和单个元素的映射位置完全重叠),这是该元素就会被误判为已存在。2)BF为什么不会漏判?因为BF不存在将1改为0的操作,所以不会将已加入的元素的映射位置赋值为0。

    说到这里,该说说误差率的问题。实际的应用中往往希望误差率控制在一定的范围,这个应该如何保证呢?首先说说影响误差率的几个因素:数据集大小d,哈希函数K的个数k以及位数组大小m。d越小,m越大,误差率就越小,这两个因素的影响,比较好理解。k对误判率的影响比较复杂:一方面,k越大,有更多的位数组元素置为1,新进入元素被误判的概率就越大;另一方面,一个元素对应的多个位全部为1时才表示为存在,所以k越大,误差率应该越小。数学分析之后的关系如下:Pfp≈(1-e-kd/mk,如果d、m已知,使得Pfp最小的k为k=m/d*ln2。通过公式便可以计算出对应的误判率。

    现实的工程应用中,常常是划定了误差率Pfp,已知了数据集规模d,计算需要多少的硬件资源(这里是内存资源),也就是需要计算出映射空间M的大小m,m=-(d*lnp)/(ln2)2  

    谈到这里,BF的基本思想算是说完了。但是有几个问题需要引申一下:哈希函数应该如何设计?如果只是用来技术,BF算法是否可以改进?

    待续....

  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/Deron/p/5375347.html
Copyright © 2011-2022 走看看