布隆过滤器
最近一直在看美剧《犯罪心理》,剧中的BAU小组每次都要从茫茫人海中找到真正的凶手,这跟我们要在庞大的数据库中找到一个数据的感觉很相似。
就拿最简单的来说,全世界70多亿人口,每个人的指纹都是独一无二的,当把每个人的指纹信息整合起来,必定是一个庞大的数据库。假设现在从现场采集到一枚指纹,我们可以用电脑通过对这枚指纹的几个“特征点”进行扫描,然后用“特征点”的信息来筛选数据库中的指纹信息,可以这样减轻繁琐的对比工作,随着特征点数量的增加,其检索的正确率也会大大提高。这样的检索方式不仅可以减少信息的存储空间,也提高了信息检索的速度。布隆过滤器也和这样的过程极为相似。
布隆过滤器,简单来说,就是位数组+K个哈希函数,那么它就同时继承了位图和哈希表两者的优点,不仅节省空间,而且查找快速,缺点就是,存在一定的误判率。
继续用指纹识别这个例子来说明布隆过滤器的原理。假设,我们存储了全国大学生的指纹信息,那么首先,我们需要建立一个很长的二进制向量,即一个位数组,把所有的位都设为0。然后使用K个哈希函数对指纹信息进行计算存储,得到特征点S1,S2,S3,...Sk,再把这些特征点映射到位数组中的K个位置,把这些位置上的0置为1,当我们把所有人的指纹信息都通过这样的方式处理过之后,一个针对指纹信息的布隆过滤器就做好了。接下来,让我们看看这个布隆过滤器是如何检测一个未知指纹X是否在数据库中的吧!首先,用相同的K个哈希函数指纹X进行计算,同样得到K个特征点分别为X1,X2,...Xk,再将这K个数映射到布隆过滤器中的K个位置,如果指纹X在数据库中,那么其映射的K个位置上的位一定是1。那么任何存在于这个指纹库中的指纹都能被检查出来。
这样的例子还是不够具体,那么就举一个简单的实例,比如说有集合M={2,4,5,6,3,2,7},现在我们要用布隆过滤器来判断这个集合中是否存在重复的数字,首先,我们建立一个位数组BitSet[],根据集合元素的数值,位数组设为8位,并使其各位都为0,如下图所示:
BitSet[0] |
BitSet[1] |
BitSet[2] |
BitSet[3] |
BitSet[4] |
BitSet[5] |
BitSet[6] |
BitSet[7] |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
接下来使用一个哈希函数来对集合M进行存储,H(k)=k,即,2对应位数组第2位BitSet[1],4对应第四位BitSet[3]……在对应位上置1,其余位上的仍为0,
如下图所示:
位数组 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
M |
|
2 |
3 |
4 |
5 |
6 |
7 |
|
通过计算发现,当集合M中的第6个元素“2”出现时,其对应的位数组上的BitSet[1]=1,由此可以判断,元素“2”重复。
由这个简单的例子应该可以大概了解布隆过滤器的基本原理。
【不知道我自己的理解对不对啊,请多多指教啦!】
明天写一个揪出垃圾邮件的简单布隆过滤器,到时候再把代码PO上来和小伙伴们交流吧~
<!--EndFragment-->
相关推荐
1. **布隆过滤器原理**: 布隆过滤器基于多个哈希函数,将元素映射到一个固定大小的位数组中。当一个元素插入时,会通过多个不同的哈希函数将其映射到数组的不同位置,并将这些位置设为1。查询时,如果所有对应位置...
1. 初始化布隆过滤器 `b1`,预计插入 `size` 个元素,使用 `sdbmhash` 作为哈希函数。 2. 循环插入一半的元素到布隆过滤器中。 3. 检查所有元素是否存在于布隆过滤器中,并统计假阳性的数量。 ### 总结 布隆过滤器...
1. **位数组**:布隆过滤器的核心是一个很长的位数组,初始化时所有位都设置为0。位数组的大小是根据预期要存储的元素数量和允许的误判率来确定的。 2. **哈希函数**:为了将元素映射到位数组,我们需要多个独立的...
布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。它是由 Burton Howard Bloom 在...WindowsFormsApplication1中的代码示例可以帮助开发者理解和实践布隆过滤器的原理和用法。
布隆过滤器,大家学过数据结构的应该都清楚,一般的字典树要实现嵌入和查找都内存的消耗非常大,布隆过滤器有BloomFilter,string, BKDRHash, APHash, DJBHash> bf五个参数你要查找的元素个数,查找元素类型,三个...
C++实现的布隆过滤器,其中使用到的bitset也是自己简单实现的一个BitContainer。可以处理千万条到亿条记录的存在性判断。做成dll可以在很多场合使用,如自己写爬虫,要判断一个url是否已经访问过,判断一个单词是否...
1. **基本原理**:布隆过滤器利用多个哈希函数将元素映射到一个固定大小的位数组中。每个元素会通过多个不同的哈希函数,将对应的位设置为1。由于使用了多个哈希函数,可能会有冲突,但这种设计使得插入和查询操作...
布隆过滤器的性能非常高,时间复杂度是O(1),即常量值。空间性能也非常高,例如,2亿的元素,允许错误率为百分之一,位数组需要1917011675位,共228M的空间,而如果使用数组来存储,假设每个元素占用8个字节的空间,...
1. **位数组**:布隆过滤器使用一个巨大的位数组,初始化时所有位都设为0。这个数组的大小直接影响了过滤器的性能和误报率。 2. **哈希函数**:至少需要两个不同的哈希函数,将输入元素映射到位数组的不同位置。这些...
布隆过滤器的基本原理是,当一个元素被添加到集合中时,通过多个哈希函数将其映射到二进制向量的多个位置,将这些位置设置为1。如果在查询时,所有映射位置都是1,那么元素可能存在,但如果至少有一个位置是0,则...
1. **创建布隆过滤器实例**:用户可以指定预期的元素数量和允许的错误率,库会根据这些参数计算出合适的位数组大小和哈希函数数量。 2. **插入元素**:将元素通过预定义的哈希函数映射到位数组中。 3. **查询元素**...
1. **基本结构**:布隆过滤器是一个很长的二进制数组和几个独立的哈希函数。数组初始全为0,哈希函数是随机且独立的。 2. **插入操作**:当插入一个元素时,会使用每个哈希函数计算出对应的数组下标,然后将这些...
布隆过滤器是一种概率型数据结构,用于判断一个元素是否可能在一个集合中存在。它在处理大量数据时,能够高效地进行存在性查询,而牺牲一定的误判率。在PHP和Redis结合应用中,布隆过滤器常被用来解决缓存穿透问题,...
1. **空间效率**:布隆过滤器使用较少的内存来表示大量数据,相比传统数据结构,如哈希表,节省了大量存储空间。 2. **查询效率高**:由于只需要进行多次哈希计算,查询速度非常快。 3. **概率性判断**:存在一定的...
布隆过滤器在网页去重中的应用 , 海量数据处理中的一个绝好应用
布隆过滤器是一种高效的概率型数据结构,它用于判断一个元素是否在一个集合中,具有空间效率和时间效率高的优点。在字符串模糊匹配算法中,布隆过滤器能够用来快速排除那些肯定不匹配的字符串,从而减少不必要的精确...
布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。它可能会产生误报(false positive),但绝不会产生漏报(false negative)。这种特性使得它在大数据处理、缓存、数据库等...
布隆过滤器是一种高效的空间节省的数据结构,常用于判断一个元素是否可能在一个大规模集合中存在。它是由 Burton Howard Bloom 在1970年提出的,因此得名“布隆过滤器”。在Java中,我们可以利用开源库如RedisBloom...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。由布隆在1970年提出,它不像传统的数据结构如哈希表那样保证不误判,而是允许有一定的错误率。这种特性使得...
基于Redis的布隆过滤器,内含scrapy示例程序,github地址:https://github.com/kongtianyi/BloomFilterRedis