Есть ли функция нижней границы для SortedList<K ,V>
? Функция должна вернуть первый элемент, равный или превышающий указанный ключ. Есть ли какой-то другой класс, который поддерживает это?
Ребята, пожалуйста, прочитайте вопрос еще раз. Мне не нужна функция, которая возвращает ключ, если он присутствует. Меня интересует сценарий, когда нет точного соответствия ключей.
Меня интересует время O(log n). Это означает, что у меня нет проблем с циклом foreach, но я хотел бы иметь эффективный способ сделать это.
Я сделал несколько тестов по этому поводу.
Операторы Linq не оптимизируются ни компилятором, ни машиной времени выполнения, поэтому они проходят через все элементы коллекции и работают медленно O(n). Основываясь на ответе Мехрдада Афшари, вот двоичный поиск, который работает в O (log n) в коллекции ключей:
public static int FindFirstIndexGreaterThanOrEqualTo<T>(
this IList<T> sortedCollection, T key
) where T : IComparable<T> {
int begin = 0;
int end = sortedCollection.Count;
while (end > begin) {
int index = (begin + end) / 2;
T el = sortedCollection[index];
if (el.CompareTo(key) >= 0)
end = index;
else
begin = index + 1;
}
return end;
}