私の目標は、メモリを犠牲にして要素の検索時間IList<T>を達成するインターフェイスを実装するデータ構造を作成することです。O(1)
背景
ご存じのとおり、すべての配列ベースのIList<T>実装にList<T>は、O(n)要素のルックアップ時間があります。これは、一致するものが見つかるまで、操作が下にある配列に対して likeint IndexOf(T element)またはbool Contains(T element)iterate することを意味します。
リストとハッシュテーブルの組み合わせを基になるデータ構造として使用するという、よく知られたアイデアの実現。値はリストに保持されます。ハッシュテーブルは、インデックスを値として保持し、リストの値をキーとして保持します。したがって、ハッシュテーブルを使用してルックアップを実行できます。
これがまさにKeyedCollection<TKey, TItem> MSDNの実装方法です。
これまでに試したこと
internal class MyList<T> : KeyedCollection<T, T>
{
protected override T GetKeyForItem(T item)
{
return item;
}
}
これは、1つの問題を除いてこれまでのところうまくいきました。このデータ構造は、背後で期待される動作を正確に模倣するものではありませんList<T>。ポイントは、List<T>重複を許可し、許可MyListしないということです。
質問
IList<T>すぐに使用できるデータ構造はありますか、または次のように実装するエレガントな方法をお勧めできますか?
- ルックアップ操作には
O(1)時間がかかります。 - 他のすべての操作は
O()、List<T> - メモリーは、ハッシュテーブルのオーバーヘッド (
constantA + constantB * nバイト) によって損なわれる可能性があります。 - 重複を許可する必要があります
- null の許可はオプションです (null オブジェクトにボックス化できます)。