0
私はブルームフィルタアルゴリズムを研究しています。概念はかなり単純ですが、以下はJavaの「ブルームフィルタ構造」の簡単な実装です。
私の質問は、ビットセットがほぼ満杯になったときに容量を拡張する方法です。ビットセットのサイズを変更すると、明らかにハッシュ関数を考慮する必要があり、それらの存在要素を再配置する必要があります。
もう一つの考えは、ブルームフィルタの別のインスタンスを初期化することです。 しかし、これは私の考えだけです、誰もこれらを助けることができますか?ありがとう!枯渇したときにブルームフィルタを拡張するには?
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;
}
}
ブルームフィルタをセットまたはコレクションと混同しないでください。それらは異なる特性を有する。特に、ブルームフィルタのサイズを変更することはあまり意味がありません。これまでにフィルタに追加されたすべてのハッシュを再計算する必要があります。これは、それらすべてを参照する必要があります。 – dimo414
[Guava](https://github.com/google/guava)は素晴らしい['BloomFilter'](https://google.github.io/guava/releases/snapshot/api/docs/com/google/)を提供しています。 common/hash/BloomFilter.html)[実装](https://google.github.io/guava/releases/snapshot/api/docs/src-html/com/google/common/hash/BloomFilter.html)参照するのが好きです。 – dimo414
複数のブルームフィルタからなるブルームフィルタのようなデータ構造を提案している[この論文](http://gsd.di.uminho.pt/members/cbm/ps/dbloom.pdf)が見つかりました。それはより複雑で、より漸近的なパフォーマンスを持ちますが、それは賢いです。それでも、フィルタを実装するのではなく、フィルタの適切な開始値を判断する方がよいでしょう。 – dimo414