什么是Bloom Filter

先来看这样一个爬虫相关问题:文件A中有10亿条URL,每条URL占用64字节,机器的内存限制是4G,现有一个URL,请判断它是否存在于文件A中(爬过的URL无需再爬)。如果有很多个URL需要判断呢?

分析之后我们可以发现,这就是快速query问题,通常查操作居多,写操作较少。要快速判断一个URL是否在文件A中,由于

\[{1,000,000,000*64 B = 64,000,000,000 B ≈ 60GB } \]

而60G是放不进内存的,所以逐个读入内存判断的话,时间复杂度起码是O(10亿),这显然不能满足要求。如何节约内存又可以节省时间才是关键!Bloom Filter就是解决这种问题的数据结构,主要是能很好地节省内存。

原理简析

Bloom Filter (下简称BF)在海量数据方面的处理表现不错,它的内部需要的结构有:

  • hash函数k个,hashfun[k]
  • 位图bitset[m],且m>k;

一个URL依次经过k个hash函数后得到k个数字,设为\({X_i}\),置bitset[\({X_i}\)] = 1。先将A文件中的URL都这样处理,那么得到的bitset就是记录了与文件A相关的信息。将60GB的文件信息压缩成m个bit,如果能很好利用这m个bit,那内存将大大减少。


如何利用bitset[m]

对于每个询问的URL,经过这k个hash函数之后同样能得到k个数字,设为\({Y_j}\),如果有

\[{1= bitset[{Y_1}]\& bitset[{Y_2}] \& } \cdots {\& bitset[{Y_k}]}\]

说明此URL可能存在于A中,但是目前不能确定是否存在;如果有

\[{0= bitset[{Y_1}]\& bitset[{Y_2}] \& } \cdots {\& bitset[{Y_k}]}\]

那就可以确定此URL不在A中。对于此URL是否一定存在于文件A中,Bloom Filter无法给出肯定的答复。设n为数据量(即10亿),m为bitset大小(即槽个数),k为hash函数个数,则它的错误率公式是

\[{F(n,m,k) = [1-(1-\frac{1}{m})^{kn}]^{k}≈(1-e^{\frac{-kn}{m}})^{k}}\]

从上式中知道,

  • n=0时,F(n,m,k)=0
  • n=+∞时,F(n,m,k)=1,即百分百错误;

看回最上面的问题,文件A在4GB内存中能达到的最低错误率是多少?

其实有3个因素决定了错误率,nmk,其中n与数据量挂钩,m与空间挂钩,k与时间挂钩,既然n已固定为10亿,m已固定约为32Gb,那么k的大小将决定错误率的大小。分析一下,预处理时需要先将n个数据都进行hash成k个数,所以时间复杂度为O(n*k),而预处理完后每个查询仅需时间复杂度O(k)。

关于证明,如果有兴趣可以去维基上看。

Bloom Filter特点

  • 算法简单,实现方便(百行以内)。
  • 时空复杂度灵活,时间与空间上的控制相对比较容易。
  • 无法实现确定性判断,但可以配合其他算法再次降低错误率。
  • 操作的集合不能删除,即信息添加到bitset中后就无法取出。

Bloom Filter (海量数据处理)的更多相关文章

  1. 海量数据处理算法—Bloom Filter

    海量数据处理算法—Bloom Filter 1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bl ...

  2. 海量数据处理之Bloom Filter详解

    前言 :  即可能误判    不会漏判   一.什么是Bloom Filter     Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函 ...

  3. 【转】海量数据处理算法-Bloom Filter

    1. Bloom-Filter算法简介 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在于 ...

  4. 海量数据处理 从哈希存储到Bloom Filter(1) (转载)

    先解释一下什么是哈希函数.哈希函数简单来说就是一种映射,它可取值的范围(定义域)通常很大,但值域相对较小.哈希函数所作的工作就是将一个很大定义域内的值映射到一个相对较小的值域内. 传统的哈希存储 假设 ...

  5. 大数据处理-Bloom Filter

    大数据处理--Bloom Filter 布隆过滤器(Bloom Filter)是由巴顿.布隆于一九七零年提出的.它实际上是一个很长的二进制向量和一系列随机映射函数. 如果想判断一个元素是不是在一个集合 ...

  6. 海量信息库,查找是否存在(bloom filter布隆过滤器)

    Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...

  7. 大数据处理算法--Bloom Filter布隆过滤

    1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bloom Filter(BF)是一种空间效率很 ...

  8. july教你如何迅速秒杀掉:99%的海量数据处理面试题

    作者:July出处:结构之法算法之道blog 以下是原博客链接网址 http://blog.csdn.net/v_july_v/article/details/7382693 微软面试100题系列 h ...

  9. Bloom Filter解析

    布隆过滤器简介:https://www.cnblogs.com/Jack47/p/bloom_filter_intro.html 布隆过滤器详解:原文链接:http://www.cnblogs.com ...

随机推荐

  1. C/C++中qsort()以及sort()的用法

    最近学弟们问快速排序的比较多,今天自己就做一下总结,快速排序在库函数里面有现成的,不用自己实现,调用一下就可以达到自己想要的结果,掌握以后就可以完全摒弃冒泡和选择了,并且时间复杂度也从O(n*n)提升 ...

  2. Common Subsequence(最长公共子序列)

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...

  3. Python中的sin和cos函数

        1 第一次使用math.sin()和math.cos(),可是发现结果不对,比如Math.sin(90)=0.893996663600,奇怪? 2 3 一查,原来sin(x) \n\n Ret ...

  4. connect to 10.104.11.128 port 9999 (tcp) failed: No route to host

    问题: iptables当找到匹配的规则时,就会执行相应的动作,而不会向下继续匹配. 可以看到https没有添加,匹配不到规则,所以就会包错 解决方法: iptables -I INPUT -p tc ...

  5. Troubleshooting ORA-201 and ORA-202 Error

    ---- 3. When lowering the value of COMPATIBLE: You cannot start the database with lower compatibilit ...

  6. c++11 多线程 1

    第3章 线程间共享数据 本章主要内容 共享数据带来的问题 使用互斥量保护数据 数据保护的替代方案 保护共享数据结构的最基本的方式,是使用C++标准库提供的互斥量(mutex). 清单3.1 使用互斥量 ...

  7. Big Data Opportunities and Challenges(by周志华)论文要点

    大数据环境下的机器学习 三种误解:模型不再重要(大量数据上复杂模型依然提升显著,大数据是的复杂模型充分利用数据且难以过拟合),相关性就足够了(因果关系重要性无法被替代),以前的研究方向不再重要(高性能 ...

  8. matlab 图像和 opencv 图像的相互转换

    matlab可以生成C++代码, 但是在涉及图像数据的时候,要注意数据格式的转换. 1. Matlab图像数据在内存中的存放顺序是R通道图,G通道图,B通道图.对于每个通道,数据存放是先列后行. 2. ...

  9. 用一层for循环初始化三维数组

    ][][]; ; i < * * ; i++) { a[i / ][(i / ) % ][i % ] = i; printf(, (i / ) % , i % ); // printf(&quo ...

  10. 安装weblogic步骤

    1 mkdir -p /home/geekc3t/weblogic 创建weblogic安装目录2 groupadd weblogic 创建weblogic组3 useradd -g weblogic ...