Поддиапазон красного и черного дерева

14

Пытаясь исправить ошибку в библиотеке, я безуспешно искал документы по поиску поддиапазонов на красных и черных деревьях. Я рассматриваю решение с использованием застежек-молний и что-то похожее на обычную операцию добавления, используемую в алгоритмах удаления для неизменяемых структур данных, но мне все еще интересно, есть ли лучший подход, который я не смог найти, или даже какая-то минимальная граница сложности на такой операции?

Просто чтобы прояснить, я говорю об алгоритме, который, учитывая красно-черное дерево и две границы, создаст новое красно-черное дерево со всеми элементами первого дерева, которые принадлежат этим границам.

Конечно, верхней границей сложности будет сложность обхода одного дерева и построения другого путем добавления элементов.

Даниэль С. Собрал
источник
3
@Radu: в функции редактирования комментариев есть ошибка. Если вы используете латекс в комментарии и редактируете комментарий, вы видите странное поведение, такое как дублирование и т. Д.
Aryabhata
@Radu Я добавил пару абзацев, чтобы лучше объяснить мой вопрос.
Даниэль С. Собрал,
Являются ли деревья неизменными?
Цуёси Ито
Кроме того, вы имели в виду верхнюю границу вместо нижней границы в последнем абзаце?
Цуёси Ито
2
Кажется, что операция расщепления на красно-черных деревьях может быть реализована в наихудшее время O (log n), где n - количество элементов в дереве. Это утверждение можно найти во введении статьи «Чисто функционирующие отсортированные списки с возможностью наименьшего времени для наихудшего случая», составленной Гертом Стелтингом Бродалом, Кристосом Макрисом и Костасом Цихласом, ESA 2006: cs.au.dk/~gerth/pub/esa06trees.html , Как я уже упоминал в моем предыдущем комментарии, это позволяет в наихудшем случае реализовать операцию поддиапазона за O (log n).
Цуёси Ито

Ответы:

10

Этот ответ объединяет некоторые мои комментарии к вопросу и расширяет их.

Операция поддиапазона на красно-черных деревьях может быть выполнена за 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.

Цуёси Ито
источник
@Radu GRIGore: Да, если я что-то упустил.
Цуёси Ито
@Radu GRIGore: А может и нет, теперь я не уверен. Эта реализация операции разделения выделяет O (log n) новых узлов для выходного дерева, но я думаю, что вся операция, вероятно, может быть реализована хвостово-рекурсивным способом, требующим только O (1) рабочего пространства. Если это правильно, ответ на ваш вопрос будет зависеть от того, что вы подразумеваете под «лишним пробелом».
Цуёси Ито
@Radu GRIGore: В этом случае я думаю, что дополнительное пространство - это O (1), хотя я не проверил его тщательно.
Цуёси Ито
@Radu GRIGore: Я не могу понять причину, почему кто-то заботится об объеме рабочего пространства, не заботясь о количестве места, необходимого для хранения самого результата. В теории сложности проблема обычно указывает, каков результат, и поэтому пространство, необходимое для хранения результата, не зависит от алгоритмов. Однако в текущей задаче существует много способов реализации требуемой операции, и некоторым реализациям требуется больше места для хранения результата, чем другим. Если вы игнорируете разницу этого количества места, я не понимаю, почему вас волнует, сколько рабочего пространства нам нужно.
Цуёси Ито
Проблема неизменных деревьев отличается от проблемы изменчивых деревьев. Я понимаю разницу, поэтому мне нечего было об этом спросить. Теперь, если рассмотреть одну из двух проблем, необходимо обсудить два аспекта: память и время. Вы не сказали, сколько памяти используете, и мне не было очевидно, каков ответ, поэтому я спросил. Я не понимаю, как это заставило вас думать, что я игнорирую разницу между этими двумя проблемами.
Раду GRIGore
8

Решение не состоит в том, чтобы использовать красно-черные деревья. В деревьях Splay и AVL код для разделения и объединения очень прост. Я отсылаю вас к следующим URL с java-кодом для splay-деревьев и AVL-деревьев, которые поддерживают это. Перейдите по следующему URL-адресу и проверьте Set.java (avl-деревья) и SplayTree.java (splay-деревья).

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

--- Дэнни Слеатор

Дэнни Слеатор
источник
5
Добро пожаловать на сайт, Дэнни!
Суреш Венкат
2
Как это поможет изменить реализацию Scala Red Black для поддержки поддиапазонов менее чем за O(n)? Я не спрашивал, какие деревья имеют простые реализации поддиапазонов, потому что это не проблема, которую я имею. Этот ответ, хотя и предназначен, но не по теме и бесполезен для рассматриваемой проблемы.
Даниэль С. Собрал
6

(Это должен быть комментарий, но я слишком нов, чтобы оставить комментарий.)

Я просто хочу отметить, что вас также может заинтересовать операция «удаление», которая возвращает поддиапазон как новое дерево и дерево ввода без поддиапазона как другой. Вы должны иметь контроль над базовым представлением дерева, так как известный метод опирается на ссылки уровня. Вырезание выполняется по времени, логарифмическому размеру меньшего дерева, хотя и в амортизированном смысле («амортизированный» - это iirc, потому что у меня больше нет доступа к бумаге).

К. Хоффман, К. Мелхорн, П. Розенштиль и Р. Э. Тарьян, Сортировка последовательностей Джордана за линейное время с использованием деревьев поиска по уровням, Информация и управление, 68 (1986), 170–-184

PS Вышеприведенная цитата взята из рецензии Зейделя. Трепы также поддерживают удаление.

Маверик Ву
источник
Этот метод предполагает, что у человека уже есть указатели (или «пальцы») на две границы.
Jbapple
3

Nm[a,b]

  1. O(lgn)aa
  2. O(m)
  3. O(m)

O(m+lgn)O(n+mlgm)

o(m)Ω(lgm)klgm

Я не проработал детали, поэтому я не уверен, как дополнительная бухгалтерия влияет на время работы.

O(1)Ω(lgm)

Раду ГРИГОРЕ
источник
Думая об этом, я думаю, что мог бы получить приблизительный подсчет O(logn), с помощью которого я мог бы избежать временного массива.
Даниэль С. Собрал
Вы можете получить счет в O (LG N), сохраняя размеры поддеревьев в их корнях.
Раду ГРИГОРЕ
... но хранение размеров в узлах противоречит требованию не использовать вспомогательное пространство, поэтому мои наблюдения не решают вашу проблему с памятью.
Раду GRIGore
1
Двоичные деревья могут быть идеально перебалансированы, используя только дополнительное пространство CONSTANT (в дополнение к самому дереву): eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε
O(m+lgn)O(1)
Раду GRIGore