私の目標は、メモリを犠牲にして要素の検索時間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 オブジェクトにボックス化できます)。