2009-09-09 38 views
2

インデックスによってアクセスされるmy sortedDictionaryの要素の値を設定する必要があります。SortedDictionaryのi番目の値を設定する

I.e.

sortedDictionary.Values[index] = value; // compile error 

以下は、インデックスではなくキーでアクセスされるため、間違っていることに注意してください。

sortedDictionary[index] = value; // incorrect 

私は以下の解決策を考え出しましたが、直感はそれが遅いと伝えます。私はキーによるアクセスがO(ログN)であり、インデックスによるアクセスがO(1)であると仮定していますが、私は確信していません。

sortedDictionary[sortedDictionary.ElementAt(index).Key] = value; 

いくつかの背景:

私は速いの挿入、削除、検索を必要とするので、SortedDictionaryを使用していて、隣の要素にアクセスできるようにします。 (すなわち、次に高いまたは次に低い)。効率は重要である。

+2

ElementAt(インデックス)は、列挙型の拡張メソッドです。SortedDictionaryはIListインターフェイスを実装していないため、O(n)時間に動作します。 – maciejkow

+0

組み込みの.NET構造のどれも私が必要とするもののために働かないようです。私はスキップリストと一緒に行くかもしれない。 – abtree

答えて

2

これは少しトレードオフです。

SortedListを使用してインデックス検索を高速化することはできますが、挿入速度を犠牲にすることになります。 MSDNを引用する

... SortedDictionary<(Of <(TKey, TValue>)>)SortedList<(Of <(TKey, TValue>)>)クラスのもう一つの違いは、 SortedList<(Of <(TKey, TValue>)>) がキーによって返さ コレクションをキーと値の効率的なインデックス検索 をサポートすることで、 値のプロパティ。 リストは、 のプロパティとアクセスされたときにリストを再生成する必要はありません。 リストは、 のキーと値の内部配列のラッパーにすぎないためです。

両方 SortedDictionary

SortedListIDictionaryを実装したので、私は一緒にいくつかのテストデータとコードプロファイラを取得し、両方をしようとするだろう。

いずれも高速でない場合は、Dictionary(高速挿入、更新、キー検索)を使用して、第2のデータ構造内のインデックスを手動で維持することを検討する必要があります。

関連する問題