Java 大数据算法 布隆过滤器的简单实现
布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的,布隆过滤器可以用于检索一个元素是否在一个集合中,因此它是一个空间效率极高的概率型算法;它实际上是一个很长的二进制向量和一系列随机映射函数;
优缺点
仅仅保留数据的指纹信息,空间效率极高;
查询效率极高,时间复杂度为:O(n);
信息安全性较高;
存在一定的误判;(默认大概3% 的错误率,可牺牲时间和空间,使错误率无限趋向于零)
数据删除困难;
public class BloomFilterDemo {private static final int insertions = 1000000;//100w@Testpublic void bfTest(){//初始化一个存储string数据的布隆过滤器,初始化大小100wBloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), insertions,0.001);//初始化一个存储string数据的set,初始化大小100wSet<String> sets = new HashSet<>(insertions);//初始化一个存储string数据的set,初始化大小100wList<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}