【问题标题】:Difference bloom filters and FM-sketches差异布隆过滤器和 FM 草图
【发布时间】:2012-10-28 14:44:17
【问题描述】:
布隆过滤器和哈希草图(也是 FM 草图)有什么区别,它们的用途是什么?
【问题讨论】:
标签:
hash
set
duplicates
counting
bloom-filter
【解决方案1】:
哈希草图/Flajolet-Martin 草图
Flajolet, P./Martin, G. (1985):用于数据库应用的概率计数算法,载于:计算机和系统科学杂志,第 1 卷。 31,第 2 期(1985 年 9 月),第 182-209 页。
Durand, M./Flajolet, P. (2003):大基数的对数日志计数,载于:Springer LNCS 2832,算法 ESA 2003,第 605–617 页。
哈希草图用于计算集合中不同元素的数量。
给定:
- 长度为 l 的位数组 B[]
- 映射到 [0,1,...2^l) 的(单个)哈希函数 h()
- 一个函数 r(),它给出其输入的二进制表示中最低有效 1 位的位置(例如,000101 返回 1,001000 返回 4)
元素 x 的插入:
- pn := h(x) 返回一个伪随机数
- 应用 r(pn) 将位数组的位置设置为 1
因为 h() 的输出是伪随机的,所以每个位 i 都设置为 1 ~n/(2^(i+1)) 次
集合中不同元素的数量:
- 找到位数组最右边0的位置p
- p = log2(n),求解n得到集合中不同元素的个数;
结果可能最多相差 1.83 级
用法:
- 在数据挖掘、P2P/分布式应用程序、文档频率估计等方面。
布隆过滤器
Bloom, H. (1970):在允许错误的哈希编码中进行空间/时间权衡,载于:ACM 通信,卷。 13,第 7 期(1970 年 7 月),第 422-426 页。
布隆过滤器用于测试一个元素是否是集合的成员。
给定:
- 长度为 m 的位数组 B[]
- k 个不同的哈希函数 h_k() 映射到 [0,...,m-1],即映射到 m 位数组的位置之一
元素 x 的插入:
- 对所有 k 应用 h_k 到 x (h_k(x)),即得到 k 个值
- 将数组 B 中的结果位设置为 1(如果已设置为 1,则不要更改任何内容)
检查 y 是否已经在集合中:
- 获取位置 p_k 以使用所有哈希函数 h_k (h_k(y)) 进行检查,即对于每个函数 h_k,您将获得一个位置 p_k
- 如果数组 B 中的位置 p_k 之一设置为 0,则元素 y 肯定不在集合中
- 如果 p_k 给出的所有位置都是 1,则元素 y 可能 (!) 在集合中
- 误报率约为 (1 - e^(-kn/m))^k,不可能出现误报!
- 通过增加散列函数的数量,可以降低误报率;但是,与此同时,您的布隆过滤器会变慢; k 的最优值为 k = (m/n)ln(2)
用法:
- 最初用作数据库中的廉价过滤器,以过滤掉与查询不匹配的元素
- 当今的各种应用,例如在 Google BigTable 中,还用于 IP 查找等网络中。
【解决方案2】:
Bloom Filter 是一种用于成员查找的数据结构,而 FM Sketch 主要用于元素计数。这两种数据结构提供了各自的解决方案,优化了执行查找/计算所需的空间,权衡的是结果的准确性。