Этот ответ объединяет некоторые мои комментарии к вопросу и расширяет их.
Операция поддиапазона на красно-черных деревьях может быть выполнена за O (log n) наихудшего случая, где n - количество элементов в исходном дереве. Поскольку получающееся дерево будет совместно использовать некоторые узлы с исходным деревом, этот подход подходит только в том случае, если деревья являются неизменяемыми (или деревья являются изменяемыми, но исходное дерево больше не требуется).
Сначала обратите внимание, что операция поддиапазона может быть реализована двумя операциями разделения. Здесь операция расщепления принимает красно-черное дерево T и ключ x и создает два дерева L и R так, что L состоит из всех элементов T меньше x, а R элементов T больше x. Поэтому сейчас наша цель - реализовать операцию расщепления на красно-черных деревьях за O (log n) в худшем случае.
Как выполнить операцию расщепления на красно-черных деревьях за O (log n)? Что ж, оказалось, что был известный метод. (Я не знал этого, но я не эксперт по структурам данных.) Рассмотрим операцию соединения , которая берет два дерева L и R так, что каждое значение в L меньше, чем каждое значение в R, и создает дерево, состоящее из всех значения в L и R. Операция соединения может быть реализована в наихудшее время O (| r L −r R | +1), где r L и r Rявляются рангами L и R, соответственно (то есть число черных узлов на пути от корня до каждого листа). Операция разделения может быть реализована с использованием операции соединения O (log n) раз, и общее время наихудшего случая все еще равно O (log n) с учетом телескопической суммы.
Разделы 4.1 и 4.2 книги [Tar83] Тарьяна описывают, как реализовать операции объединения и разбиения на красно-черных деревьях в наихудшее время O (log n). Эти реализации уничтожают исходные деревья, но их легко преобразовать в неизменные функциональные реализации, копируя узлы вместо их изменения.
В качестве примечания, модули Set и Map Objective Caml предоставляют операцию разделения, а также другие стандартные операции с (неизменяемыми) сбалансированными деревьями двоичного поиска. Хотя они не используют красно-черные деревья (они используют сбалансированные двоичные деревья поиска с ограничением, что левая высота и правая высота различаются не более чем на 2), просмотр их реализаций также может быть полезен. Вот реализация модуля Set .
Ссылки
[Tar83] Роберт Эндре Тарьян. Структуры данных и сетевые алгоритмы . Том 44 серии региональных конференций CBMS-NSF по прикладной математике , SIAM, 1983.