Как мир перевернулся, или "В рот мне ноги, это же lower_bound!"
skiminog — 26.08.2010 Тут сегодня некто решил перевести на Хабре скучный пост с перечислением фич нового контейнера SortedSet из .NET 4.0. Увидел я его только к вечеру, поскольку весь день мотался по городу. Пролистнул, ничего особенного вроде не обнаружил (в конце концов, что я не знаю про их дерево и его внешний интерфейс?), хотел было уже закрывать, как тут глаз зацепился за название метода GetViewBetween.Видимо, когда я сразу после выхода .NET 4 просматривал спеки MSDN, я его как-то картинно и красиво
Ценная строчка в документации указала, что класс хранится в сборке System.dll. Лезем в папку с фреймворком, открываем сборку Рефлектором, прокручиваем до нужного класса и нужного метода. Далее - серия code snippet`ов: как я в поисках истинной реализации прыгал от метода к методу:
{
if (this.Comparer.Compare(lowerValue, upperValue) > 0)
{
throw new ArgumentException("lowerBound is greater than upperBound");
}
return new TreeSubSet<T>((SortedSet<T>) this, lowerValue, upperValue, true, true);
}
{
this.underlying = Underlying;
this.min = Min;
this.max = Max;
this.lBoundActive = lowerBoundActive;
this.uBoundActive = upperBoundActive;
base.root = this.underlying.FindRange(this.min, this.max, this.lBoundActive, this.uBoundActive);
base.count = 0;
base.version = -1;
this.VersionCheckImpl();
}
{
Node<T> root = this.root;
while (root != null)
{
if (lowerBoundActive && (this.comparer.Compare(from, root.Item) > 0))
{
root = root.Right;
}
else
{
if (upperBoundActive && (this.comparer.Compare(to, root.Item) < 0))
{
root = root.Left;
continue;
}
return root;
}
}
return null;
}
Все, приехали. Очевидный проход по дереву за O(H). Поскольку дерево у них там внутри сбалансированное (красно-черное, если конкретнее) - за O(log N).
Подводя итоги: неужели я таки дожил до этого священного дня, когда в стандартной библиотеке .NET появился lower_bound на set`ах? Учитывая, что BigInteger там тоже уже имеется, остается только пожелать для полного счастья next_permutation. Ну и какой-нибудь там nth_element на закуску.
Только вот ведь блин, нет этого .NET 4 нигде. Ни на одном контесте :(