Реализация красно-черного дерева в C#

Я ищу реализацию Красно-Черное Дерево в C#, со следующими характеристиками:

  • Поиск, вставка и удаление в O(log n).
  • тип членов должен быть общим.
  • поддержка в Компаратор (T), для сортировки T по различным полям в нем.
  • поиск в дереве должен быть с определенным полем, поэтому он не будет принимать T, но он примет сортировку типа поля он.
  • поиск не должен быть только точным значением. Должен поддерживать поиск нижнего/верхнего.

спасибо.

3 ответов


вы в основном только что описали SortedDictionary<T, U>, за исключением следующего-самого низкого/следующего-самого высокого двоичного поиска, который вы могли бы реализовать самостоятельно без особых трудностей.

есть ли конкретные причины, которые SortedDictionary недостаточно для вас?


Rip TreeSet из библиотек коллекции C5.


Это именно OrderedDictionary в PowerCollections. Он в значительной степени идентичен SortedDictionary (красное черное дерево с дженериками) с добавлением возможности установить начальный ключ/конечный ключ и сканировать все значения в этом диапазоне.

SortedDicionary позволяет только предоставляет функцию GetEnumerator (), которая начинается в начале коллекции и разрешает только вызов MoveNext (), поэтому даже если вы используете LINQ, ничего волшебного не происходит: он запускается в начале и запускается ваше выражение на каждом отдельном узле по порядку, пока оно не найдет те, которые соответствуют вашему выражению LINQ.

OrderedDictionary имеет функцию, которая получает перечислитель В или перед определенным ключом и выполняет поиск в O(log n).

слово предостережения: перечислитель в PowerCollections OrderedDictionary реализован с использованием "yield", а производительность использования памяти и перечисления по крайней мере O(n^2)... вы можете изменить реализацию самостоятельно, чтобы сделать это реализуйте традиционный перечислитель, и обе эти проблемы исчезнут. Я отправлю этот патч в Codeplex, если смогу найти время.