C# Список.BinarySearch возвращает значение, если значение не найдено
Я запутался в методе BinarySearch List<T>
в случае, если элемент не существует.
у меня есть
List<long> theList = {1, 3, 5, ...}.
theList.BInarySearch(0)
возвращает 0, а theList.BInarySearch(3)
возвращает 1, как и ожидалось.
theList.BinarySearch(1)
возвращает -2, а не -1, Как я ожидал. В руководстве MSDN говорится:
"Возвращаемое значение: нулевой индекс элемента в отсортированном списке, если элемент найден; в противном случае отрицательное число, которое является побитовым дополнением индекса следующего элемент, который больше элемента или, если нет большего элемента, побитовое дополнение Count."
"побитовое дополнение"? Что я упускаю здесь и почему это theList.BinarySearch(1) != -1
?
4 ответов
во - первых- почему вы ожидаете -1? Если элемент является первым элементом, он не может вернуться -0
(для целых чисел), поэтому причина -2 будет возвращена для второго элемента.
Далее, вы можете легко получить правильный индекс с помощью ~-2
- побитовый оператор not.
Я предполагаю, что вы говорите о theList.BinarySearch(2)
, потому что и возвращаемое значение должно быть 0
.
на оператор побитового дополнения не производит такого же эффекта, как отрицание целого числа, которое, я думаю, является источником вашей путаницы. В любом случае, вам не нужно понимать, как работает оператор, чтобы точно ветвиться на результат поиска; абзац MSDN в вашем вопросе, и тот факт, что ~~a = a
, непосредственно подразумевает этот фрагмент:
int index = theList.BinarySearch(num);
if (index >= 0)
{
//exists
...
}
else
{
// doesn't exist
int indexOfBiggerNeighbour = ~index; //bitwise complement of the return value
if (indexOfBiggerNeighbour == theList.Count)
{
// bigger than all elements
...
}
else if (indexOfBiggerNeighbour == 0)
{
// smaller than all elements
...
}
else
{
// Between 2 elements
int indexOfSmallerNeighbour = indexOfBiggerNeighbour - 1;
...
}
}
причиной возврата этих отрицательных индексов является поддержка вставки элементов, которые не найдены в списке. В этом примере 2 будет вставлен при index = 2. В противном случае вам придется выполнить другой двоичный поиск, чтобы найти эту позицию.