Объединение двух бинарных поисковых деревьев


17

Я ищу алгоритм для объединения двух двоичных деревьев поиска произвольного размера и диапазона. Очевидный способ , которым я бы идти о реализации этого было бы найти целые поддерева чьих диапазона может поместиться в произвольный внешний узел в другом дереве. Однако наихудшее время выполнения для этого типа алгоритма, по-видимому, имеет порядок O(n+m)где nи mразмер каждого дерева соответственно.

Тем не менее, мне сказали, что это можно сделать там O(h), где hвысота дерева больше, чем высота. И я полностью потерян, как это возможно. Я попытался сначала поэкспериментировать с поворотом одного из деревьев, но поворот дерева в позвоночник - это уже O (h).


Я не знаю, Эрик, у меня тоже такой же вопрос.

Чтобы быть справедливым, это был вопрос, заданный в домашней задаче Алгоритмы. Оказывается, что O (h) является слишком строгим во время выполнения, поскольку вопрос забыл дать более необходимую информацию: все ключи одного дерева были меньше всех ключей в правом дереве.
Efritz

Я что-то упустил, не будет ли легко объединить двоичные деревья O(log n)с помощью простой функции перемещения узла?
AT

@AT Да, но мы не знали, что ключи от одного BST были взаимоисключающими от другого.
Efritz

1
Это красно-черное дерево, а не BST. Красный черный (а также деревья и кучи AVL) - это особые виды деревьев, которые сохраняют свойство высоты. Ванильные BST могут быть одним позвоночником. Попробуйте вставить неубывающий или не увеличивающийся ряд чисел в BST, и вы увидите, что высота этих деревьев на самом деле n. Только полные или полные двоичные деревья имеют высоту, логарифмическую по отношению к их общему количеству узлов.
efritz

Ответы:


24

В ArXiv: 1002.4248 Джон Иаконо и Озгюр Озкан описывают относительно простой алгоритм объединения двух бинарных деревьев поиска за время амортизации ; анализ является сложной частью. [ Обновление: как правильно заметил Джо в своем ответе, этот алгоритм принадлежит Брауну и Тарьяну.] Они также описывают более сложную структуру данных словаря, основанную на смещенных списках пропусков, которая поддерживает слияния в O (О(журнал2N) амортизированноговремени.О(журналN)

С другой стороны, оценка в худшем случае невозможна. Рассмотрим два двоичных дерева поиска с n узлами, одно из которых хранит четные целые числа от 2 до 2 n , а другое - нечетные целые числа от 1 до 2 n - 1 . Слияние двух деревьев создает новое двоичное дерево поиска, хранящее все целые числа между Ω ( nО(журналN)N22n12n1 до 2 n . В любом таком дереве постоянная доля узлов имеет разную четность, чем их родители. (Доказательство: родитель нечетного листа должен быть четным.) Таким образом, объединение четного и нечетного деревьев требует изменения12n указатели.Ω(n)


Одно замечание: если я правильно прочитал описание в этой статье, эти деревья не поддерживают вставку и удаление. слияние просто следует процедуре объединения поиска пальца дерев (описанную в ответе Джо). Ограниченный набор операций позволяет лучше анализировать, чем O ( n lg mО(Л.Г.2N)один. О(NЛ.Г.мN)
Jbapple

1
Улучшенный анализ обусловлен амортизацией, а не ограничением разрешенных операций. Вставки и удаления могут поддерживаться с помощью разбиений и слияний (фактически «объединений») в том же амортизированном временном интервале. О(LограммN)
Джефф

Просто из любопытства, влияет ли время если деревья хранятся в массивах, а не в связанных списках (я полагаю, это то, что вы имели в виду, говоря «изменение ... указателей »)? Ω(N)
mtahmed

По умолчанию «деревья двоичного поиска» являются структурами на основе указателей (не «связанных списков»); каждый узел указывает на своих двух детей и, возможно, своего родителя. Но нижняя граница не зависит от точного представления. Есть способы слияния двухn-узловых двоичных деревьев поиска, поэтому для любого алгоритма, основанного на сравнении, требуется как минимумlog2 ((2NN)Nсравнений для выбора правильного. журнал2(2NN)2N-О(журналN)
Джефф

1
@ Jɛ ff E: Я согласен, что расщепления и объединения поддерживаются, но я не думаю, что создание или уничтожение деревьев это. Так, например, если я хочу удалить «x» из алфавита, я получу не только «a..wyz», но и «x». Размер юниверса (который равен , см. Раздел 2.1) не меняется. Кроме того, во вступлении к разделу 1 отмечается, что наборы должны разделять юниверс, что я интерпретирую (возможно, неправильно), чтобы обозначить, что каждый элемент в юниверсе находится в некотором дереве. Итак, как я понял, эта конструкция не работает над неограниченными вселенными. Вот как я должен написать свой комментарий выше. N
Jbapple

9

Вы можете найти эту ссылку полезной: Браун и Тарьян, Алгоритм быстрого слияния, в котором авторы показывают, как объединить сбалансированные двоичные (AVL) деревья в который является оптимальным (для алгоритмов сравнения). mиn- длины отсортированных списков, представленных деревьями двоичного поиска, и предполагается, чтоmО(NжурналмN)мN .мN

Вы также можете увидеть обсуждение различных методов объединения упорядоченных наборов в разделе 11.5 этой статьи о деревьях поиска по пальцам.


2
Оба временная граница и соответствующая нижняя граница предполагают, чтоmn. О(NжурналмN)мN
Джефф

Я думал, что это подразумевается временными рамками, но я отредактировал вопрос, чтобы сделать его явным.
Джо

0

1
Их структура данных поддерживает объединение за O (1) амортизированное время, а не слияние. Все элементы в одном дереве должны быть меньше, чем все элементы в другом.
Джеффс

Ах, правда. Пришлось перечитать статью: «Соединение ( , T j ) объединяет два дерева в одно дерево. Деревья T i и T j упорядочены в том смысле, что все элементы T j либо меньше, либо больше, чем наименьшее или наибольший элемент T i . Предположим без ограничения общности, что w ( T i ) = w ( T j ) . В этом случае дерево T j присоединяется к дереву T i , и результатом этой операции является деревоTяTJTяTJTJTявес(Tя)знак равновес(TJ)TJTя прикрепляется к узлу на корешке T i . "TяTJTя
AT
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.