2010-12-14 6 views
2

私は、30,000の値を含むリストを持つ10個のキーを含む辞書を持っています。値には、DateTimeプロパティが含まれています。DateTimeによるコレクション検索の最も速い方法

30〜60秒の日付範囲のように、キーの小さなサブセットを抽出する必要がよくあります。

これを行うのは簡単ですが、速く走らせることはそうではありません。このインメモリデータを照会する最も効率的な方法は何でしょうか?

ありがとうございます。

答えて

2

最初の日付でリストをソートし、バイナリ検索(つまりkアイテム)で必要なアイテムを見つけて返すと、最初と最後のインデックスを検索する必要があるため、検索されたアイテムがO(log(n)それらを返却することは、O(K +)、N(ログ)Aliostadへの返信で

IEnumerable<item> GetItems(int startIndex, int endIndex, List<item> input) 
    { 
     for (int i=startIndex;i<endIndex;i++) 
      yield return input[i]; 
    } 
2

1)辞書を保ち、代わりに

2 DateTimeプロパティによってソートされた辞書の値のリスト、のSortedListを使用)ソートされたリストにあなたの範囲の上端と下端を見つけるためにバイナリ検索を実装あなたに索引が付いています。 Sortedlist.Values.Skip(lowerIndex).Take(upperIndex - lowerIndex)

+0

Skip(lowerIndex)は良い方法ではありませんO(n) –

0

最速の方法を使用して範囲内の

3)だけを選択した値は、それはあなたが検索したいものによってインデックス付けされるようにデータを整理することになります。現在のところ、キーで索引付けされていますが、日付で検索したいとします。あなたが検索できるようにしたいのであれば、日付で索引付けすることをお勧めします。

私は2つの辞書を保持しています.1つは現在のように索引付けされ、もう1つは日付で索引付けされます。私は時間枠(例えば1分)を決め、それが起きた分に基づいてリストに各オブジェクトを追加し、そのリストの各キーをその分のキーの下に辞書に追加します。特定の時間枠のデータが必要な場合は、関連する分を生成し、辞書からリストを取得します。これは、オブジェクトから他の辞書のキーを知ることができることに依存しています。

0

だすべてでO(K)である:コレクションのリストがリンクされたリストである場合、私はbsearchは動作しませんとは思いません。それはまだO(n)がかかります

関連する問題