题目:
用编程语言实现布隆过滤器(内存中实现),要求如下:
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
}
}