布隆过滤器、计数布隆过滤器及其应用
详解布隆过滤器的原理、使用场景和注意事项

详解布隆过滤器的原理、使用场景和注意事项英文版Detailed Explanation of Bloom Filter's Principles, Usage Scenarios, and PrecautionsBloom Filter is a space-efficient probabilistic data structure that is used to test whether an element is a member of a set. It was invented by Burton Bloom in 1970 and has found widespread applications in various fields such as caching, network security, and databases.Principles of Bloom Filter:Bloom Filter works by using bit arrays and hash functions. Here's a step-by-step explanation of its principles:Initialization: Bloom Filter starts with an empty bit array of size 'm' bits, initially set to zero.Hashing: Bloom Filter uses 'k' independent hash functions, each mapping the input elements to one of the 'm' bit positions in the bit array.Insertion: When inserting an element into the Bloom Filter, each hash function is applied to the element, and the corresponding bit positions in the bit array are set to 1.Testing: To test whether an element is a member of the set, the same hash functions are applied to the element, and if all the corresponding bit positions in the bit array are 1, then the element is considered to be a member of the set. However, it's important to note that a false positive result (i.e., falsely claiming that an element is a member) is possible, but a false negative (i.e., falsely claiming that an element is not a member) is not possible.Usage Scenarios of Bloom Filter:Bloom Filters are widely used in various scenarios due to their space efficiency and probabilistic nature. Some common usage scenarios include:Caching: Bloom Filters can be used to quickly determine whether a requested item is present in a cache, thus avoiding unnecessary disk I/O operations.Network Security: Bloom Filters are used in network security applications to quickly detect the presence of malicious content in network packets.Databases: Bloom Filters can be used in databases to efficiently search for the presence of specific keys in a large dataset.Precautions When Using Bloom Filter:When using Bloom Filter, it's important to consider the following precautions:False Positives: As mentioned earlier, Bloom Filters can produce false positive results. Therefore, it's crucial to have a fallback mechanism to confirm the membership of elements that are identified as positive by the Bloom Filter.Choosing the Right Parameters: The performance of Bloom Filter depends on the choice of parameters such as the size of the bit array 'm' and the number of hash functions 'k'. It's important to choose these parameters carefully based on the specific requirements of the application.Dynamic Updates: Bloom Filters are typically designed for static sets, and updating them dynamically (e.g., adding or removing elements) can be challenging. If dynamic updates are required, it's advisable to consider alternative data structures or modify the Bloom Filter accordingly.In summary, Bloom Filter is a powerful probabilistic data structure that offers efficient membership testing with space efficiency. However, it's crucial to understand its principles, limitations, and precautions to ensure its effective usage in various scenarios.中文版详解布隆过滤器的原理、使用场景和注意事项布隆过滤器是一种空间效率高的概率性数据结构,用于测试一个元素是否属于某个集合。
数据结构的扩展与拓展思路

数据结构的扩展与拓展思路数据结构是计算机科学中非常重要的概念,它为我们处理和组织数据提供了基础的框架。
然而,随着科技的不断发展和应用需求的增加,传统的数据结构已经无法满足各种复杂问题的需求。
因此,扩展和拓展数据结构的思路变得尤为重要。
本文将探讨数据结构的扩展与拓展思路,并介绍几种常见的拓展数据结构。
一、数据结构的扩展思路数据结构的扩展思路主要包括以下几点:1. 引入新的数据类型:在传统的数据结构中,我们常常使用整数、字符和字符串等基本数据类型。
但随着需求的增加,有时我们需要处理更加复杂的数据类型,比如图片、音频、视频等。
因此,可以通过引入新的数据类型,扩展传统的数据结构,使其能够处理更复杂的数据。
2. 增加新的操作:传统的数据结构通常包括插入、删除和查找等基本操作。
然而,实际应用中,我们可能需要更多的操作,比如排序、过滤、合并等。
因此,可以通过增加新的操作,扩展传统的数据结构,使其能够更好地满足各种需求。
3. 改进性能:随着数据量的增加,传统的数据结构在性能方面可能存在瓶颈。
因此,扩展数据结构的思路之一是通过改进数据结构的性能,提高其处理大规模数据的效率。
例如,可以采用空间换时间的策略,利用高级算法和数据结构来优化性能。
二、常见的拓展数据结构除了扩展传统的数据结构,我们还可以通过引入新的数据结构来拓展数据结构的能力。
以下是几种常见的拓展数据结构:1. 树状数组:树状数组是一种用于高效处理区间和的数据结构,它可以在对数时间内完成区间和的计算和更新操作。
树状数组常用于解决一维区间和、逆序对计数等问题,比如在计算机图形学中的线段树。
2. 前缀树(字典树):前缀树是一种特殊的树状结构,它用于存储和索引字符串。
前缀树的特点是每个节点包含一个字符,并且从根节点到叶子节点构成的路径组成的字符串是唯一的。
前缀树常用于字符串匹配、单词查找等问题,在搜索引擎、拼写检查和自动完成等应用中有广泛的应用。
3. 布隆过滤器:布隆过滤器是一种快速判断一个元素是否存在于集合中的数据结构,它具有高效的查找和插入操作。
布隆过滤器的原理与使用

布隆过滤器的原理与使⽤⼀、算法介绍布隆过滤器是⼀种多哈希函数映射的快速查找算法,通常⽤于在⼤数据量场景下快速判断数据存在性。
该算法通过牺牲正确性从⽽在空间和时间上都有不错的效率。
⼆、算法原理当⼀个元素被加⼊集合时,通过N个散列函数将这个元素映射成⼀个位图中的N个点,将它们置为1。
判断某个元素是否存在时,通过这些点是不是都是1即可:如果这些点有任何⼀个0,则⽬标元素⼀定不在;如果都是1,则⽬标元素很可能在。
例如,⼀个集合中只存在⼀个apple 元素,其经过三个哈希函数计算映射在位图中三个位,此时判断orange是否存在于集合中,同样经过三个哈希函数计算,我们发现有⼀位为0,所以orange⼀定不存在于集合中。
三、算法实现构造⼀个布隆过滤器需要⼀个给定长度的位图和N个哈希函数,那么问题来了,这个位图到底要多⼤?到底要多少个哈希函数呢?这⾥引⼊两个公式:根据预估数据量n以及误判率fpp,位图⼤⼩m的计算⽅式:根据预估数据量n以及位图长度m,哈希函数个数k的计算⽅式:根据公式我们可以明显看出,当数据量越⼤、误判率越低,则位图长度越⼤。
关于m和k的计算,我们可以看⼀下Guava中的实现:/*** 计算hash函数个数* n,预期数据量* m,位图长度*/@VisibleForTestingstatic int optimalNumOfHashFunctions(long n, long m) {return Math.max(1, (int)Math.round((double)m / (double)n * Math.log(2.0D)));}/*** 计算位图长度* n,预估的数据量* p,误判率*/@VisibleForTestingstatic long optimalNumOfBits(long n, double p) {if (p == 0.0D) {p = 4.9E-324D;}return (long)((double)(-n) * Math.log(p) / (Math.log(2.0D) * Math.log(2.0D)));}解决了位图长度和哈希函数个数的计算问题,接下来我们看看哈希函数选取问题,⼀般情况下我们都需要三个甚⾄更多的哈希函数,我们如果真要去准备这些函数那就太⿇烦了,这⾥我们可以参考如下论⽂:https:///home/pete/pub/bloom-filters-verification.pdf这篇论⽂提出了⼀种算法,把原本需要N个哈希函数的计算转化成了两个哈希值的运算,完美地解决了这个问题。
布隆过滤器的原理和应用

布隆过滤器的原理和应用布隆过滤器是一种高效的数据结构,用于检索一个元素是否存在于一个大型集合中。
它具有快速查询速度和低存储需求的特点,广泛应用于各种大规模数据处理场景中。
本文将介绍布隆过滤器的原理和应用。
一、原理布隆过滤器基于一系列的哈希函数和位数组实现快速的元素查询。
其核心思想是,当一个元素被加入集合时,通过多个哈希函数将该元素映射到一个位数组的多个位置上,将这些位置的值设置为1。
当判断一个元素是否存在于集合时,将该元素进行相同的哈希函数映射,并检查对应位置上的值是否都为1。
若有任意一个位置的值为0,则可以确定该元素不存在于集合中,否则可能存在于集合中。
布隆过滤器的哈希函数通常采用 MurmurHash、FNV 等快速哈希算法,可以保证哈希值的均匀分布。
位数组中的每个位置只需要占用一个比特位,因此可以在节省存储空间的同时实现大规模数据的快速检索。
二、应用布隆过滤器广泛应用于各种实际场景中,以下是几个常见的应用示例:1. 大规模数据去重在大规模数据处理中,数据去重是一个常见的问题。
使用布隆过滤器可以快速判断一个元素是否已存在于已有数据集合中,从而去除重复数据,提高数据处理效率。
2. 防止缓存穿透在缓存系统中,如果缓存中不存在某个请求的结果,而数据库中也不存在该结果,那么该请求会直接穿透缓存直接访问数据库,导致数据库压力过大。
使用布隆过滤器可以在缓存层判断该结果是否存在于数据库中,减轻数据库的负载。
3. 防止恶意请求布隆过滤器可以用于恶意请求的过滤,例如防止恶意爬虫大量请求网站接口,或者阻断某种类型的网络攻击。
通过将恶意请求的特征信息加入布隆过滤器,可以在前置的高效过滤器层阻止恶意请求,减少服务器的压力。
4. URL过滤在网络爬虫等应用中,需要对URL进行过滤,防止重复抓取和进入黑名单网站。
使用布隆过滤器可以快速判断一个URL是否已经被访问过,从而避免重复请求。
5. 拼写检查布隆过滤器可以用于拼写检查和自动纠错。
布隆过滤器原理与实践技术分享ppt

目录
简介
原理
优缺点 适用场景 实战
布隆过滤器简介
布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。 它实际上是一个很长的二进制向量和一系列随机映射函数 布隆过滤器可以用于检索一个元素是否在一个集合中 布隆过滤器是一个概率数据结构 布隆过滤器可以优化内存占用
Enjoy & Good Luck
NUM
Bomb
NUM
概率数据结构
Graphic Designer
布隆过滤器的原理
布隆过滤器的基本思想: 通过Hash函数将元素映射成一个位数组(Bit Array)中的点;然后, 通过看这个点是不是 1 来判断集合中有没有它(偷天换日之技)
但采用Hash这种方式来确定数据位置,必然要面对数据碰撞的问题, 该如何解决?
误判率推导: 对于给定的误判概率 p,如何选择最优的位数组大小 m ???
上式表明,位数组的大小最好与插入元素的个数成线性关系; 对于给定的 m,n,k,误判概率最大为:
n 是已经添加元素的数量 ; k 哈希的次数; m 比特数组的大小;
Graphic Designer
布隆过滤器的原理
误判率推导: 下图是布隆过滤器误判概率 p 与位数组大小 m 和集合中插入元素个 数 n 的关系图,假定 Hash 函数个数选取最优数目:
那么在所有 k 次 Hash 操作后该位都没有被置 "1" 的概率是:
如果我们插入了 n 个元素,那么某一位仍然为 "0" 的概率是:
n 是已经添加元素的数量 ; k 哈希的次数; m 比特数组的大小;
Graphic Designer
因而该位为 "1"的概率是:
布隆过滤器应用场景

布隆过滤器应用场景布隆过滤器是一种高效的数据结构,它的基本原理是,对于一个特定集合中的每一个元素,不但存储其本身,而且还存储其一定数量的一致哈希值,以便快速确定该元素是否存在于特定的集合中。
它可以被用来快速检索一组元素,可以有效地检测一个元素是否存在于集合中,而无需访问实际的集合。
由于其精准的识别能力,布隆过滤器得到了广泛的应用。
1.业应用:在网络安全相关的商业应用领域,布隆过滤器被用来检测恶意代码的僵尸网络,分析不断变化的市场数据,过滤垃圾邮件等。
例如,可以使用布隆过滤器来快速检测恶意请求,从而有效地降低网络安全风险。
2.物信息学应用:布隆过滤器可以被用来快速查找DNA测序数据中的基因序列。
此外,当它还可以应用于其他生物学和遗传学领域如蛋白质组学,转录组学和基因组学等。
3.数据应用:布隆过滤器可以有效地检测网站中的指定元素,比如URL中的关键字,用户搜索的关键字等。
它可以帮助企业进行非结构化大数据分析,找出其中的趋势,帮助公司更好地投资和发展。
4.器学习应用:机器学习领域中,布隆过滤器可以用来快速处理海量数据,它可以比其他技术更快地提取出特征,从而有效地提升模型的性能。
布隆过滤器的技术优势可以用来有效地完成许多实际问题,它已被广泛应用于商业,生物信息学,大数据和机器学习等多个领域,其中许多(如恶意代码和垃圾邮件的检测)都需要高效、准确的分类和识别。
该技术也有助于提高网络安全和快速定位对象,从而减少对企业的不利影响。
布隆过滤器在上述应用领域中主要由两个基本部件组成:一个抽象数据结构,用于存储一组特征值,另一个则是一个算法,可以计算出更多更具特征性的哈希值,用于判断一个元素是否已存在于某一特定的集合中。
此外,布隆过滤器还支持动态添加新元素,并有很高的查询效率。
因此,布隆过滤器具有非常广泛的应用场景,它可以快速检索大量数据,准确识别特定元素,高效确定元素是否存在于集合中,并有助于提高网络安全性。
它被广泛应用于商业,生物信息学,大数据,机器学习等领域,有助于企业实现良好的效率和安全,获得更大的发展优势。
浅析布隆过滤器(BloomFilter)的实现原理及应用

浅析布隆过滤器(BloomFilter)的实现原理及应⽤⼀、什么情况下需要布隆过滤器?1、先来看⼏个⽐较常见的例⼦:字处理软件中,需要检查⼀个英语单词是否拼写正确在 FBI,⼀个嫌疑⼈的名字是否已经在嫌疑名单上在⽹络爬⾍⾥,⼀个⽹址是否被访问过yahoo, gmail 等邮箱垃圾邮件过滤功能 这⼏个例⼦有⼀个共同的特点:如何判断⼀个元素是否存在⼀个集合中?2、常规思路:数组链表树、平衡⼆叉树、TrieMap (红⿊树)哈希表 虽然上⾯描述的这⼏种数据结构配合常见的排序、⼆分搜索可以快速⾼效的处理绝⼤部分判断元素是否存在集合中的需求。
但是当集合⾥⾯的元素数量⾜够⼤,如果有500万条记录甚⾄1亿条记录呢?这个时候常规的数据结构的问题就凸显出来了。
数组、链表、树等数据结构会存储元素的内容,⼀旦数据量过⼤,消耗的内存也会呈现线性增长,最终达到瓶颈。
有的同学可能会问,哈希表不是效率很⾼吗?查询效率可以达到O(1)。
但是哈希表需要消耗的内存依然很⾼。
使⽤哈希表存储⼀亿个垃圾 email 地址的消耗?哈希表的做法: ⾸先,哈希函数将⼀个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常⼩于50%(哈希冲突);因此消耗的内存:8 * 2 * 1亿字节 = 1.6G 内存,普通计算机是⽆法提供如此⼤的内存。
这个时候,布隆过滤器(Bloom Filter)就应运⽽⽣。
在继续介绍布隆过滤器的原理时,先讲解下关于哈希函数的预备知识。
3、HashMap 的问题 讲述布隆过滤器的原理之前,我们先思考⼀下,通常你判断某个元素是否存在⽤的是什么?应该蛮多⼈回答 HashMap 吧,确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇⾼。
但是 HashMap 的实现也有缺点,例如存储容量占⽐⾼,考虑到负载因⼦的存在,通常空间是不能被⽤满的,⽽⼀旦你的值很多例如上亿的时候,那 HashMap 占据的内存⼤⼩就变得很可观了。
数据结构中的数据过滤算法

数据结构中的数据过滤算法数据结构中的数据过滤算法是指通过某种规则或条件,对数据集合中的数据进行筛选和过滤,以便得到符合特定要求的数据子集。
在实际应用中,数据过滤算法被广泛应用于数据处理、数据分析、搜索引擎、推荐系统等领域,帮助用户快速准确地获取所需信息。
本文将介绍数据结构中常见的数据过滤算法,包括线性搜索、二分查找、哈希表、布隆过滤器等,以及它们的原理、特点和应用场景。
一、线性搜索线性搜索是最简单直观的数据过滤算法之一,也称为顺序搜索。
其原理是从数据集合的第一个元素开始逐个比较,直到找到目标元素或搜索完整个数据集合。
线性搜索的时间复杂度为O(n),适用于数据量较小或无序的情况。
线性搜索的实现代码如下:```pythondef linear_search(data, target):for i in range(len(data)):if data[i] == target:return ireturn -1```线性搜索的优点是简单易懂,适用于小规模数据集合;缺点是效率较低,当数据量较大时,搜索时间较长。
二、二分查找二分查找是一种高效的数据过滤算法,适用于有序数据集合。
其原理是将数据集合分成两部分,通过比较目标值与中间值的大小关系,确定目标值在哪一部分,然后在相应部分继续查找,直到找到目标值或确定目标值不存在。
二分查找的时间复杂度为O(logn),适用于大规模数据集合。
二分查找的实现代码如下:```pythondef binary_search(data, target):low = 0high = len(data) - 1while low <= high:mid = (low + high) // 2if data[mid] == target:return midelif data[mid] < target:low = mid + 1else:high = mid - 1return -1```二分查找的优点是效率高,适用于有序数据集合;缺点是要求数据有序,且插入删除操作会影响数据的有序性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因此将某元素误判的概率为:
从上式中可以看出: 当m增大或n减小时,都会使得误判率减小, 这也符合直觉。
误判概率计算
两边取对数 : 现在计算对于给定的m和n,k为何值时可以使得误 判率最低。 设误判率为f(k)的函数为:
两边对k求导: 设 , 则简化为
误判概率证明
现在
当k = 0.7 * m / n 时,此时误判率最低。 若想保持某固定误判率不变,布隆过滤器的比特数 m与被加的元素数n应该是线性同步增加的。
误判概率证明
对某一特定比特位在一个元素由某特定散列插入时 没有被插入的概率为:
如果插入了n个元素,但都未将其置位的概率为:
没有被置位为1的概率为:
则此位被置位的概率为:
如果插入了1个元素,但都未将其置位的概率为:
误判概率证明
当m很大时: 现在考虑查询阶段,若对应某个待查询元素的k个 比特位全部置位为1,则可判定其在集合中。
添加地址
1亿 邮箱
0 0 0 0
16亿二进制
0
0
0
0
0
0
abc123@
abc456@
随机数生成器 F1-8
随机数生成器G
1 1 0 1 1 1 1 1 1
f1 = F1 f2 = F2 f3 = F3 f4 = F4 f5 = F5 f6 = F6 f7 = F7 f8 = F8
X
X1,X2,X3.... Xn
R
算法原理
Bloom Filter需要一个位数组(和位图类似)和K个映射函数(和Hash表类
似)。包含两种操作:插入和查询
1.初始化:将所有位置0
2. 集合R={r1,r2...rn},通过k个相互独立的映射函数{h1,h2,......hk},将集合R
中的每个元素rj(1<=j<=n)映射为K个值
5
n个关键字映射到k个槽中,n只要大于k,一定至少有一个槽放了多于1个元
位图法
位图法就是Bitmap的缩写。就是用每一位来存放某种状态,适用于 大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存 不存在的。
位图法可以理解为通过一个bit数组来存储特定数据的一种数据结构; 由于bit是数据的最小单位,所以这种数据结构往往是非常节省存储空间。
The explanation of the pros and cons
优劣详解
布隆过滤器
优点
添加和查询的时间复杂度都为O(k),与集合中元素的多 少无关,这是其他数据结构都不能完成的。 散列函数相互之间没有关系,方便由硬件并行实现。 布隆过滤器不需要存储元素本身,在某些对保密要求非 常严格的场合有优势。
算法描述
布隆过滤器
Bloom Filter
布隆过滤器(Bloom Filter)是一种概率空间高效的数据结 构。用于检索一个元素是否在一个集合中。 存在“在集合内(可能错误)”和“不在集合内(绝对不在集 合内)”两种情况。
温故知新
核心思想
核心思想就是利用多个不同的Hash函数来解决“冲突”。 如何判断某元素x是否在一个集合中?
信息 指纹
1
0
f1 f'1
f'2f2f8f3 Nhomakorabeaf4
f5
f6
f7
增加删除功能——Counting Bloom Filter
Counting Bloom Filter的出现解 决了这个问题,它将标准Bloom Filter位数组的每一位扩展为一个 小的计数器(Counter),在插入元素 时给对应的k(k为哈希函数个数)个 Counter的值分别加1,删除元素时 给对应的k个Counter的值分别减1, Counting Bloom Filter通过多占用 几倍的存储空间的代价,给Bloom Filter增加了删除操作。
3.将位数组中相对应的array[h1],array[h2],array[h3]......array[hk]置为1
算法原理
算法原理
算法原理
4.将待查询元素映射到位数组中,若对应每位都是1,则在集合中; 否则,不在。 注:会出现两种情况:(1)没有发生误判(2)发生了误判 (false positive) false positive:有可能会把不属于这个集合的元素误认为属于这 个集合。 删除操作: 不允许删除一个元素,会导致false negative。 false negative:把属于这个集合的元素误认为不属于这个集合。
1
1
1
1
1
1
1
1
1
0
t1
t'2
t2
t8
t3
t4
t5
t6
t7
s1 = F1 s2 = F2 s3 = F3 s4 = F4 s5 = F5 s6 = F6 s7 = F7 s8 = F8 s'1 = F'1 = s1 s'2 = F'2 s'3 = F'3 = s2 s'4 = F'4 = s3 s'5 = F'5 = s4 s'6 = F'6 = s5 s'7 = F'7 = s6 s'8 = F'8 = s7
建立一个小的白名单,存储那些可能被误判的信息。)
缺点
一般情况下不能从布隆过滤器中删除元素。
另外计数器回绕也会造成问题。
The design and application in Bloom filter
改进方案
布隆过滤器
添加地址
1亿 邮箱
0 0 0 0
16亿二进制
0
0
0
0
0
0
abc123@
abc123@
随机数生成器 F1-8
BCD123@
信息 指纹
误识别概率: 万分之一以下
信息指纹
一段文字中包含的信息是信息熵,理论上无损编码最短长度就是信息熵, 但如果仅仅区分几段文字或者图片,则不需要这么长的编码,任何一段 信息文字,都可以对应一个不太长的随机数,作为区别它和其它信息的 指纹(Fingerprint)。只要算法设计的好,任何两段信息的指纹都很难重 复,就如同人类的指纹一样。信息指纹在加密、信息压缩和处理中有着 广泛的应用。 目前常用的信息指纹算法为Mersenne Twister算法,译为马特赛特旋转 演算法,是伪随机数发生器之一,其主要作用是生成伪随机数。此算法 是Makoto Matsumoto (松本)和Takuji Nishimura (西村)于1997年开 发的,基于有限二进制字段上的矩阵线性再生。可以快速产生高质量的 伪随机数,修正了古老随机数产生算法的很多缺陷。
0
1
1
1
0
0
1
1
这样可以每天采用恒定的1个byte即可保存当天的考勤记录。
布隆过滤器
布隆过滤器(Bloom Filter),它结合了位图和Hash表 两者的优点. 位图的优点是节省空间,但是只能处理整型值一类的问题 ,无法处理字符串一类的问题. 而Hash表却恰巧解决了位图无法解决的问题,然而Hash太 浪费空间。
优点
布隆过滤器可以表示全集,其它任何数据结构都不能。 k和m相同,使用同一组散列函数的两个布隆过滤器的
交并差运算可以使用位操作进行。
优点
在增加了错误率这个因素之后,布隆过滤器通过允许少 量的错误来节省大量的存储空间。
缺点
有误判的概率,即存在假阳性(False Position),无法
获取集合中的元素数据。 随着存入的元素数量增加,误算率随之增加。但是如果 元素数量太少,则使用散列表足矣。(误判补救方法是:再
优点
可能元素范围不是很大,并且大多数都在集合中
比特数组
>>
布隆过滤器
忽略碰撞并且只存储元素是否在其中的二进制信息时
k=1的布隆过滤器
优点
使用k>1的布隆过滤器,即k个哈希函数将每个元素改 为对应于k个bits,因为误判度会降低很多,并且如果参数k 和m选取得好,一半的m可被置为1,这充分说明了布隆过 滤器的空间效率性。
The proof and calculation of error probability
误判概率
证明与计算
误判概率证明
假设
假设布隆过滤器中的散列函数满足简单均匀散列假设: 每个元素都等概率地散列到所有桶中的任何一个,与其它 元素被散列到哪个桶无关。
记号
k :布隆过滤器中散列函数的个数; m:布隆过滤器中全部比特位个数; n :布隆过滤器中存在比特位个数。
f‘1 = F‘1 = f1 f’2 = F’2 f‘3 = F’3 = m2 f’4 = F‘4 = m3 f‘5 = F’5 = m4 f’6 = F‘6 = m5 f‘7 = F’7 = m6 f’8 = F‘8 = m7
信息 指纹
1
0
g1 g'1
g'2
g2
g8
g3
g4
g5
g6
g7
查询地址
16亿二进制
The background of Bloom filter
背景介绍
布隆过滤器
背景介绍
比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断 它是否在已知的字典中); 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;
在网络爬虫里,一个网址是否被访问过等等。
Hash函数
一般来讲,计算机中的集合是用哈希表(hash table)来存储的。 Hash函数作用就是把要存的数据映射成hash表中的一个位置,这个位 置就是你要存放该数据的地方。一般把hash表的每个位置都叫做“槽 (slot)”。 它的好处是快速准确,缺点是浪费存储空间。当集合比较小时,这个问 题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来 了。