免責事項:この質問に対する完全に明白な答えはHashSet<string>
. それはとてつもなく速く、順序付けられておらず、その値は一意です。
しかし、私はちょうど疑問に思っています.なぜならHashSet<T>
、それは変更可能なクラスなので、、、Add
などがありますRemove
; したがって、これらの操作を可能にする基礎となるデータ構造が、読み取り操作に関して特定のパフォーマンスを犠牲にするかどうかはわかりません。特に、Contains
.
基本的に、 type のオブジェクトのメソッドを提供できる、存在する絶対的に最速のデータ構造は何だろうと思っています。.NET フレームワーク自体の内外。Contains
string
制限に関係なく、あらゆる種類の答えに興味があります。たとえば、ある構造が特定の長さの文字列に制限されたり、問題の領域 (たとえば、可能な入力値の範囲) に応じて最適化されたりする可能性があると想像できます。存在する場合は、それについて聞きたいです。
最後に 1 つ: これを読み取り専用のデータ構造に限定しているわけではありません。明らかに、読み取り/書き込みデータ構造は、読み取り専用ラッパー内に埋め込むことができます。「読み取り専用」という言葉に言及した唯一の理由は、データ構造に追加、削除などを許可する必要がないからです。ただし、それらの機能があれば文句は言いません。
更新:
モロンの答えは、私が探している種類のものの優れた例です。Trie *は、次の理由から間違いなく大きな可能性のように思えます: someHashSet<T>.Contains
の機能に依存します。これは、私が知る限り、.NET ではデフォルトで O(n)** です。つまり、文字列内のすべての文字を調べて、 またはを返す必要があります。a の場合、 の戻り値のみが O(n) を使用して決定されます。の戻り値は、はるかに迅速に返される可能性があります。GetHashCode
IEqualityComparer<string>
HashSet<string>.Contains
true
false
Trie
true
false
これはもちろん仮説です。HashSet<string>
これまでのところ、a at に勝る .NET の Trie 実装を書いたり、見つけたりしたことはありませんContains
(ただし、自分で書いた実装は、アルファベット 'a' から 'z' に非常に近いものでした)。私はただ言っている、それは可能だと思われる.
*ちなみに、そのリンクは、別の興味深い/同様の可能性にもつながりました: DAWG .
**ここで「n」は文字列の長さを指しています。