2016-07-26 5 views
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; 
    } 
} 
+0

ブルームフィルタをセットまたはコレクションと混同しないでください。それらは異なる特性を有する。特に、ブルームフィルタのサイズを変更することはあまり意味がありません。これまでにフィルタに追加されたすべてのハッシュを再計算する必要があります。これは、それらすべてを参照する必要があります。 – dimo414

+0

[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

+0

複数のブルームフィルタからなるブルームフィルタのようなデータ構造を提案している[この論文](http://gsd.di.uminho.pt/members/cbm/ps/dbloom.pdf)が見つかりました。それはより複雑で、より漸近的なパフォーマンスを持ちますが、それは賢いです。それでも、フィルタを実装するのではなく、フィルタの適切な開始値を判断する方がよいでしょう。 – dimo414

答えて

0

ブルームフィルタは、事前に挿入する要素の数を知っている場合にのみ機能します。通常、偽陽性のエラーPと挿入する要素の数はNです。これらを使用して、ハッシュ関数の数を計算します。Hと容量Mです。

事前に要素の数がわからない場合、唯一の方法は、すべての要素をBloomフィルタ(ファイルなど)に追加するときに外部のどこかに格納することです。追加要素の数が安全なしきい値Nを超えた場合、あなた:

  1. は、現在のブルームフィルタのインスタンスを削除
  2. 新しいMHP由来とN*2(またはN*3/2
  3. 読み取りと新しいブルームフィルタのインスタンスを作成しますファイルからのすべての要素を新しいBloomフィルタインスタンスに挿入する
関連する問題