Bloom Filter (海量数据处理)
什么是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个因素决定了错误率,n、m、k,其中n与数据量挂钩,m与空间挂钩,k与时间挂钩,既然n已固定为10亿,m已固定约为32Gb,那么k的大小将决定错误率的大小。分析一下,预处理时需要先将n个数据都进行hash成k个数,所以时间复杂度为O(n*k),而预处理完后每个查询仅需时间复杂度O(k)。
关于证明,如果有兴趣可以去维基上看。
Bloom Filter特点
- 算法简单,实现方便(百行以内)。
- 时空复杂度灵活,时间与空间上的控制相对比较容易。
- 无法实现确定性判断,但可以配合其他算法再次降低错误率。
- 操作的集合不能删除,即信息添加到bitset中后就无法取出。
Bloom Filter (海量数据处理)的更多相关文章
- 海量数据处理算法—Bloom Filter
海量数据处理算法—Bloom Filter 1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bl ...
- 海量数据处理之Bloom Filter详解
前言 : 即可能误判 不会漏判 一.什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函 ...
- 【转】海量数据处理算法-Bloom Filter
1. Bloom-Filter算法简介 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在于 ...
- 海量数据处理 从哈希存储到Bloom Filter(1) (转载)
先解释一下什么是哈希函数.哈希函数简单来说就是一种映射,它可取值的范围(定义域)通常很大,但值域相对较小.哈希函数所作的工作就是将一个很大定义域内的值映射到一个相对较小的值域内. 传统的哈希存储 假设 ...
- 大数据处理-Bloom Filter
大数据处理--Bloom Filter 布隆过滤器(Bloom Filter)是由巴顿.布隆于一九七零年提出的.它实际上是一个很长的二进制向量和一系列随机映射函数. 如果想判断一个元素是不是在一个集合 ...
- 海量信息库,查找是否存在(bloom filter布隆过滤器)
Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...
- 大数据处理算法--Bloom Filter布隆过滤
1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bloom Filter(BF)是一种空间效率很 ...
- july教你如何迅速秒杀掉:99%的海量数据处理面试题
作者:July出处:结构之法算法之道blog 以下是原博客链接网址 http://blog.csdn.net/v_july_v/article/details/7382693 微软面试100题系列 h ...
- Bloom Filter解析
布隆过滤器简介:https://www.cnblogs.com/Jack47/p/bloom_filter_intro.html 布隆过滤器详解:原文链接:http://www.cnblogs.com ...
随机推荐
- [USACO19FEB]Moorio Kart(DP)
Luogu5243 题解 即O(N^2)暴力统计出每个森林的路径,从ctgn个集合中各选出一个数,使得长度>=Y的方案数. 用背包统计.具体实现: \(dp[i+j][0]\leftarrow ...
- js-eval运算符
js中使用eval运算符需要注意—— eval()只有一个参数 传入的参数是字符串时,才会去解析执行:否则,将直接返回这个参数 作用域与调用它的变量作用域保持一致 返回字符串中最后一个表达式或语句的值 ...
- hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会 ...
- ScheduledThreadPoolDemo01
package com.zhy.concurrency.timer; import java.util.Date; import java.util.Timer; import java.util.T ...
- hive表多种存储格式的文件大小差异,无重复数据
-- 重点,目标表无重复数据 -- dbName.num_result 无重复记录 -- 插入数据 CREATE TABLE dbName.test_textfile( `key` string, ` ...
- Ajax传统操作
JavaScript: ...
- 可视化开发_AppInventor2似乎被抛弃了
工具 blockly google,mixly,scratch,app inventor2 的分别 可视化编程,青雀,来自 白鹭 没源码 如果想二次开发呢,初版拖拽控件生成,后期维护的时候找程序员加功 ...
- Python函数调用
1.同级目录下的调用 - src |- mod1.py |- test1.py 若在程序test1.py中导入模块mod1.py,则直接使用 import mod1 或 from mod1 impor ...
- Vertex And Fragment Shader(顶点和片段着色器)
Vertex And Fragment Shader(顶点和片段着色器) Shader "Unlit/ Vertex_And_Fragment_Shader " { Proper ...
- stm32 定时器初步
今天学习STM32 的通用定时器:TIMx (TIM2.TIM3.TIM4 和 TIM5). 定时器比较复杂,功能繁多,这里我们就说最基本的计数功能. 1.定时器的时钟从哪里来? 定时器的时钟来源有 ...