zoukankan      html  css  js  c++  java
  • 布隆过滤器

            // 创建布隆过滤器,设置存储的数据类型,预期数据量,误判率 (必须大于0,小于1)
            int insertions = 10000000;
            double fpp = 0.0001;
            BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), insertions, fpp);
    
    // 随机生成数据,并添加到布隆过滤器中(将预期数据量全部塞满)
    // 同时也创建一个List集合,将布隆过滤器中预期数据的十分之一存储到该List中
            List<String> lists_1 = new ArrayList<String>();
            for (int i = 0; i < insertions; i++) {
                String uid = UUID.randomUUID().toString();
                bloomFilter.put(uid);
                if (i < insertions / 10) {
                    lists_1.add(uid);
                }
            }
    
    // 再创建一个List集合,用来存储另外 五分之一 不存在布隆过滤器中的数据
            List<String> lists_2 = new ArrayList<String>();
            for (int i = 0; i < insertions / 5; i++) {
                String uid = UUID.randomUUID().toString();
                lists_2.add(uid);
            }
    
    // 对已存在布隆过滤器中的lists_1中的数据进行判断,看是否在布隆过滤器中
            int result_1 = 0;
            for (String s : lists_1) {
                if (bloomFilter.mightContain(s)) result_1++;
            }
            System.out.println("在 <已存在> 布隆过滤器中的" + lists_1.size() + "条数据中,布隆过滤器认为存在的数量为:" + result_1);
    
    // 对不存在布隆过滤器中的lists_2中的数据进行判断,看是否在布隆过滤器中
            int result_2 = 0;
            for (String s : lists_2) {
                if (bloomFilter.mightContain(s)) result_2++;
            }
            System.out.println("在 <不存在> 布隆过滤器中的" + lists_2.size() + "条数据中,布隆过滤器认为存在的数量为:" + result_2);
    
    // 对数据进行整除,求出百分率
            NumberFormat percentFormat = NumberFormat.getPercentInstance();
            percentFormat.setMaximumFractionDigits(2);
            float percent = (float) result_1 / lists_1.size();
            float bingo = (float) result_2 / lists_2.size();
            System.out.println("命中率为:" + percentFormat.format(percent) + ",误判率为:" + percentFormat.format(bingo));
        }
    

     以上是com.google.guava的过滤器

    Redission构建过滤器   

    Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456").setDatabase(0); RedissonClient redission = Redisson.create(config); RBloomFilter<Object> phoneList = redission.getBloomFilter("phoneList"); phoneList.tryInit(1000000L,0.03); //将号码10086插入到布隆过滤器中 phoneList.add("10086"); //判断下面号码是否在布隆过滤器中 System.out.println(phoneList.contains("123456"));//false System.out.println(phoneList.contains("10086"));//true
    思路:
            boolean contains = phoneList.contains("10086");
            //可能存在时有可能不存在误差率自定义  小于1大于0
                if(contains){
                    RAtomicDouble s = redission.getAtomicDouble("s");
                    if(null!=s){
    //                    return  s;
                    }else{
                        //db.get("s")
    //                    return  s;
                    }
                }else{
                    //一定不存在
                }
    
    一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰
  • 相关阅读:
    HDU 5044 Tree 树链剖分
    HDU 3966 Aragorn's Story 动态树 树链剖分
    HDU 2475 BOX 动态树 Link-Cut Tree
    上阶段总结
    HDU 3487 Play with Chain | Splay
    HDU 3726 Graph and Queries 平衡树+前向星+并查集+离线操作+逆向思维 数据结构大综合题
    VIJOS P1081 野生动物园 SBT、划分树模板
    VIJOS P1647 不差钱 SBT
    HDU 1890 Robotic Sort | Splay
    基础练习(VIP部分-持续更新)
  • 原文地址:https://www.cnblogs.com/wangbiaohistory/p/15032767.html
Copyright © 2011-2022 走看看