这个布隆过滤器好像没啥用啊,实战用它判断不是炸了

这个布隆过滤器好像没啥用啊,实战用它判断不是炸了

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.nio.charset.Charset;

public class Test1 {

   public static void main(String[] args) {
       int count = 0;
       BloomFilter<String> bf = null;
       int expectedInsertions = 0;
       //expectedInsertions为1000
       expectedInsertions=1000;
       bf = BloomFilter.create(
               Funnels.stringFunnel(Charset.forName("utf-8")),expectedInsertions);
       for (int i = 0; i < 100000; i++) {
           bf.put(String.valueOf(i));
       }
       for (int i = 0; i < 1000; i++) {
           boolean isExist = bf.mightContain(String.valueOf("imooc"+i));
           if(isExist){
               count++;
           }
       }
       System.out.println("长度为"+expectedInsertions+",count="+count);
       count = 0;

       expectedInsertions=10000;
       bf = BloomFilter.create(
               Funnels.stringFunnel(Charset.forName("utf-8")),expectedInsertions);
       for (int i = 0; i < 100000; i++) {
           bf.put(String.valueOf(i));
       }
       for (int i = 0; i < 1000; i++) {
           boolean isExist = bf.mightContain(String.valueOf("imooc"+i));
           if(isExist){
               count++;
           }
       }
       System.out.println("长度为"+expectedInsertions+",count="+count);
       count = 0;

       expectedInsertions=100000;
       bf = BloomFilter.create(
               Funnels.stringFunnel(Charset.forName("utf-8")),expectedInsertions);
       for (int i = 0; i < 100000; i++) {
           bf.put(String.valueOf(i));
       }
       for (int i = 0; i < 1000; i++) {
           boolean isExist = bf.mightContain(String.valueOf("imooc"+i));
           if(isExist){
               count++;
           }
       }
       System.out.println("长度为"+expectedInsertions+",count="+count);
       count = 0;

       expectedInsertions=1000000;
       bf = BloomFilter.create(
               Funnels.stringFunnel(Charset.forName("utf-8")),expectedInsertions);
       for (int i = 0; i < 100000; i++) {
           bf.put(String.valueOf(i));
       }
       for (int i = 0; i < 1000; i++) {
           boolean isExist = bf.mightContain(String.valueOf("imooc"+i));
           if(isExist){
               count++;
           }
       }
       System.out.println("长度为"+expectedInsertions+",count="+count);
       count = 0;
   }
}


然后结果如下:

长度为1000,count=1000

长度为10000,count=992

长度为100000,count=40

长度为1000000,count=0


关键,1000长度的时候,他的误判率是99.2%,不是0.8%...

要把误判率降下来,得把长度加到和里面元素个数差不多...数据假如几亿条,开这么长的数组不是炸了.

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

我们不用这个的,布隆过滤器不严谨。缓存设为空。或者缓存预热即可

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师