第四章 大数据处理方法布隆过滤器

合集下载

布隆过滤器(BloomFilter)与Hash算法

布隆过滤器(BloomFilter)与Hash算法

布隆过滤器(BloomFilter)与Hash算法 Hash算法在应⽤中⼜称为指纹(fingerprint)或者摘要(digest)算法,是⼀种将任意长度的明⽂串映射为较短的数据串(hash值)的算法,⽬前的Hash算法主要是MD5系列算法与SHA系统算法 ⼀个好的Hash算法需要具有四个特性,即正向快速,逆向困难,输⼊敏感,冲突避免 正向快速:给定明⽂和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值 逆向困难:给定Hash 值,在有限时间内难以逆推出明⽂ 输⼊敏感:原始输⼊信息发⽣任何改变,新产⽣的 Hash 值都应该出现很⼤不同 冲突避免:很难找到两段内容不同的明⽂,使得它们的 Hash 值⼀致。

冲突避免也叫做抗碰撞性,分为强抗碰撞性与弱抗碰撞性。

如果给定明⽂前提下,⽆法找到与之碰撞的其他明⽂,则算法具有弱抗碰撞性;如果⽆法找到任意两个Hash 碰撞的明⽂,则称算法具有强抗碰撞性 由于Hash可以将任意内容映射到⼀个固定长度的字符串,⽽且不同内容映射到相同串的概率很低。

因此,这就构成了⼀个很好的“内容→索引”的⽣成关系。

对于给定的内容与存储数组,可以通过构造合适的Hash函数,使内容计算得出的Hash值不超过数组的⼤⼩,从⽽实现快速的基于内容的查找,⽤以判断"某个元素是否在⼀个集合内"的问题。

但是将映射的Hash值限制在数组⼤⼩的范围内,会造成⼤量的Hash冲突,从⽽导致性能的急速下降,所以⼈们基于Hash算法设计出了布隆过滤器 布隆过滤器采⽤了多个 Hash 函数来提⾼空间利⽤率。

对同⼀个给定输⼊来说,多个Hash函数计算出多个地址,分别在数组的这些地址上标记为1,进⾏查找时,进⾏同样的计算过程,并查看对应元素,如果都为1,则说明较⼤概率是存在该输⼊,如下图所⽰,根据内容执⾏Hash1,Hash2,HashK等函数,计算出h1,h2,hk等位置,如果这些位置全部是1,则说明abc@有很⼤概率存在 之所以说有很⼤概率,是因为不管是单⼀的Hash算法还是布隆过滤器,其思想是⼀致的,都是基于内容的编码,但是由于存储限制,都可能存在冲突,即两种⽅法都可能存在误报的问题,同时都不会存在错报的问题。

数据结构与算法(15):布隆过滤器

数据结构与算法(15):布隆过滤器
数据结构与算法(15):布隆隆过滤器器
一一、引入入
什什么情况下需要布隆隆过滤器器?我们先来看几几个比比较常⻅见的例例子子:
字处理理软件中,需要检查一一个英语单词是否拼写正确 在 FBI,一一个嫌疑人人的名字是否已经在嫌疑名单上 在网网络爬虫虫里里里,一一个网网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能
数组 链表 树、平衡二二叉树、Trie Map (红黑黑树) 哈希表
虽然上面面描述的这几几种数据结构配合常⻅见的排序、二二分搜索可以快速高高效的处理理绝大大部分判断元 素是否存在集合中的需求。但是当集合里里里面面的元素数量量足足够大大,如果有500万条记录甚至至1亿条记 录呢?这个时候常规的数据结构的问题就凸显出来了了。
这几几个例例子子有一一个共同的特点: 如何判断一一个元素是否存在一一个集合中?
二二、常规思路路与局限
如果想判断一一个元素是不不是在一一个集合里里里,一一般想到的是将集合中所有元素保存起来,然后通过 比比较确定。链表、树、散列列表(又又叫哈希表,Hash table)等等数据结构都是这种思路路。但是随 着集合中元素的增加,我们需要的存储空间越来越大大。同时检索速度也越来越慢。
数组、链表、树等数据结构会存储元素的内容,一一旦数据量量过大大,消耗的内存也会呈现线性增 ⻓长,最终达到瓶颈。
有的同学可能会问,哈希表不不是效率很高高吗?查询效率可以达到O(1)。但是哈希表需要消耗的内 存依然很高高。使用用哈希表存储一一亿 个垃圾 email 地址的消耗?哈希表的做法:首首先,哈希函数将 一一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小小于50%(哈希冲突);因此 消耗的内存:8 * 2 * 1亿 字节 = 1.6G 内存,普通计算机是无无法提供如此大大的内存。这个时候, 布隆隆过滤器器(Bloom Filter)就应运而而生生。在继续介绍布隆隆过滤器器的原理理时,先讲解下关于哈希

布隆过滤器的原理与使用

布隆过滤器的原理与使用

布隆过滤器的原理与使⽤⼀、算法介绍布隆过滤器是⼀种多哈希函数映射的快速查找算法,通常⽤于在⼤数据量场景下快速判断数据存在性。

该算法通过牺牲正确性从⽽在空间和时间上都有不错的效率。

⼆、算法原理当⼀个元素被加⼊集合时,通过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个哈希函数的计算转化成了两个哈希值的运算,完美地解决了这个问题。

位与布隆过滤器内存高效存储大规模数据的方法

位与布隆过滤器内存高效存储大规模数据的方法

位与布隆过滤器内存高效存储大规模数据的方法在当今大数据时代,存储和查询海量数据成为了一项重要的技术挑战。

传统的数据库管理系统往往需要庞大的内存和磁盘空间来存储和处理这些数据,而且查询速度也会受到限制。

为了解决这个问题,研究人员提出了许多高效存储大规模数据的方法,其中一种重要的方法就是使用位与布隆过滤器(Bitwise Bloom Filter)。

布隆过滤器是一种用于判断一个元素是否存在于一个集合中的概率型数据结构。

它通过使用一组位数组和一系列哈希函数来实现这一功能。

当一个元素加入到布隆过滤器中时,通过将元素经过多个哈希函数的计算得到多个位的索引,并将这些位设置为1。

当查询一个元素是否存在于布隆过滤器中时,同样将该元素经过哈希函数的计算得到多个位的索引,并检查对应的位是否都为1。

如果有任何一位为0,则可以确定该元素一定不存在于布隆过滤器中;如果所有位都为1,则可能存在,需要进一步验证。

然而,一般的布隆过滤器在存储大规模数据时会占用大量的内存空间。

为了解决这个问题,研究人员提出了许多方法来减少布隆过滤器的内存占用。

首先,可以使用较短的位数组来表示布隆过滤器,但会增加误判率。

这是因为当位数组较短时,不同元素的哈希函数计算得到的位索引可能会重复,导致误判。

为了降低误判率,可以增加哈希函数的数量,但也会增加计算的开销。

因此,在平衡内存占用和误判率之间需要进行权衡,根据具体需求选择适当的位数组长度和哈希函数数量。

其次,可以采用多层级的布隆过滤器来存储数据。

这种方法将数据按照某种规则划分为多个子集,并针对每个子集构建一个独立的布隆过滤器。

查询时首先判断元素属于哪个子集,然后在对应的子集布隆过滤器中进行查询。

这种方法可以减少每个布隆过滤器的位数组长度,从而降低内存占用。

另外,可以通过压缩位数组来减少内存占用。

传统的布隆过滤器使用一个位来表示一个元素是否存在于集合中,而压缩布隆过滤器则将多个位编码为一个字节或更长的数据块。

布隆过滤器的原理和应用

布隆过滤器的原理和应用

布隆过滤器的原理和应用布隆过滤器是一种高效的数据结构,用于检索一个元素是否存在于一个大型集合中。

它具有快速查询速度和低存储需求的特点,广泛应用于各种大规模数据处理场景中。

本文将介绍布隆过滤器的原理和应用。

一、原理布隆过滤器基于一系列的哈希函数和位数组实现快速的元素查询。

其核心思想是,当一个元素被加入集合时,通过多个哈希函数将该元素映射到一个位数组的多个位置上,将这些位置的值设置为1。

当判断一个元素是否存在于集合时,将该元素进行相同的哈希函数映射,并检查对应位置上的值是否都为1。

若有任意一个位置的值为0,则可以确定该元素不存在于集合中,否则可能存在于集合中。

布隆过滤器的哈希函数通常采用 MurmurHash、FNV 等快速哈希算法,可以保证哈希值的均匀分布。

位数组中的每个位置只需要占用一个比特位,因此可以在节省存储空间的同时实现大规模数据的快速检索。

二、应用布隆过滤器广泛应用于各种实际场景中,以下是几个常见的应用示例:1. 大规模数据去重在大规模数据处理中,数据去重是一个常见的问题。

使用布隆过滤器可以快速判断一个元素是否已存在于已有数据集合中,从而去除重复数据,提高数据处理效率。

2. 防止缓存穿透在缓存系统中,如果缓存中不存在某个请求的结果,而数据库中也不存在该结果,那么该请求会直接穿透缓存直接访问数据库,导致数据库压力过大。

使用布隆过滤器可以在缓存层判断该结果是否存在于数据库中,减轻数据库的负载。

3. 防止恶意请求布隆过滤器可以用于恶意请求的过滤,例如防止恶意爬虫大量请求网站接口,或者阻断某种类型的网络攻击。

通过将恶意请求的特征信息加入布隆过滤器,可以在前置的高效过滤器层阻止恶意请求,减少服务器的压力。

4. URL过滤在网络爬虫等应用中,需要对URL进行过滤,防止重复抓取和进入黑名单网站。

使用布隆过滤器可以快速判断一个URL是否已经被访问过,从而避免重复请求。

5. 拼写检查布隆过滤器可以用于拼写检查和自动纠错。

布隆过滤器实现原理及应用场景

布隆过滤器实现原理及应用场景

布隆过滤器实现原理及应用场景布隆过滤器是一种在大规模数据集中进行快速查找的数据结构。

它的主要应用场景是在判断一个元素是否存在于集合中时,非常高效。

在本篇文章中,我将详细介绍布隆过滤器的实现原理以及应用场景。

一、实现原理布隆过滤器的实现基于一个位数组和多个哈希函数。

位数组通常由一系列二进制位组成,初始时都被设置为0。

而哈希函数则用于将输入的元素映射到位数组中的不同位上。

1. 插入过程:当需要向布隆过滤器中插入一个元素时,首先将该元素经过多个哈希函数进行哈希计算,得到一系列哈希值。

然后将位数组中对应位置的二进制位设为1,表示该位置上存在一个元素。

2. 查询过程:当需要判断一个元素是否存在于布隆过滤器中时,将该元素经过同样的哈希函数计算,得到一系列哈希值。

然后检查位数组中对应位置的二进制位是否都为1,如果有任何一个位置的二进制位为0,表示该元素一定不存在于布隆过滤器中;如果所有位置的二进制位都为1,表示该元素可能存在于布隆过滤器中(注意:可能是因为存在哈希冲突)。

需要特别注意的是,布隆过滤器有一定的误判率。

即使所有位置的二进制位都为1,表示元素可能存在于布隆过滤器中,但并不一定准确。

因此,在实际应用中,布隆过滤器常常与其他数据结构(如哈希表)一起使用,用于缩小误判率。

二、应用场景布隆过滤器具有快速查找、占用内存较小等优势,因此在以下场景中被广泛应用。

1. 网络爬虫中的URL去重在网页爬取过程中,经常需要判断一个URL是否已经被爬取过。

传统的方法是使用哈希表来存储已爬取的URL,但是当爬取的数据量非常大时,哈希表的存储空间将会非常庞大。

而布隆过滤器可以以较小的内存空间满足去重需求,大大提高了爬取效率。

2. 垃圾邮件过滤在邮件服务器中,需要对每封新到达的邮件进行是否为垃圾邮件的判断。

使用布隆过滤器可以快速判断邮件的发件人、主题等信息是否属于已知的垃圾邮件特征,从而将判定为垃圾邮件的邮件快速过滤掉,提高了邮件处理效率。

布隆过滤器原理与实践技术分享ppt

布隆过滤器原理与实践技术分享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.初始化:将位数组初始化为全0。

2.添加元素:对于要添加的元素,使用多个哈希函数计算出多个哈希值,然后将对应的位数组位置设为1。

3.判断元素:对于要判断的元素,同样使用多个哈希函数计算出多个哈希值,然后检查对应的位数组位置是否都是1。

若有任意一个位数组位置为0,则判定元素不存在于集合中;若全部位数组位置都为1,则判定元素可能存在于集合中。

布隆过滤器的优点布隆过滤器具有以下优点: - 空间效率高:布隆过滤器只需要占用很少的内存空间,比其他数据结构如散列表等要小得多。

- 查询效率高:布隆过滤器只需要进行位操作和哈希计算,所以查询效率非常高。

- 可并行处理:布隆过滤器的查询和插入操作可以并行处理,因为它们对位数组的操作没有依赖关系。

布隆过滤器的应用场景布隆过滤器在以下场景中具有较大的应用价值:1.网络爬虫中的URL去重:爬虫在抓取网页时,通常需要判断一个URL是否已经抓取过,布隆过滤器可以非常高效地进行URL去重。

2.邮件服务器中的垃圾邮件过滤:布隆过滤器可以帮助邮件服务器快速判断一封邮件是否是垃圾邮件,从而提高邮件过滤的效率。

3.分布式系统中的缓存穿透控制:布隆过滤器可以用于控制分布式系统中的缓存穿透问题,减轻数据库压力。

4.数据库查询缓存:布隆过滤器可以用于缓存数据库的部分查询结果,提高数据库查询效率。

布隆过滤器的误判率布隆过滤器的误判率是根据哈希函数的数量和位数组的大小决定的。

误判率主要取决于以下两个因素: - 哈希函数的数量:哈希函数越多,误判率越低,但算法的效率也会降低。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 6.错误率估计 • 在估计之前为了简化模型,我们假设kn<m且各个哈希函 数是完全随机的。当集合S={x1, x2,…,xn}的所有元素都 被k个哈希函数映射到m位的位数组中时,这个位数组中 某一位还是0的概率是:
其中1/m表示任意一个哈希函数选中这一位的概率(前提是哈希函数是完全随机 的),(1-1/m)表示哈希一次没有选中这一位的概率。要把S完全映射到位数组中, 需要做kn次哈希。某一位还是0意味着kn次哈希都没有选中它,因此这个概率就 是(1-1/m)的kn次方
• 随机数法 • 选择一个随机函数,把关键字的随机函数值作为它的哈 希值。 • 通常当关键字的长度不等时用这种方法。
• (6)哈希冲突的解决 • 选用哈希函数计算哈希值时,可能不同的 key 会得到相 同的结果,一个地址怎么存放多个数据呢?这就是冲突。 • 常用的主要有两种方法解决冲突:
• 1.开放定址法: • 只要经过哈希计算后又冲突,就去寻找下一个空的散列 地址,只要这个散列表足够大,就一定可以找到一个合 适的地址。但是散列表不能定义太大,会带来内存上的 巨大开销,所以散列表大小要设计合理。 • Hi(key) = (H(key)+di) MOD m (di=1,2,3,......,m-1), 其 中:H(key)为哈希函数;m为哈希表表长;di为增量序 列
次将没有任何效果。在下图中,k=3,且有两个哈希函
数选中同一个位置(从左边数第五位,即第二个 “1“处)。
• 在判断y是否属于这个集合时,我们对y应用k次哈希函 数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就 认为y是集合中的元素,否则就认为y不是集合中的元素。 下图中y1就不是集合中的元素(因为y1有一处指向了 “0”位)。y2或者属于这个集合,或者刚好是一个 false positive。
个放入元素的位置,就如开放定址法的表满的时候不能
放入元素,而链地址法只是在后面动态申请节点就可以。
• 5.集合表示和元素查询 • 下面我们具体来看Bloom Filter是如何用位数组表示集合 的。初始状态时,Bloom Filter是一个包含m位的位数组, 每一位都置为0。
• 为了表达S={x1, x2,…,xn}这样一个n个元素的集合, Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到 {1,…,m}的范围中。对任意一个元素x,第i个哈希函数映 射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个 位置多次被置为1,那么只有第一次会起作用,后面几
• 4.哈希函数 • (1)哈希函数又叫散列函数,一个哈希函数的输入域
可以是非常大的范围,但是他的输出域是一个固定的范
围 • (2)性质: • 典型的哈希函数都拥有无限的输入值域 • 输入值相同的时候,输出值也一样 • 输入值不一样时,输出值可能一样,也可能不一样 不同的输入值得到的哈希值,整体均匀的分布在输出域上
• 原理:给定一组数字,首先选取合适的哈希表的长度, 尽量选择合适的长度。之后依次进行计算,每得到一个 值,去哈希表中看是否该数字对应的地址为空,如果为 空此次地址寻找完毕,探测次数为一,如果不为空,原 数据加一再进行计算,每次加一,直到找到地址为空的 地方,探测次数为找到空的地址判断了多少次。
• 例:已知一组关键字为(30,11,41,26,15,9),用 除余法构造散列函数,用线性探查法解决冲突构造这组 关键字的散列表。 • 已知数据个数为6个,不如取m=7,构建一个从0~6的一 个哈希表(散列表),散列函数为:h(key)=key%7
平均查找长度就是比较次数相加除以元素个数(1+1+2+1+1+1)/6=7/6
• 步骤:1.每个数对7取余计算,30%7=2,地址为2的位 置为空,把30放入2位置,比较次数为1次;1%7=4,4 位置为空,放入,比较次数1次;41%7=6,6位置为空 放入;26%7=5,位置为空放入;15%7=1,位置为空放 入;9%7=2,地址2位置已经放入了30,此地址不为空, 就接着向下找,(9+1)%7=3,3的位置为空放入。如
• 令ρ为位数组中0的比例,则ρ的数学期望E(ρ)= p’。在 ρ已知的情况下,要求的错误率(false positive rate)为:
• (1-ρ)为位数组中1的比例,(1-ρ)k就表示k次哈希都刚好 选中1的区域,即false positive rate。 • 分别将p和p’代入上式中,得:
果得到的地址还不为空,就接着向下找,直到找到空的
地址放进去。
• 二次探测散列法: • 如果有一个数正好得到1的位置,可是1的后面没有位置, 但是他的前面有位置,这样他需要把表中的每个地方都 判断一遍,效率很差。 • 因此我们可以改进di = 12, -12, 22, -22,……, q2, -q2 (q <= m/2),这样就等于是可以双向寻找到空位置,可以避免前 面的需要判断整个表的情况 • 我们称这种方法为二次探测法。
• 2.存在的问题 • (1)查找结果不保证100%正确。 • (2)不支持删除一个已经插入的关键字,因为该关键 字对应的位会牵动到其他的关键字。 • 改进办法:counting Bloom filter,用一个counter数组代 替位数组,就可以支持删除了。
• 3.如何根据输入元素个数n,确定位数组m的大小及hash 函数个数 • 当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率 不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意 n个元素的集合。但m还应该更大些,因为还要保证bit数 组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是
• (4)哈希函数 • 哈希的过程中需要使用哈希函数进行计算。 • 哈希函数是一种映射关系,根据数据的关键词 key ,通 过一定的函数关系,计算出该元素存储位置的函数。 • 表示为: • address = H [key]
• (5)几种常见的哈希函数(散列函数)构造方法 • 直接定址法 • 取关键字或关键字的某个线性函数值为散列地址。 • 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常 数。 • 例:
nlg(1/E)1.44倍(lg表示以2为底的对数)。
• 举个例子我们假设错误率为0.01,则此时m应大概是n的 13倍。这样k大概是8个 • Bloom filter将集合中的元素映射到位数组中,用k(k为 哈希函数个数)个映射位是否全1表示元素在不在这个 集合中。Counting bloom filter(CBF)将位数组中的每 一位扩展为一个counter,从而支持了元素的删除操作。 Spectral Bloom Filter(SBF)将其与集合元素的出现次 数关联。SBF采用counter中的最小值来近似表示元素的 出现频率。
• H[2] = 2 % 3 = 2; • H[5] = 5 % 3 = 2; • H[9] = 9 % 3 = 0; • H[13] = 13 % 3 = 1;
然后把它们存储到对应的位置。
当要查找 13 时,只要先使用哈希函数
计算它的位置,然后去那个位置查看 是否存在就好了,本例中只需查找一
次,时间复杂度为 O(1)。
• 除留余数法 • 取关键字被某个不大于散列表长度 m 的数 p 求余,得到 的作为散列地址。 • 即 H(key) = key % p, p < m。 • 例:
• 数字分析法 • 当关键字的位数大于地址的位数,对关键字的各位分布 进行分析,选出分布均匀的任意几位作为散列地址。 • 仅适用于所有关键字都已知的情况下,根据实际应用确 定要选取的部分,尽量避免发生冲突。
开放定址法只要在散列表未填满时,总是可以找到不发生冲突的地址。
• 2.链地址法(拉链法) • 和开放定址法的求法类似,只不过当冲突的时候,不再 像后查找,而是在当前位置生成一条链,是单链表的结 构,按照顺序依次计算就可以。 • 已知一组关键字为(30,11,41,26,15,9),我们用 前面同样的7为除数,进行除留余数法: • 下面的每个元素的存储空间大小都应该是相同的
开放地址法处理冲突的散列表上执行删除操作,只能在
被删结点上做删除标记,而不能真正删除结点。
• 拉链法的缺点:指针需要额外的空间,所以当结点规模 较小时,开放定址法较为节省空间,而若将节省的指针 空间用来扩大散列表的规模,可使装填因子(a=表中填 入的记录数 / 哈希表的长度)变小,这又减少了开放定 址法中的冲突,从而提高平均查找速度。 • 链地址法相比于开放定址法,链地址法一定可以找到一
• 链地址法有如下几个优点: • 链地址法处理冲突简单,且无堆积现象,他的数据不会 非常密集的出现在一块区域,因此平均查找长度较短; • 由于链地址法中是一个链表的结构,拥有链表的所有特 点,各链表上的结点空间是动态申请的,故它更适合于 造表前无法确定表长的情况,减少对不必要内存的开销;
• 在用链地址法构造的散列表中,删除结点的操作易于实 现。只要简单地删去链表上相应的结点即可。而对开放 地址法构造的散列表,删除结点不能简单地将被删结 点 的空间置为空,否则将截断在它之后填入散列表的同义 词结点的查找路径。这是因为各种开放地址法中,空地 址单元(即开放地址)都是查找失败的条件。因此在用
• (3)哈希函数的重要性 • 我们通常使用数组或者链表来存储元素,一旦存储的内 容数量特别多,需要占用很大的空间,而且在查找某个 元素是否存在的过程中,数组和链表都需要挨个循环比 较,而通过 哈希 计算,可以大大减少比较次数。
• 例:现在有 4 个数 {2,5,9,13},需要查找 13 是否存在。 • 使用数组存储: • int[] numbers = new int[]{2,5,9,13}; • • • • • for (int i = 0; i < numbers.length; i++) { if (numbers[i] == 13){ System.out.println("find it!"); return; } }需要遍历 4 次才能找到,时间复杂度为 O(n)。
相关文档
最新文档