2016-05-11 7 views
0

私はint型の厳密に型指定されたSortedSetを持っています。 xより小さい集合の中で最大の数を見つけたい。不等号でソートセットを効率的に検索するにはどうすればよいですか?

これは間違ったデータ構造ですが、直感的な考えはソートされたコレクションがあることです。確かに、私はこのタイプの検索を.NETフレームワーク経由で行うことができるはずです。

答えて

2

をあなたが列挙(線形検索 - O(N))に依存する必要がインデックスによって直接アクセスすることはできません。おそらくより良い方法はSortedSet.GetViewBetweenLastですが、最後の要素を取得できるようには見えません。 (あなたがリストに多くのコピーを検索する必要がある場合List.BinarySearchを使用した場合ToListとのより良い全体的なパフォーマンスを与えることができる -

インデックス(すなわちList)によって直接アクセスしてコレクションを使用すると、O(LG n)で性能を持つバイナリ検索をやらせるだろうあなたが探しているものの次の要素の位置を与える)。

// starting sample for BinarySearch approach 
// not handling case where item not in the list (x = 1). 
// List have to be sorted which is the case starting from sorted set: sortedSet.ToList() 
var list = new List<int>{ 1,3, 5, 7, 8,9}; 
var index = list.BinarySearch(8); 
Console.WriteLine(index < 0 ? list[~index - 1] : list[index-1]); 
+1

リストは、BinarySearchを実行する前に、msdnページの備考セクションから注文する必要があります: "リストは、比較インプリメンテーションに従ってソートされていなければなりません。 –

+0

@zohar OPはSortedSetで始まるので、そのようなコレクションのToListはソートされたリストを生成します。実際、他のデータから始めれば、ソートは最初のステップですが、それはオリジナルの線形検索よりもさらに悪くなります。 –

+0

私はあなたに完全に同意します。だから私はあなたの答えをアップアップしましたが、それは言及する価値があると思います - あなたの例では、順序付きセットで '.ToList()'を使用しませんでした... –

2

私は何かが欠けていない限り、LINQののLastOrDefault拡張メソッドを使用します。SortedSetので

var lastBefore = set.LastOrDefault(num => num < x); // x is your search number 
if (lastBefore < set.ElementAt(0)) 
{ 
    // Nothing in the set is smaller 
} 
else 
{ 
    // lastBefore is the last number smaller then search number 
} 
+0

これはコレクションがソートされ、通常は1がO(LG n)でのパフォーマンスを期待するが、それは私の知る限りでは、 'SortedSet'で最高の結果であっても、O(n)があることに注意してください。 –

関連する問題