C++は、このための標準ライブラリ関数は、ここではC#実装だlower_bound()
.
を呼びかけています。あなたが大規模なコレクションを検索する場合に便利です:戻りません-1それが見つからない要素のために、私たちはそうのようにそれをラップすることができますことを修正するために
public static int LowerBound<T>(IList<T> values, T target, int first, int last)
where T : IComparable<T>
{
int left = first;
int right = last;
while (left < right)
{
int mid = left + (right - left)/2;
var middle = values[mid];
if (middle.CompareTo(target) < 0)
left = mid + 1;
else
right = mid;
}
return left;
}
:
public static int LowerBoundOrMinusOne<T>(IList<T> values, T target, int first, int last)
where T : IComparable<T>
{
int result = LowerBound(values, target, first, last);
if (result >= last || result < first || values[result].CompareTo(target) != 0)
return -1;
return result;
}
ここ
は、あなたがそれを使用する方法です。もちろん
List<int> firstList = new List<int> { 1, 2, 2, 3, 5 };
List<int> secondList = new List<int> { 2, 3, 1 };
List<int> result = secondList
.Select(value => LowerBoundOrMinusOne(firstList, value, 0, firstList.Count))
.ToList();
Console.WriteLine(string.Join(", ", result));
それはO(LOG2(N))ではなくO(N)の複雑さを持っているので、これは主に大規模なリストへの利益のです。
BinarySearchは最初の一致を保証するものではなく、ソートされたコレクションの検索と挿入に使用されます。 –
はい、私はそれを得ました。ありがとうございました – ryan