Есть ли более низкая функция на SortedList<K ,V>
? Функция должна возвращать первый элемент, равный или превышающий указанный ключ. Есть ли другой класс, который поддерживает это?
Ребята - пожалуйста, снова прочитайте вопрос. Мне не нужна функция, которая возвращает ключ, если он присутствует. Мне интересен сценарий, когда нет точного соответствия клавиш.
Меня интересует время O (log n). Это означает, что у меня нет проблем с циклом foreach, но хотелось бы иметь эффективный способ сделать это.
Я сделал несколько тестов на этом.
Операторы Linq не оптимизируются ни компилятором, ни машиной времени исполнения, поэтому они проходят через все элементы коллекции и медленны O (n). На основании ответа Мехрдада Афшари, вот двоичный поиск, который работает в O (log n) в коллекции Keys:
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;
}