私はint型の厳密に型指定されたSortedSetを持っています。 xより小さい集合の中で最大の数を見つけたい。不等号でソートセットを効率的に検索するにはどうすればよいですか?
これは間違ったデータ構造ですが、直感的な考えはソートされたコレクションがあることです。確かに、私はこのタイプの検索を.NETフレームワーク経由で行うことができるはずです。
私はint型の厳密に型指定されたSortedSetを持っています。 xより小さい集合の中で最大の数を見つけたい。不等号でソートセットを効率的に検索するにはどうすればよいですか?
これは間違ったデータ構造ですが、直感的な考えはソートされたコレクションがあることです。確かに、私はこのタイプの検索を.NETフレームワーク経由で行うことができるはずです。
をあなたが列挙(線形検索 - O(N))に依存する必要がインデックスによって直接アクセスすることはできません。おそらくより良い方法はSortedSet.GetViewBetweenとLast
ですが、最後の要素を取得できるようには見えません。 (あなたがリストに多くのコピーを検索する必要がある場合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]);
私は何かが欠けていない限り、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
}
これはコレクションがソートされ、通常は1がO(LG n)でのパフォーマンスを期待するが、それは私の知る限りでは、 'SortedSet'で最高の結果であっても、O(n)があることに注意してください。 –
リストは、BinarySearchを実行する前に、msdnページの備考セクションから注文する必要があります: "リストは、比較インプリメンテーションに従ってソートされていなければなりません。 –
@zohar OPはSortedSetで始まるので、そのようなコレクションのToListはソートされたリストを生成します。実際、他のデータから始めれば、ソートは最初のステップですが、それはオリジナルの線形検索よりもさらに悪くなります。 –
私はあなたに完全に同意します。だから私はあなたの答えをアップアップしましたが、それは言及する価値があると思います - あなたの例では、順序付きセットで '.ToList()'を使用しませんでした... –