Реализация красно-черного дерева в C#
Я ищу реализацию Красно-Черное Дерево в C#, со следующими характеристиками:
- Поиск, вставка и удаление в O(log n).
- тип членов должен быть общим.
- поддержка в Компаратор (T), для сортировки
T
по различным полям в нем. - поиск в дереве должен быть с определенным полем, поэтому он не будет принимать
T
, но он примет сортировку типа поля он. - поиск не должен быть только точным значением. Должен поддерживать поиск нижнего/верхнего.
спасибо.
3 ответов
вы в основном только что описали SortedDictionary<T, U>
, за исключением следующего-самого низкого/следующего-самого высокого двоичного поиска, который вы могли бы реализовать самостоятельно без особых трудностей.
есть ли конкретные причины, которые SortedDictionary
недостаточно для вас?
Это именно OrderedDictionary в PowerCollections. Он в значительной степени идентичен SortedDictionary (красное черное дерево с дженериками) с добавлением возможности установить начальный ключ/конечный ключ и сканировать все значения в этом диапазоне.
SortedDicionary позволяет только предоставляет функцию GetEnumerator (), которая начинается в начале коллекции и разрешает только вызов MoveNext (), поэтому даже если вы используете LINQ, ничего волшебного не происходит: он запускается в начале и запускается ваше выражение на каждом отдельном узле по порядку, пока оно не найдет те, которые соответствуют вашему выражению LINQ.
OrderedDictionary имеет функцию, которая получает перечислитель В или перед определенным ключом и выполняет поиск в O(log n).
слово предостережения: перечислитель в PowerCollections OrderedDictionary реализован с использованием "yield", а производительность использования памяти и перечисления по крайней мере O(n^2)... вы можете изменить реализацию самостоятельно, чтобы сделать это реализуйте традиционный перечислитель, и обе эти проблемы исчезнут. Я отправлю этот патч в Codeplex, если смогу найти время.