Пытаясь исправить ошибку в библиотеке, я безуспешно искал документы по поиску поддиапазонов на красных и черных деревьях. Я рассматриваю решение с использованием застежек-молний и что-то похожее на обычную операцию добавления, используемую в алгоритмах удаления для неизменяемых структур данных, но мне все еще интересно, есть ли лучший подход, который я не смог найти, или даже какая-то минимальная граница сложности на такой операции?
Просто чтобы прояснить, я говорю об алгоритме, который, учитывая красно-черное дерево и две границы, создаст новое красно-черное дерево со всеми элементами первого дерева, которые принадлежат этим границам.
Конечно, верхней границей сложности будет сложность обхода одного дерева и построения другого путем добавления элементов.
источник
Ответы:
Этот ответ объединяет некоторые мои комментарии к вопросу и расширяет их.
Операция поддиапазона на красно-черных деревьях может быть выполнена за 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.
источник
Решение не состоит в том, чтобы использовать красно-черные деревья. В деревьях Splay и AVL код для разделения и объединения очень прост. Я отсылаю вас к следующим URL с java-кодом для splay-деревьев и AVL-деревьев, которые поддерживают это. Перейдите по следующему URL-адресу и проверьте Set.java (avl-деревья) и SplayTree.java (splay-деревья).
ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/
--- Дэнни Слеатор
источник
O(n)
? Я не спрашивал, какие деревья имеют простые реализации поддиапазонов, потому что это не проблема, которую я имею. Этот ответ, хотя и предназначен, но не по теме и бесполезен для рассматриваемой проблемы.(Это должен быть комментарий, но я слишком нов, чтобы оставить комментарий.)
Я просто хочу отметить, что вас также может заинтересовать операция «удаление», которая возвращает поддиапазон как новое дерево и дерево ввода без поддиапазона как другой. Вы должны иметь контроль над базовым представлением дерева, так как известный метод опирается на ссылки уровня. Вырезание выполняется по времени, логарифмическому размеру меньшего дерева, хотя и в амортизированном смысле («амортизированный» - это iirc, потому что у меня больше нет доступа к бумаге).
К. Хоффман, К. Мелхорн, П. Розенштиль и Р. Э. Тарьян, Сортировка последовательностей Джордана за линейное время с использованием деревьев поиска по уровням, Информация и управление, 68 (1986), 170–-184
PS Вышеприведенная цитата взята из рецензии Зейделя. Трепы также поддерживают удаление.
источник
Я не проработал детали, поэтому я не уверен, как дополнительная бухгалтерия влияет на время работы.
источник
O(logn)
, с помощью которого я мог бы избежать временного массива.