第四章 大数据处理方法布隆过滤器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开放定址法只要在散列表未填满时,总是可以找到不发生冲突的地址。
• 2.链地址法(拉链法) • 和开放定址法的求法类似,只不过当冲突的时候,不再 像后查找,而是在当前位置生成一条链,是单链表的结 构,按照顺序依次计算就可以。 • 已知一组关键字为(30,11,41,26,15,9),我们用 前面同样的7为除数,进行除留余数法: • 下面的每个元素的存储空间大小都应该是相同的
• 令ρ为位数组中0的比例,则ρ的数学期望E(ρ)= p’。在 ρ已知的情况下,要求的错误率(false positive rate)为:
• (1-ρ)为位数组中1的比例,(1-ρ)k就表示k次哈希都刚好 选中1的区域,即false positive rate。 • 分别将p和p’代入上式中,得:
ቤተ መጻሕፍቲ ባይዱ
• 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.1布隆过滤器
• 1.基本原理及要点: • 当一个元素被加入集合时,通过K个散列函数将这个元 素映射成一个数组中的K个点,把它们置为1,检索时, 只需看这些点是否是1就知道集合中是否有它。如果这 些点有任何一个为0,则被检元素一定不在,若都是1, 则很可能在。
• Bloom Filter是由Bloom在1970年提出的一种多哈希函数 映射的快速查找算法。通常应用在一些需要快速判断某 个元素是否属于集合,但是并不严格要求100%正确的 场合。
• 除留余数法 • 取关键字被某个不大于散列表长度 m 的数 p 求余,得到 的作为散列地址。 • 即 H(key) = key % p, p < m。 • 例:
• 数字分析法 • 当关键字的位数大于地址的位数,对关键字的各位分布 进行分析,选出分布均匀的任意几位作为散列地址。 • 仅适用于所有关键字都已知的情况下,根据实际应用确 定要选取的部分,尽量避免发生冲突。
• (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)。
个放入元素的位置,就如开放定址法的表满的时候不能
放入元素,而链地址法只是在后面动态申请节点就可以。
• 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,那么只有第一次会起作用,后面几
• 随机数法 • 选择一个随机函数,把关键字的随机函数值作为它的哈 希值。 • 通常当关键字的长度不等时用这种方法。
• (6)哈希冲突的解决 • 选用哈希函数计算哈希值时,可能不同的 key 会得到相 同的结果,一个地址怎么存放多个数据呢?这就是冲突。 • 常用的主要有两种方法解决冲突:
• 1.开放定址法: • 只要经过哈希计算后又冲突,就去寻找下一个空的散列 地址,只要这个散列表足够大,就一定可以找到一个合 适的地址。但是散列表不能定义太大,会带来内存上的 巨大开销,所以散列表大小要设计合理。 • Hi(key) = (H(key)+di) MOD m (di=1,2,3,......,m-1), 其 中:H(key)为哈希函数;m为哈希表表长;di为增量序 列
平均查找长度就是比较次数相加除以元素个数(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的位置为空放入。如
• H[2] = 2 % 3 = 2; • H[5] = 5 % 3 = 2; • H[9] = 9 % 3 = 0; • H[13] = 13 % 3 = 1;
然后把它们存储到对应的位置。
当要查找 13 时,只要先使用哈希函数
计算它的位置,然后去那个位置查看 是否存在就好了,本例中只需查找一
次,时间复杂度为 O(1)。
果得到的地址还不为空,就接着向下找,直到找到空的
地址放进去。
• 二次探测散列法: • 如果有一个数正好得到1的位置,可是1的后面没有位置, 但是他的前面有位置,这样他需要把表中的每个地方都 判断一遍,效率很差。 • 因此我们可以改进di = 12, -12, 22, -22,……, q2, -q2 (q <= m/2),这样就等于是可以双向寻找到空位置,可以避免前 面的需要判断整个表的情况 • 我们称这种方法为二次探测法。
• 7.最优的哈希函数个数
• 既然Bloom Filter要靠多个哈希函数将集合映射到位数组中,那么应 该选择几个哈希函数才能使元素查询时的错误率降到最低呢? • 这里有两个互斥的理由:如果哈希函数的个数多,那么在对一个不 属于集合的元素进行查询时得到0的概率就大; • 但另一方面,如果哈希函数的个数少,那么位数组中的0就多。为 了得到最优的哈希函数个数,我们需要根据上一小节中的错误率公 式进行计算。
• 原理:给定一组数字,首先选取合适的哈希表的长度, 尽量选择合适的长度。之后依次进行计算,每得到一个 值,去哈希表中看是否该数字对应的地址为空,如果为 空此次地址寻找完毕,探测次数为一,如果不为空,原 数据加一再进行计算,每次加一,直到找到地址为空的 地方,探测次数为找到空的地址判断了多少次。
• 例:已知一组关键字为(30,11,41,26,15,9),用 除余法构造散列函数,用线性探查法解决冲突构造这组 关键字的散列表。 • 已知数据个数为6个,不如取m=7,构建一个从0~6的一 个哈希表(散列表),散列函数为:h(key)=key%7
• 4.哈希函数 • (1)哈希函数又叫散列函数,一个哈希函数的输入域
可以是非常大的范围,但是他的输出域是一个固定的范
围 • (2)性质: • 典型的哈希函数都拥有无限的输入值域 • 输入值相同的时候,输出值也一样 • 输入值不一样时,输出值可能一样,也可能不一样 不同的输入值得到的哈希值,整体均匀的分布在输出域上
• (4)哈希函数 • 哈希的过程中需要使用哈希函数进行计算。 • 哈希函数是一种映射关系,根据数据的关键词 key ,通 过一定的函数关系,计算出该元素存储位置的函数。 • 表示为: • address = H [key]
• (5)几种常见的哈希函数(散列函数)构造方法 • 直接定址法 • 取关键字或关键字的某个线性函数值为散列地址。 • 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常 数。 • 例:
开放地址法处理冲突的散列表上执行删除操作,只能在
被删结点上做删除标记,而不能真正删除结点。
• 拉链法的缺点:指针需要额外的空间,所以当结点规模 较小时,开放定址法较为节省空间,而若将节省的指针 空间用来扩大散列表的规模,可使装填因子(a=表中填 入的记录数 / 哈希表的长度)变小,这又减少了开放定 址法中的冲突,从而提高平均查找速度。 • 链地址法相比于开放定址法,链地址法一定可以找到一
• 6.错误率估计 • 在估计之前为了简化模型,我们假设kn<m且各个哈希函 数是完全随机的。当集合S={x1, x2,…,xn}的所有元素都 被k个哈希函数映射到m位的位数组中时,这个位数组中 某一位还是0的概率是:
其中1/m表示任意一个哈希函数选中这一位的概率(前提是哈希函数是完全随机 的),(1-1/m)表示哈希一次没有选中这一位的概率。要把S完全映射到位数组中, 需要做kn次哈希。某一位还是0意味着kn次哈希都没有选中它,因此这个概率就 是(1-1/m)的kn次方
• 平方取中法 • 先计算出关键字值的平方,然后取平方值中间几位作为 散列地址。 • 随机分布的关键字,得到的散列地址也是随机分布的。
• 折叠法(叠加法) • 将关键字分为位数相同的几部分,然后取这几部分的叠 加和(舍去进位)作为散列地址。 • 用于关键字位数较多,并且关键字中每一位上数字分布 大致均匀。
次将没有任何效果。在下图中,k=3,且有两个哈希函
数选中同一个位置(从左边数第五位,即第二个 “1“处)。
• 在判断y是否属于这个集合时,我们对y应用k次哈希函 数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就 认为y是集合中的元素,否则就认为y不是集合中的元素。 下图中y1就不是集合中的元素(因为y1有一处指向了 “0”位)。y2或者属于这个集合,或者刚好是一个 false positive。
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[key] = key % 3; 查找范围,自然比从全部数据 • 四个数 {2,5,9,13} 对应的哈希值为 里查找速度要快。
• 链地址法有如下几个优点: • 链地址法处理冲突简单,且无堆积现象,他的数据不会 非常密集的出现在一块区域,因此平均查找长度较短; • 由于链地址法中是一个链表的结构,拥有链表的所有特 点,各链表上的结点空间是动态申请的,故它更适合于 造表前无法确定表长的情况,减少对不必要内存的开销;
• 在用链地址法构造的散列表中,删除结点的操作易于实 现。只要简单地删去链表上相应的结点即可。而对开放 地址法构造的散列表,删除结点不能简单地将被删结 点 的空间置为空,否则将截断在它之后填入散列表的同义 词结点的查找路径。这是因为各种开放地址法中,空地 址单元(即开放地址)都是查找失败的条件。因此在用
• 2.链地址法(拉链法) • 和开放定址法的求法类似,只不过当冲突的时候,不再 像后查找,而是在当前位置生成一条链,是单链表的结 构,按照顺序依次计算就可以。 • 已知一组关键字为(30,11,41,26,15,9),我们用 前面同样的7为除数,进行除留余数法: • 下面的每个元素的存储空间大小都应该是相同的
• 令ρ为位数组中0的比例,则ρ的数学期望E(ρ)= p’。在 ρ已知的情况下,要求的错误率(false positive rate)为:
• (1-ρ)为位数组中1的比例,(1-ρ)k就表示k次哈希都刚好 选中1的区域,即false positive rate。 • 分别将p和p’代入上式中,得:
ቤተ መጻሕፍቲ ባይዱ
• 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.1布隆过滤器
• 1.基本原理及要点: • 当一个元素被加入集合时,通过K个散列函数将这个元 素映射成一个数组中的K个点,把它们置为1,检索时, 只需看这些点是否是1就知道集合中是否有它。如果这 些点有任何一个为0,则被检元素一定不在,若都是1, 则很可能在。
• Bloom Filter是由Bloom在1970年提出的一种多哈希函数 映射的快速查找算法。通常应用在一些需要快速判断某 个元素是否属于集合,但是并不严格要求100%正确的 场合。
• 除留余数法 • 取关键字被某个不大于散列表长度 m 的数 p 求余,得到 的作为散列地址。 • 即 H(key) = key % p, p < m。 • 例:
• 数字分析法 • 当关键字的位数大于地址的位数,对关键字的各位分布 进行分析,选出分布均匀的任意几位作为散列地址。 • 仅适用于所有关键字都已知的情况下,根据实际应用确 定要选取的部分,尽量避免发生冲突。
• (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)。
个放入元素的位置,就如开放定址法的表满的时候不能
放入元素,而链地址法只是在后面动态申请节点就可以。
• 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,那么只有第一次会起作用,后面几
• 随机数法 • 选择一个随机函数,把关键字的随机函数值作为它的哈 希值。 • 通常当关键字的长度不等时用这种方法。
• (6)哈希冲突的解决 • 选用哈希函数计算哈希值时,可能不同的 key 会得到相 同的结果,一个地址怎么存放多个数据呢?这就是冲突。 • 常用的主要有两种方法解决冲突:
• 1.开放定址法: • 只要经过哈希计算后又冲突,就去寻找下一个空的散列 地址,只要这个散列表足够大,就一定可以找到一个合 适的地址。但是散列表不能定义太大,会带来内存上的 巨大开销,所以散列表大小要设计合理。 • Hi(key) = (H(key)+di) MOD m (di=1,2,3,......,m-1), 其 中:H(key)为哈希函数;m为哈希表表长;di为增量序 列
平均查找长度就是比较次数相加除以元素个数(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的位置为空放入。如
• H[2] = 2 % 3 = 2; • H[5] = 5 % 3 = 2; • H[9] = 9 % 3 = 0; • H[13] = 13 % 3 = 1;
然后把它们存储到对应的位置。
当要查找 13 时,只要先使用哈希函数
计算它的位置,然后去那个位置查看 是否存在就好了,本例中只需查找一
次,时间复杂度为 O(1)。
果得到的地址还不为空,就接着向下找,直到找到空的
地址放进去。
• 二次探测散列法: • 如果有一个数正好得到1的位置,可是1的后面没有位置, 但是他的前面有位置,这样他需要把表中的每个地方都 判断一遍,效率很差。 • 因此我们可以改进di = 12, -12, 22, -22,……, q2, -q2 (q <= m/2),这样就等于是可以双向寻找到空位置,可以避免前 面的需要判断整个表的情况 • 我们称这种方法为二次探测法。
• 7.最优的哈希函数个数
• 既然Bloom Filter要靠多个哈希函数将集合映射到位数组中,那么应 该选择几个哈希函数才能使元素查询时的错误率降到最低呢? • 这里有两个互斥的理由:如果哈希函数的个数多,那么在对一个不 属于集合的元素进行查询时得到0的概率就大; • 但另一方面,如果哈希函数的个数少,那么位数组中的0就多。为 了得到最优的哈希函数个数,我们需要根据上一小节中的错误率公 式进行计算。
• 原理:给定一组数字,首先选取合适的哈希表的长度, 尽量选择合适的长度。之后依次进行计算,每得到一个 值,去哈希表中看是否该数字对应的地址为空,如果为 空此次地址寻找完毕,探测次数为一,如果不为空,原 数据加一再进行计算,每次加一,直到找到地址为空的 地方,探测次数为找到空的地址判断了多少次。
• 例:已知一组关键字为(30,11,41,26,15,9),用 除余法构造散列函数,用线性探查法解决冲突构造这组 关键字的散列表。 • 已知数据个数为6个,不如取m=7,构建一个从0~6的一 个哈希表(散列表),散列函数为:h(key)=key%7
• 4.哈希函数 • (1)哈希函数又叫散列函数,一个哈希函数的输入域
可以是非常大的范围,但是他的输出域是一个固定的范
围 • (2)性质: • 典型的哈希函数都拥有无限的输入值域 • 输入值相同的时候,输出值也一样 • 输入值不一样时,输出值可能一样,也可能不一样 不同的输入值得到的哈希值,整体均匀的分布在输出域上
• (4)哈希函数 • 哈希的过程中需要使用哈希函数进行计算。 • 哈希函数是一种映射关系,根据数据的关键词 key ,通 过一定的函数关系,计算出该元素存储位置的函数。 • 表示为: • address = H [key]
• (5)几种常见的哈希函数(散列函数)构造方法 • 直接定址法 • 取关键字或关键字的某个线性函数值为散列地址。 • 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常 数。 • 例:
开放地址法处理冲突的散列表上执行删除操作,只能在
被删结点上做删除标记,而不能真正删除结点。
• 拉链法的缺点:指针需要额外的空间,所以当结点规模 较小时,开放定址法较为节省空间,而若将节省的指针 空间用来扩大散列表的规模,可使装填因子(a=表中填 入的记录数 / 哈希表的长度)变小,这又减少了开放定 址法中的冲突,从而提高平均查找速度。 • 链地址法相比于开放定址法,链地址法一定可以找到一
• 6.错误率估计 • 在估计之前为了简化模型,我们假设kn<m且各个哈希函 数是完全随机的。当集合S={x1, x2,…,xn}的所有元素都 被k个哈希函数映射到m位的位数组中时,这个位数组中 某一位还是0的概率是:
其中1/m表示任意一个哈希函数选中这一位的概率(前提是哈希函数是完全随机 的),(1-1/m)表示哈希一次没有选中这一位的概率。要把S完全映射到位数组中, 需要做kn次哈希。某一位还是0意味着kn次哈希都没有选中它,因此这个概率就 是(1-1/m)的kn次方
• 平方取中法 • 先计算出关键字值的平方,然后取平方值中间几位作为 散列地址。 • 随机分布的关键字,得到的散列地址也是随机分布的。
• 折叠法(叠加法) • 将关键字分为位数相同的几部分,然后取这几部分的叠 加和(舍去进位)作为散列地址。 • 用于关键字位数较多,并且关键字中每一位上数字分布 大致均匀。
次将没有任何效果。在下图中,k=3,且有两个哈希函
数选中同一个位置(从左边数第五位,即第二个 “1“处)。
• 在判断y是否属于这个集合时,我们对y应用k次哈希函 数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就 认为y是集合中的元素,否则就认为y不是集合中的元素。 下图中y1就不是集合中的元素(因为y1有一处指向了 “0”位)。y2或者属于这个集合,或者刚好是一个 false positive。
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[key] = key % 3; 查找范围,自然比从全部数据 • 四个数 {2,5,9,13} 对应的哈希值为 里查找速度要快。
• 链地址法有如下几个优点: • 链地址法处理冲突简单,且无堆积现象,他的数据不会 非常密集的出现在一块区域,因此平均查找长度较短; • 由于链地址法中是一个链表的结构,拥有链表的所有特 点,各链表上的结点空间是动态申请的,故它更适合于 造表前无法确定表长的情况,减少对不必要内存的开销;
• 在用链地址法构造的散列表中,删除结点的操作易于实 现。只要简单地删去链表上相应的结点即可。而对开放 地址法构造的散列表,删除结点不能简单地将被删结 点 的空间置为空,否则将截断在它之后填入散列表的同义 词结点的查找路径。这是因为各种开放地址法中,空地 址单元(即开放地址)都是查找失败的条件。因此在用