布隆过滤器是一种高效的数据结构,它可以用来判断一个元素是否在一个集合中。布隆过滤器使用一个位数组来表示集合中的元素,当一个元素被添加到集合中时,布隆过滤器会将位数组中与该元素相关的位设置为 1。当需要判断一个元素是否在集合中时,布隆过滤器会检查与该元素相关的位是否都为 1,如果是,则该元素一定在集合中;如果不是,则该元素一定不在集合中。
布隆过滤器具有很高的准确率,但也有可能出现误判的情况。误判是指布隆过滤器判断一个元素在集合中,但实际上该元素不在集合中。误判的概率与布隆过滤器的大小有关,布隆过滤器越大,误判的概率就越小。
布隆过滤器常用于减少数据库查询的次数和提高查询效率,例如,布隆过滤器可以用于判断一个 URL 是否在数据库中,如果不在,则直接返回结果,无需查询数据库;如果在,则再查询数据库进行进一步判断。
import java.util.BitSet;
public class BloomFilter {
private static final int DEFAULT_SIZE = 256;
private static final int DEFAULT_HASH_COUNT = 3;
private BitSet bitset;
private int size;
private int hashCount;
public BloomFilter() {
this(DEFAULT_SIZE, DEFAULT_HASH_COUNT);
}
public BloomFilter(int size, int hashCount) {
this.size = size;
this.hashCount = hashCount;
this.bitset = new BitSet(size);
}
public void add(String element) {
for (int i = 0; i < hashCount; i++) {
int hash = hash(element, i);
bitset.set(hash);
}
}
public boolean contains(String element) {
for (int i = 0; i < hashCount; i++) {
int hash = hash(element, i);
if (!bitset.get(hash)) {
return false;
}
}
return true;
}
private int hash(String element, int i) {
return Math.abs(element.hashCode() + i) % size;
}
public static void main(String[] args) {
BloomFilter bloomFilter = new BloomFilter();
bloomFilter.add("hello");
bloomFilter.add("world");
System.out.println(bloomFilter.contains("hello")); // true
System.out.println(bloomFilter.contains("world")); // true
System.out.println(bloomFilter.contains("foo")); // false
}
}