Java 大数据算法 布隆过滤器的简单实现

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的,布隆过滤器可以用于检索一个元素是否在一个集合中,因此它是一个空间效率极高的概率型算法;它实际上是一个很长的二进制向量和一系列随机映射函数;

优缺点

仅仅保留数据的指纹信息,空间效率极高;
查询效率极高,时间复杂度为:O(n);
信息安全性较高;

存在一定的误判;(默认大概3% 的错误率,可牺牲时间和空间,使错误率无限趋向于零)
数据删除困难;

public class BloomFilterDemo {
	
	private static final int insertions = 1000000;//100w
	

	
	
	@Test
	public void bfTest(){
		//初始化一个存储string数据的布隆过滤器,初始化大小100w
		BloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), insertions,0.001);
		
		//初始化一个存储string数据的set,初始化大小100w
		Set<String> sets = new HashSet<>(insertions);
		//初始化一个存储string数据的set,初始化大小100w
		List<String> lists = new ArrayList<String>(insertions);
		
		//向三个容器初始化100万个随机并且唯一的字符串,100万个uuid 34M多
		for (int i = 0; i < insertions; i++) {
			String uuid = UUID.randomUUID().toString();
			bf.put(uuid);
			sets.add(uuid);
			lists.add(uuid);
		}
		
		int wrong = 0;//布隆过滤器错误判断的次数
		int right =0;//布隆过滤器正确判断的次数
		//在大街上找10000个人
		for (int i = 0; i < 10000; i++) {
			String test = i % 100 == 0 ? lists.get(i/100):UUID.randomUUID().toString();//按照一定比例选择bf中肯定存在的值
			if(bf.mightContain(test)){
				if(sets.contains(test)){
					right ++;
				}else{
					wrong ++;
				}
			}
		}
		
		System.out.println("================right==============="+right);
		System.out.println("================wrong==============="+wrong);
	}
	
	
	
	
	
	
	
	
	
	//720万长度的bit数组 容量约为0.86M
	//1400万长度的bit数组容量约为1.67M

}

你可能感兴趣的:(Java,Android,java,Android)