布隆过滤器、计数布隆过滤器及其应用
详解布隆过滤器的原理、使用场景和注意事项
详解布隆过滤器的原理、使用场景和注意事项英文版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```二分查找的优点是效率高,适用于有序数据集合;缺点是要求数据有序,且插入删除操作会影响数据的有序性。
布隆过滤器计数布隆过滤器及其应用
位图法
比如一个公司有8个员工,现在需要记录公司的考勤记录,传 统的方案是记录下每天正常考勤的员工的ID列表,比如2012-0101:[1,2,3,4,5,6,7,8]。
假如员工ID采用byte数据类型,则保存每天的考勤记录需要N个 byte,其中N是当天考勤的总人数。
1 2 3 4 5 67 8
背景介绍
比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断 它是否在已知的字典中); 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上; 在网络爬虫里,一个网址是否被访问过等等。
团结 信赖 创造 挑战
Hash函数
一般来讲,计算机中的集合是用哈希表(hash table)来存储的。 Hash函数作用就是把要存的数据映射成hash表中的一个位置,这个位置 就是你要存放该数据的地方。一般把hash表的每个位置都叫做“槽(slot) ”。 它的好处是快速准确,缺点是浪费存储空间。当集合比较小时,这个问 题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来 了。
0
0
0
0
0
0
0
随机数生成器 F1-8
随机数生成器 G
信息指 纹
f1 = F1 f‘1 = F‘1 = f1 f2 = F2 f’2 = F’2 f3 = F3 f‘3 = F’3 = m2 f4 = F4 f’4 = F‘4 = m3 f5 = F5 f‘5 = F’5 = m4 f6 = F6 f’6 = F‘6 = m5 f7 = F7 f‘7 = F’7 = m6 f8 = F8 f’8 = F‘8 = m7
布隆过滤器计数布隆过滤器及其应用
团结 信赖 创造 挑战
CONTENTS
布隆过滤器使用场景
布隆过滤器使用场景布隆过滤器(BloomFilter),一种设计精巧的数据结构,经常被用来解决许多琐碎的工作中的繁琐问题。
这种数据结构能够存储集合中的元素,并通过计算得到一个指示值,用以表示元素是否存在于集合中。
布隆过滤器的实现过程极其简单,同时具有非常高的储存效率和查询效率,因此在很多场景下十分有用。
首先,布隆过滤器作为基于选择的搜索引擎,可以被用于快速搜索某个字符串或者元素是否在一个大型字典中出现过。
这类搜索引擎是应用在许多互联网公司的非常有用的组件,用于快速地搜索网站的URL和网页内容,例如Google的PageRank算法就使用了布隆过滤器。
在生物信息学中,这种搜索引擎也得到很多应用,可以被用于快速搜索DNA序列中的特定元素。
此外,布隆过滤器的另一个重要用途是用于检测字符串相似度,从而可以为搜索引擎提供一个快速而准确的排序算法。
这些算法可以发现搜索词和文档之间的相似度,从而更快地找到最接近用户搜索意图的文档。
而实现这类算法时,大多会采用布隆过滤器来加快搜索速度,因为它可以非常快速地找出字符串之间的相似性。
另外,布隆过滤器可以被用于信息安全领域。
举例来说,可以通过布隆过滤器来实现一种数据库安全控制系统,从而有效地过滤不法网站的请求。
有了这种安全控制系统,用户在浏览网页的时候不会被不法网站的弹窗所打扰,因为它可以准确检测出用户发起的请求是否来自不法网站,从而可以准确地过滤出必要的信息。
最后,布隆过滤器还可以用于排重控制。
可以将特定的规则应用到某类资源上,来检查是否存在重复的资源。
这种方法非常有效地去除了大量的重复资源。
以上就是布隆过滤器所能应用的场景。
它既可以用于搜索引擎,也可以用于信息安全,还可以用于检测字符串相似度和排重控制,同时还有很多其他用途。
它的实现又简单,又有效,可以大大节省空间,提高查询速度,这也是它被如此广泛使用的原因。
布隆过滤器高效判断元素是否存在的数据结构
布隆过滤器高效判断元素是否存在的数据结构布隆过滤器(Bloom Filter)是一种快速且高效地判断元素是否存在的数据结构。
它通过使用位数组和多个哈希函数来实现,可以在时间和空间上提供高效的判断操作。
本文将介绍布隆过滤器的原理、应用场景以及使用注意事项。
一、布隆过滤器原理布隆过滤器的核心原理是使用位数组和多个哈希函数。
具体实现步骤如下:1. 初始化位数组:布隆过滤器使用一个位数组,初始时将所有位都设置为0。
2. 添加元素:- 对于要添加的元素,使用多个哈希函数计算出多个哈希值。
- 将对应位数组中的这些位置都设置为1。
3. 判断元素是否存在:- 对于要判断的元素,同样使用多个哈希函数计算出多个哈希值。
- 检查对应位数组中的这些位置是否都为1,若都为1,则判断该元素可能存在;若存在任何一个位为0,则判断该元素一定不存在。
布隆过滤器的判断结果可能有误判,即布隆过滤器判断元素不存在时,实际上元素可能存在。
但是,布隆过滤器判断元素存在时,则一定不存在假阳性。
二、布隆过滤器的应用场景布隆过滤器广泛应用于多个领域,如网络爬虫、缓存系统、垃圾邮件过滤等。
1. 网络爬虫:- 在爬取网页时,可以使用布隆过滤器快速判断网页是否已经被访问过,避免重复抓取。
- 布隆过滤器可以大大减少网络爬虫的资源消耗,提高爬取效率。
2. 缓存系统:- 当需要从缓存中获取数据时,可以首先使用布隆过滤器判断数据是否存在于缓存中,减少对底层存储的访问次数。
- 布隆过滤器可以加快缓存系统的读取速度,提高系统整体的性能。
3. 垃圾邮件过滤:- 在邮件系统中,可以使用布隆过滤器快速判断邮件是否是垃圾邮件,避免用户收到大量的垃圾邮件。
- 布隆过滤器可以提高垃圾邮件过滤的准确性和效率,提升邮件系统的用户体验。
以上仅是布隆过滤器应用场景的一部分,实际上布隆过滤器还可以用于很多其他领域,具体应用根据实际需求而定。
三、布隆过滤器的使用注意事项在使用布隆过滤器时,需要注意以下几点:1. 确定合适的位数组大小:- 位数组的大小需要根据预计的元素数量和允许的误判率来确定。
浅谈布隆过滤器
浅谈布隆过滤器不知道从什么时候开始,本来默默⽆闻的布隆过滤器⼀下⼦名声⼤燥,仿佛⾝在互联⽹,做着开发的,⽆⼈不知,⽆⼈不晓,哪怕对技术不是很关⼼的⼩伙伴也听过它的名号。
我也花了不少时间去研究布隆过滤器,看了不少博客,⽆奈不是科班出⾝,⼜没有那么聪明的头脑,⼜⽐较懒...经过“放弃,拿起,放弃,拿起”的⽆限轮回,应该算是了解了布隆过滤器的核⼼思想,所以想给⼤家分享下。
布隆过滤器的应⽤我们先来看下布隆过滤器的应⽤场景,让⼤家知道神奇的布隆过滤器到底能做什么。
缓存穿透我们经常会把⼀部分数据放在Redis等缓存,⽐如产品详情。
这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,⽽不⽤读取数据库,这是提升性能最简单,最普遍,也是最有效的做法。
⼀般的查询请求流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去数据库查询,然后再把数据库取出来的数据放⼊缓存,⼀切看起来很美好。
但是如果现在有⼤量请求进来,⽽且都在请求⼀个不存在的产品Id,会发⽣什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存,那么⼤量的请求都怼到数据库,数据库的压⼒⼀下⼦就上来了,还有可能把数据库打死。
虽然有很多办法都可以解决这问题,但是我们的主⾓是“布隆过滤器”,没错,“布隆过滤器”就可以解决(缓解)缓存穿透问题。
⾄于为什么说是“缓解”,看下去你就明⽩了。
⼤量数据,判断给定的是否在其中现在有⼤量的数据,⽽这些数据的⼤⼩已经远远超出了服务器的内存,现在再给你⼀个数据,如何判断给你的数据在不在其中。
如果服务器的内存⾜够⼤,那么⽤HashMap是⼀个不错的解决⽅案,理论上的时间复杂度可以达到O(1),但是现在数据的⼤⼩已经远远超出了服务器的内存,所以⽆法使⽤HashMap,这个时候就可以使⽤“布隆过滤器”来解决这个问题。
但是还是同样的,会有⼀定的“误判率”。
什么是布隆过滤器布隆过滤器是⼀个叫“布隆”的⼈提出的,它本⾝是⼀个很长的⼆进制向量,既然是⼆进制的向量,那么显⽽易见的,存放的不是0,就是1。
查找算法及应用时间复杂度
查找算法及应用时间复杂度查找算法是计算机科学中一类常用的算法,用于在给定的数据集中查找目标元素。
不同的查找算法有不同的时间复杂度和适用场景。
下面将介绍常见的查找算法及其应用时间复杂度。
1. 顺序查找(Sequential Search)顺序查找是一种简单直观的查找算法,它从数据集的起始位置开始逐个比较,直到找到目标元素或遍历完整个数据集。
顺序查找的时间复杂度为O(n),其中n 是数据集中元素的个数。
顺序查找适用于数据集无序或无法利用其他特性进行查找的情况。
2. 二分查找(Binary Search)二分查找是一种常用的有序数据集查找算法。
它利用有序特性,将数据集一分为二,然后根据目标元素与中间元素的大小关系,确定目标元素在左半部分还是右半部分,再继续在相应的子集中进行查找。
二分查找的时间复杂度为O(log n),其中n是数据集中元素的个数。
二分查找只适用于有序数据集。
3. 插值查找(Interpolation Search)插值查找是在有序数据集中进行查找的一种改进算法。
它通过根据目标元素与数据集中最大值和最小值之间的比例,推测目标元素所在的位置,然后在该位置进行查找。
这个位置的选择不再是固定的中间位置,而是根据目标元素与数据集中元素的分布情况动态变化。
插值查找的时间复杂度为O(log log n),在数据分布均匀的情况下,插值查找的效率较高。
4. 哈希查找(Hash Search)哈希查找是一种利用哈希表进行查找的算法。
它通过将数据集中的元素映射到不同的哈希桶中,然后根据目标元素的哈希值去相应的哈希桶中查找。
哈希查找的时间复杂度为O(1),即常量时间,但在处理哈希冲突时,可能会导致时间复杂度增加。
哈希查找适用于需要快速查找的场景,如电话号码查询、字典查询等。
5. 布隆过滤器(Bloom Filter)布隆过滤器是一种基于位数组和哈希函数实现的查找算法。
它可以判断一个元素是否在集合中,但不能确定元素具体的位置。
布隆过滤器的应用网页爬虫去重垃圾邮件过滤等
布隆过滤器的应用网页爬虫去重垃圾邮件过滤等布隆过滤器的应用:网页爬虫去重与垃圾邮件过滤等布隆过滤器是一种高效的数据结构,具有快速判断一个元素是否存在于集合中的特性。
它通过使用位数组和多个哈希函数,可以在常数时间内判断元素是否“可能”存在于集合中,而不需要实际存储元素本身。
由于其空间效率高、查询速度快、误差率可控等优点,布隆过滤器在网页爬虫去重和垃圾邮件过滤等领域有着广泛的应用。
一、布隆过滤器的原理和基本结构布隆过滤器的基本结构包括一个位数组和多个哈希函数。
位数组通常被初始化为0,哈希函数用于将输入元素映射成位数组的索引位置。
1. 插入元素当要插入一个元素时,将该元素通过多个哈希函数得到多个哈希值,然后在位数组中将对应位置的值设置为1。
2. 查询元素对于一个查询操作,同样使用多个哈希函数计算输入元素的哈希值,然后通过检查位数组中对应位置的值来判断元素是否存在。
如果位数组中的所有对应位置的值都为1,则认为该元素“可能”存在于集合中;如果任一位置的值为0,则该元素一定不存在于集合中。
3. 误差率布隆过滤器的误差率由位数组的大小和哈希函数的个数决定。
误差率越低,位数组和哈希函数的要求就会越高。
通过合理选择参数,可以在满足误差要求的前提下,最大限度地提高布隆过滤器的性能。
二、布隆过滤器在网页爬虫去重中的应用在网页爬虫中,去重是一个必要的步骤,避免重复抓取相同的页面。
布隆过滤器因其高效的查询速度和较低的存储成本,成为一种理想的去重工具。
1. 爬取网页数据网页爬虫从互联网上获取各种页面数据,包括HTML页面、图片、视频等。
在爬取这些数据的过程中,经常会遇到重复的页面。
2. 利用布隆过滤器进行去重为了去重,爬虫可以将已抓取的网页的URL作为元素插入到布隆过滤器中。
每次抓取新网页时,先通过布隆过滤器查询该网页的URL是否在集合中。
如果被判断为“可能存在”,则根据实际情况再进行进一步验证;如果被判断为不存在,则将该网页的URL添加到布隆过滤器中,并继续处理。
布隆过滤器的原理和应用场景
布隆过滤器的原理和应用场景
布隆过滤器是一种数据结构,可以用于快速检查一个元素是否存在于集合中。
它使用位向量来表示集合,通过多个哈希函数将输入元素映射为位向量上的多个位置,然后将对应位置上的位设置为1。
当需要检查一个元素是否存在于集合中时,将该元素通过相同的哈希函数映射为位向量上的多个位置,检查对应位置上的位是否都为1。
如果都为1,那么元素可能存在于集合中,如果有任何一个位置上的位为0,那么元素一定不存在于集合中。
布隆过滤器主要应用于空间和时间效率要求比较高的场景,例如:
1. 网络爬虫:用于过滤已访问过的网页,避免重复访问。
2. 数据库查询:用于快速检查一个元素是否存在于数据库中。
3. 邮件服务器:用于过滤垃圾邮件,将已知的垃圾邮件域名或邮件地址存储于布隆过滤器中。
4. 网络防火墙:用于检查是否有恶意地址或恶意域名的访问请求。
布隆过滤器在数据去重中的应用
布隆过滤器在数据去重中的应用在数据处理中,数据去重是一项非常重要的任务。
因为重复数据会对数据的分析和应用造成很大的影响,尤其当数据量非常大时,去重任务显得格外复杂。
为了解决这一问题,学术界和业界研究并发展了一系列算法技术,其中布隆过滤器是一种比较常见的算法技术。
布隆过滤器是由布隆在1970年提出的一种基于哈希的数据结构。
它可以快速判断一个元素是否在一个集合中,并且具有高效的空间和时间复杂度。
一般来说,布隆过滤器由一个二进制向量和一组哈希函数组成,这组哈希函数可以将元素映射为二进制向量的若干个位置,每个位置上的值为1。
在添加元素时,将元素经过哈希函数的处理后,将对应的位置的值设为1。
在查询元素时,对元素进行哈希处理,然后查看对应的位置上的值是否为1,如果值为1,则表明元素可能在集合中,如果值为0,则表明元素一定不在集合中。
布隆过滤器的优势在于空间占用比较少,尤其是对于大规模的数据集合来说,它只需要占用很少的空间就能够完成去重任务,而且查询速度非常快,因为它并不需要将所有的元素都遍历一遍才能找到目标元素。
但是布隆过滤器也存在一些缺点。
最大的问题在于误判率比较高,也就是说可能会将不属于集合中的元素误判为属于集合中的元素。
这是由于哈希函数本身的性质所决定的,因为哈希函数是一种信息压缩和抽象的过程,所以必然会存在信息损失和映射冲突的问题,这就会导致误判率比较高。
另外,布隆过滤器是一个单向的数据结构,也就是说一旦添加的元素无法删除,因为删除一个元素会影响到其他元素哈希函数的映射位置,所以无法进行删除操作。
针对布隆过滤器的缺点,学术界和业界也提出了一些解决方案。
其中比较常见的一种是使用多个布隆过滤器进行去重任务。
具体的做法是将数据分成若干部分,然后对每一部分分别建立一个布隆过滤器,最终将所有的布隆过滤器的结果合并起来,再进行去重操作。
这样可以有效地降低误判率,并且也可以解决删除问题。
但是相对而言,使用多个布隆过滤器的空间和时间复杂度都会有所增加,还需要进行多次哈希操作,因此需要权衡利弊来选择合适的解决方案。
GoogleGuava中布隆过滤器的介绍和使用
GoogleGuava中布隆过滤器的介绍和使⽤⼀、简介布隆过滤器(Bloom Filter)是⾮常经典的,以空间换时间的算法。
布隆过滤器由布隆在 1970 年提出。
它实际上是⼀个很长的⼆进制向量和⼀系列随机映射函数。
布隆过滤器可以⽤于检索⼀个元素是否在⼀个集合中。
它的优点是空间效率和查询时间都远远超过⼀般的算法,缺点是有⼀定的误识别率和删除困难。
⼆、实现原理布隆过滤器的核⼼实现是⼀个超⼤的位数组和⼏个哈希函数。
假设位数组的长度为 m,哈希函数的个数为 k。
以上图为例,具体的操作流程:假设集合⾥⾯有 3 个元素 {x, y, z},哈希函数的个数为 3。
⾸先将位数组进⾏初始化,将⾥⾯每个位都设置位0。
对于集合⾥⾯的每⼀个元素,将元素依次通过 3 个哈希函数进⾏映射,每次映射都会产⽣⼀个哈希值,这个值对应位数组上⾯的⼀个点,然后将位数组对应的位置标记为 1。
查询 W 元素是否存在集合中的时候,同样的⽅法将 W 通过哈希映射到位数组上的 3 个点。
如果 3个点的其中有⼀个点不为 1,则可以判断该元素⼀定不存在集合中。
反之,如果 3 个点都为 1,则该元素可能存在集合中。
注意:此处不能判断该元素是否⼀定存在集合中,可能存在⼀定的误判率。
可以从图中可以看到:假设某个元素通过映射对应下标为 4、5、6 这 3 个点。
虽然这 3 个点都为 1,但是很明显这 3 个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是 1,这是误判率存在的原因。
1、布隆过滤器添加元素将要添加的元素给 k 个哈希函数得到对应于位数组上的 k 个位置将这 k 个位置设为 12、布隆过滤器查询元素将要查询的元素给 k 个哈希函数得到对应于位数组上的 k 个位置如果 k 个位置有⼀个为 0,则肯定不在集合中如果 k 个位置全部为 1,则可能在集合中3、布隆过滤器的优缺点优点相⽐于其它的数据结构,布隆过滤器在空间和时间⽅⾯都有巨⼤的优势。
分析布隆过滤器原理以及Guava的BloomFilter使用
分析布隆过滤器原理以及Guava的BloomFilter使⽤假设遇到这样⼀个问题:要求判断某个⽹址URL是否在⼀个20亿的⽹址URL集合中,并且需在给定内存空间(⽐如:500M)内快速判断出。
可能很多⼈⾸先想到的会是使⽤HashSet,因为HashSet基于HashMap,理论上时间复杂度为:O(1)。
达到了快速的⽬的,但是空间复杂度呢?URL字符串通过Hash得到⼀个Integer的值,Integer占4个字节,那20亿个URL理论上需要:20亿*4/1024/1024/1024=7.45G的内存,不满⾜空间复杂度的要求。
这⾥就引出本⽂要介绍的“布隆过滤器”。
何为布隆过滤器百科上对布隆过滤器的介绍是这样的:布隆过滤器(Bloom Filter)是1970年由布隆提出的。
它实际上是⼀个很长的⼆进制向量和⼀系列随机映射函数。
布隆过滤器可以⽤于检索⼀个元素是否在⼀个集合中。
它的优点是空间效率和查询时间都⽐⼀般的算法要好的多,缺点是有⼀定的误识别率和删除困难。
是不是描述的⽐较抽象?那就直接了解其原理吧!还是以上⾯的例⼦为例:哈希算法得出的Integer的哈希值最⼤为:Integer.MAX_VALUE = 2147483647,意思就是任何⼀个URL的哈希都会在0~2147483647之间。
那么可以定义⼀个2147483647长度的byte数组,⽤来存储集合所有可能的值。
为了存储这个byte数组,系统只需要:2147483647/8/1024/1024=256M。
⽐如:某个URL(X)的哈希是2,那么落到这个byte数组在第⼆位上就是1,这个byte数组将是:000…00000010,重复的,将这20亿个数全部哈希并落到byte数组中。
判断逻辑:如果byte数组上的第⼆位是1,那么这个URL(X)可能存在。
为什么是可能?因为有可能其它URL因哈希碰撞哈希出来的也是2,这就是误判。
但是如果这个byte数组上的第⼆位是0,那么这个URL(X)就⼀定不存在集合中。
- 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)”。 它的好处是快速准确,缺点是浪费存储空间。当集合比较小时,这个问 题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来 了。