`
raymond.chen
  • 浏览: 1418179 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

布隆过滤器BloomFilter

阅读更多

布隆过滤器是用来判断一个元素是否出现在给定集合中,具有快速,比哈希表更节省空间等优点,而缺点在于有一定的误识别率。布隆过滤器能够明确指出元素绝对不存在于一个集合中,或是可能存在于一个集合中。

 

布隆过滤器是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

 

布隆过滤器以下面的方式工作:

        添加元素到过滤器。

        对元素进行几次哈希运算,当索引匹配哈希的结果时,将该位设置为1的。

 

原理:S集合中有n个元素,利用k个哈希函数,将S中的每个元素映射到一个长度为m的位数组B中不同的位置上,这些位置上的二进制数均置为1,如果待检测的元素经过这k个哈希函数的映射后,发现其k个位置上的二进制数不全是1,那么这个元素一定不在集合S中,反之,该元素可能是S中的某一个元素。

 

Guava 11.0版本中增加了BloomFilter类,它使用了Funnel和Sink的设计,增强了泛化的能力,使其可以支持任何数据类型,其利用murmur3 hash来做哈希映射函数,不过它底层并没有使用传统的java.util.BitSet来做bit数组,而是用long型数组进行了重新封装,大部分操作均基于位的运算,因此能达到一个非常好的性能。

 

public class BloomFilterTest {
	public static void main(String[] args) {
		//预期插入数, 允许的错误率
		BloomFilter<String> filter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 1000, 0.0001);
		filter.put("121");
		filter.put("122");
		filter.put("123");
		System.out.println(filter.mightContain("12321")); //元素可能存在
		
		BloomFilter<String> filter2 = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 1000, 0.0001);
		filter2.put("aba");
		filter2.put("abb");
		filter2.put("abc");
		filter2.putAll(filter);
        System.out.println(filter2.mightContain("123"));
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics