zoukankan      html  css  js  c++  java
  • 大数据处理-Bloom Filter

    大数据处理——Bloom Filter

      布隆过滤器(Bloom Filter)是由巴顿.布隆于一九七零年提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。
      如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢。
      Bloom Filter 是一种空间效率很高的随机数据结构,Bloom filter 可以看做是对 bit-map 的扩展, 它的原理是:
      当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:

    如果这些点有任何一个 0,则被检索元素一定不在;
    如果都是 1,则被检索元素很可能在。

      当一个元素被加入集合中时,通过k各散列函数将这个元素映射成一个位数组中的k个点,并将这k个点全部置为1.

      Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注:如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。
    Bloom Filte
    在判断y是否属于这个集合时,对y应用k次哈希函数,若所有hi(y)的位置都是1(1≤i≤k),就认为y是集合中的元素,否则就认为y不是集合中的元素。

    优点

      它的优点是空间效率查询时间都远远超过一般的算法,布隆过滤器存储空间和插入 / 查询时间都是常数O(k)。另外, 散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

    缺点

      有一定的误判率--在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误判为属于这个集合.因此,它不适合那些"零误判"的应用场合.在能容忍低误判的应用场景下,布隆过滤器通过极少的误判换区了存储空间的极大节省.
      但是布隆过滤器的缺点和优点一样明显。误算率是其中之一。随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。

      另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位数组变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全地删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面。这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。
      
    Snip20170628_2

    一个Bloom Filter有以下参数:

    表示 意义
    m bit数组的宽度(bit数)
    n 加入其中的key的数量
    k 使用的hash函数的个数
    f False Positive的比率,错误率(判错率)

    Bloom Filter的f满足下列公式:
    [left ( 1-left ( 1-frac{1}{m} ight )^{kn} ight )^{k} approx left ( 1-e^{frac{-kn}{m}} ight )^{k} ]

    在给定m和n时,能够使f最小化的k值为:(frac{m}{n}ln 2approx frac{9m}{13n}approx 0.7frac{m}{n})
    此时给出的f为:(frac{1}{2}^{k}approx 0.6185^{frac{m}{n}})
    对于任意给定的f,我们有:(n= frac{mln 0.6185}{ln f})
    同时,我们需要k个hash来达成这个目标:(k = -frac{ln f}{ln 2})
    由于k必须取整数,我们在Bloom Filter的程序实现中,还应该使用上面的公式来求得实际的f:
    (f= left ( 1- e^{-frac{kn}{m}} ight )^{k})

    Example

    1、可以快速且空间效率高的判断一个元素是否属于一个集合;用来实现数据字典,或者集合求交集。
    2、使用bloom filter识别恶意链接
    3、检测垃圾邮件
    4、网页URL的去重: A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制4G,让你找出 A,B 文件共同的URL。如果是三个乃至n个文件呢?

    分析 :如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿 bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的 url(注意会有一定的错误率)。”

    http://www.frankyang.cn/2017/10/01/bloom-filter/

  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/yangjiannr/p/Bloom-Filter.html
Copyright © 2011-2022 走看看