[算法系列之十]大数据量处理利器:布隆过滤器

简介:

【引言】

在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断 它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新 元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用 哈希表(hash table)来存储的。它的好处是 快速准确,缺点是 费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来 了。比如说,一个象 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿 个 email 地址, 就需要 1.6GB 的内存(用哈希表实现的具体办法是将每一个 email 地址对应成一个八字节的信息指纹(详见:数学之美之信息指纹), 然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB, 即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。
今天我们就介绍一个一种称作布隆过滤器的数学工具,它只需要哈希表 1/8 到 1/4 的大小就能解决同样的问 题。
(数学之美)

【简介】

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数

布隆过滤器可以用于检索一个元素是否在一个集合中。

它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难

【工作原理】

我们通过上面的电子邮件的例子来说明工作原理。

假定存储以一亿个电子邮件地址,先建立一个16亿二进制(比特),即两亿字节的向量,然后将这16亿个二进制位全部清零。

对于每一个电子邮件的地址X,用8个不同的随机数产生器(F1,F2.........F8)产生8个信息指纹(f1,f2,......f8)。

在用一个随机数产生器G把这8个信息指纹映射到1-16亿中的8个自然数g1,g2.....g8。现在把这9个位置全部设置为1。对这一亿个电子邮件都这样处理之后,一个针对这些

电子邮件地址布隆过滤器就建成了。


现在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址Y是否是在黑名单中。用相同的8个随机数(F1,F2,....F8)产生器对这个地址产生

8个信息指纹(s1,s2,.....s8),然后将这8个信息指纹对应到布隆过滤器的8个二进制位,分别是t1,t2,....t8。

如果Y在黑名单中,显然,t1,t2,...t8对应8个二进制位一定为1。这样如果再遇到黑名单中的电子邮件地址都能准确的发现。


说白了就是原理很简单,用位数组和k个不同的HASH函数。将HASH函数对应的值的位数组置1,查找时如果发现所有HASH函数对应位都是1说明存在。

【集合表示和元素查询】

下面我们具体来看布隆过滤器是如何用位数组表示集合的。初始状态时,布隆过滤器是一个包含m位的位数组,每一位都置为0。

为了表达S={x1, x2,…,xn}这样一个n个元素的集合,布隆过滤器使用k个相互独立的哈希函数(Hash ),它们分别将集合中的每个元素映射到{1,…,m}的范围中。

对任意一个元素x,第i个哈希函数映射的位置h(i,x)就会被置为1(1≤i≤k,代表第i个哈希函数)。

注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。

在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。   

 

在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有h(i,y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。

下图中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。

【误识别问题】

(引用于数学之美)






从这个公式可以看出:

k = ln2 * m / n时 p 最小


何根据输入元素个数n,确定位数组m的大小及hash函数个数。

当hash函数个数k = ln2 * m / n 时错误率最小。

在错误率p不大于E的情况 下:

推出:


在错误率不大于E的情况 下,m至少要等于才能表示任意n个元素的集合。

但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应 该大于等于    大概就是nlg(1/E)1.44倍。

布隆过滤器背后的数学原理在于两个完全随机的数学冲突峰概率很小,因此,可以在很小的无识别率的条件下,用很小的空间存储大量的信息。

【适用范围】 

可以用来实现数据字典,进行数据的判重,或者集合求交集 











相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
5月前
|
存储 人工智能 算法
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
40 0
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
|
6月前
|
算法 索引
带你读《图解算法小抄》十一、布隆过滤器(1)
带你读《图解算法小抄》十一、布隆过滤器(1)
带你读《图解算法小抄》十一、布隆过滤器(1)
|
5月前
|
缓存 算法 Java
亿级数据过滤算法----布隆过滤器
亿级数据过滤算法----布隆过滤器
|
6月前
|
存储 算法
带你读《图解算法小抄》十一、布隆过滤器(2)
带你读《图解算法小抄》十一、布隆过滤器(2)
|
存储 数据采集 缓存
数据结构与算法必知--- Bitmap位图与布隆过滤器
数据结构与算法必知--- Bitmap位图与布隆过滤器
|
存储 数据采集 缓存
冷饭新炒:理解布隆过滤器算法的实现原理
这是《冷饭新炒》系列的第六篇文章。本文会翻炒一个用途比较广的算法 - 布隆过滤器算法。
1357 0
冷饭新炒:理解布隆过滤器算法的实现原理
|
存储 数据采集 算法
五分钟小知识:布隆过滤器原理和应用分析 | 算法必看系列四十二
在互联网时代,每天会产生大量的数据,而且很多数据不是人产生的,而是机器产生的,就比如说是爬虫,每个网页被实际浏览的次数当中有一大半都是爬虫所致,那么这些数据怎么存储就是一个问题,有没有一个数据结构能够以很小的实际内存开销来存储这些数据呢?这也就是布隆过滤器要来解决的问题,要用尽量小的存储空间存储数据,还要使数据的获取更加快速、便捷。
456 0
五分钟小知识:布隆过滤器原理和应用分析 | 算法必看系列四十二
|
1月前
|
机器学习/深度学习 算法 生物认证
基于深度学习的人员指纹身份识别算法matlab仿真
基于深度学习的人员指纹身份识别算法matlab仿真
|
25天前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到"hand.txt"文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真