我正在研究布隆过滤算法。这个概念非常简单,下面是我对" bloom过滤器结构的简单实现"在Java中。
我的问题是当bitset几乎满时如何扩展容量?如果我改变了bitset的大小,显然我必须再次考虑哈希函数,并且我必须重新安排那些存在的元素。
第二个想法是初始化另一个bloom过滤器的实例。
但这些只是我的想法,任何人都可以帮助这些?谢谢!
public class BloomFilter {
private static final int DEFAULT_SIZE = 2 << 24;
private static final int[] seeds = {7, 11, 13, 31, 37, 61};
static class SimpleHash {
private int cap;
private int seed;
public SimpleHash(int cap, int seed) {
this.cap = cap;
this.seed = seed;
}
public int hash(String str) {
int result = 0;
int length = str.length();
for (int i = 0; i < length; i++) {
result = seed * result + str.charAt(i);
}
return (cap - 1) & result;
}
}
private BitSet bitSet;
private SimpleHash[] hashes;
public BloomFilter() {
bitSet = new BitSet(DEFAULT_SIZE);
hashes = new SimpleHash[seeds.length];
for (int i = 0; i < seeds.length; i++) {
hashes[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
}
}
public void add(String str) {
for (SimpleHash hash : hashes) {
bitSet.set(hash.hash(str), true);
}
}
public boolean mightContains(String str) {
if (str == null) {
return false;
}
boolean result = true;
for (SimpleHash hash : hashes) {
result = result && bitSet.get(hash.hash(str));
}
return result;
}
}
答案 0 :(得分:2)
布隆过滤器仅在您知道要提前插入的元素数量时才有效。通常您需要误报错误P
和要插入的元素数N
,并使用它们来计算散列函数的数量H
和容量M
。
如果您事先不知道元素的数量,那么唯一的方法是在将所有元素添加到bloom过滤器(例如,在文件中)时将所有元素存储在外部。当添加的元素数超过安全阈值N
时,您:
M
和H
(或P
)N*2
和N*3/2
创建新的bloom过滤器实例