【大数据管理】Java实现布隆过滤器(BF)

题目:

用编程语言实现布隆过滤器(内存中实现),要求如下:

1.自定数据(数字或者字符串都行)

2.构建布隆过滤器(有一个方法能够判别数据是否存在,输出为true或者false)

3.必须手动实现,不能调现有库

解题思路

Bloom过滤器原理比较简单,类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。

算法描述如下:

1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数

2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0

3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1

4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。

package BloomFilter;

import java.util.BitSet;

public class BloomFilter {

    //bloomFilter大小
    private static final int SIZE = 1<<24;

    //bitset初始化
    private static final BitSet bitset=new BitSet();

    //计算hash值的辅助数组
    static final int[] seeds= {2, 3, 5, 7, 11, 13, 17, 19};

    //获取hash值
    public static int getHash(String data,int seed){
        int hash = 0;
        char arrChar[] = data.toCharArray();
        if (arrChar.length>0){
            for (int i = 0;i<arrChar.length;i++){
                hash = hash*seed+arrChar[i];//自定义hash算法
            }
        }
        return hash&(SIZE-1);
    }

    //  过滤  查找是否存在
    public static boolean isExist(String data){
        if(data==null&&data.length()==0){
            return false;
        }
        boolean res = true;
        for (int i = 0;i<seeds.length;i++){
            int index = getHash(data,seeds[i]);
            res&=bitset.get(index);//与运算,只要有有一个位置为null就false
        }
        return res;
    }
    // 标识 bitset置位
    public static void add(String data){
        for (int i = 0;i<seeds.length;i++){
            int  hash = getHash(data,seeds[i]);
            bitset.set(hash,true);
        }

    }

    public static void main(String[] args) {
        System.out.println(isExist("111111"));//false
        add("111111");
        System.out.println(isExist("111111"));//true

        System.out.println(isExist("1111112"));//false
        add("1111112");
        System.out.println(isExist("1111112"));//true
    }
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WiIsonEdwards

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值