数千万ビットのビット配列を作成する情報検索アプリケーションがあります。配列内の「セット」ビットの数は、すべてクリアからすべてセットまで、大きく異なります。現在、私は単純なビット配列(java.util.BitSet
)を使用しているので、各ビット配列は数メガバイトかかります。
私の計画は、最初のNビットのカーディナリティを調べてから、残りのデータ構造に使用するデータ構造を決定することです。明らかに、一部のデータ構造は非常にスパースなビット配列に適していますが、他のデータ構造はビットの約半分が設定されている場合に適しています(ほとんどのビットが設定されている場合、否定を使用してスパースなゼロのセットとして扱うことができます)。
- どの構造がそれぞれの極端に適しているでしょうか?
- 真ん中に何かありますか?
ここにいくつかの制約またはヒントがあります:
- ビットは1回だけ、インデックス順に設定されます。
- 100%の精度が必要なので、ブルームフィルターのようなものでは不十分です。
- セットが構築された後、「セット」ビットを効率的に反復できる必要があります。
- ビットはランダムに分散されるため、ランレングスエンコーディングアルゴリズムは、ビットインデックスの単純なリストよりもはるかに優れているとは限りません。
- メモリ使用率を最適化しようとしていますが、速度にはまだある程度の重みがあります。
オープンソースのJava実装を備えたものは役に立ちますが、厳密には必要ではありません。ファンダメンタルズにもっと興味があります。