Об’єднання двох бінарних дерев пошуку


17

Я шукаю алгоритм для об'єднання двох бінарних дерев пошуку довільного розміру та діапазону. Очевидний спосіб , яким я б йти про реалізацію цього було б знайти цілі поддерева чиїх діапазону може поміститися в довільний зовнішній вузол в іншому дереві. Однак найгірший час роботи для цього типу алгоритму, здається, визначається порядком того, O(n+m)де nі mрозмір кожного дерева відповідно.

Однак мені сказали, що це можна зробити O(h)там, де hбільша висота дерева. І я повністю розгублений, як це можливо. Я спробував спершу експериментувати з обертанням одного дерева, але повернути дерево в хребет - це вже O (h).


Я не знаю erick У мене теж питання.

Справедливості, це було питання, задане в домашніх завданнях з алгоритмів. Виявляється, O (h) занадто суворий для виконання, оскільки питання забуло дати більше необхідної інформації: щоб усі ключі від одного дерева були меншими за всі клавіші у правильному дереві.
efritz

Чи щось мені не вистачає, чи не було б легко виконати об'єднання двійкових дерев O(log n)за допомогою простої функції переміщення вузла?
AT

@AT Так, але ми не знали, що ключі від одного BST взаємно виключаються від іншого.
efritz

1
Це червоно-чорне дерево, а не BST. Червоний чорний (а також AVL дерева та купи) - це особливі види дерев, які зберігають властивість, обмежену висотою. БНТ ванілі може бути одним хребтом. Спробуйте вставити рядки чисел, що не зменшуються або збільшуються, і ви побачите, що висота цих дерев є насправді n. Тільки повні або цілі двійкові дерева мають логарифмічну висоту до їх загальної кількості вузлів.
efritz

Відповіді:


24

В ArXiv: 1002.4248 , Джон Іаконо та Озгюр Оскан описують відносно простий алгоритм об'єднання двох бінарних дерев пошуку за амортизованим часом ; аналіз - це важка частина. [ Оновлення: Як правильно зауважує Джо у своїй відповіді, цей алгоритм пояснюється Брауном та Тарханом.] Вони також описують більш складну структуру даних словника, засновану на упереджених пропускних списках, яка підтримує злиття в O ( log n ) амортизований час.O(log2n) O(logn)

З іншого боку, неможлива межа гіршого випадку . Розглянемо два двійкових дерева пошуку з n вузлами, одне зберігає парні цілі числа між 2 і 2 n , а друге зберігає непарні цілі числа від 1 до 2 n - 1 . Об'єднання двох дерев створює нове дерево бінарного пошуку, яке зберігає всі цілі числа між 1 і 2 n . У будь-якому такому дереві постійна частка вузлів має інший паритет, ніж їхні батьки. (Доказ. Батько непарного листя повинен бути парним.) Отже, злиття парних і непарних дерев вимагає змінO(logn)n22n12n112nПокажчики Ω ( n ) .Ω(n)


Одне зауваження: якщо я прочитав опис у цій статті правильно, ці дерева не підтримують вставлення та видалення. злиття просто слід процедурі об'єднання пошуку пальця дерев (описану у відповіді Джо). Обмежений набір операцій дозволяє зробити кращий аналіз, ніж O ( n lg mO(lg2n)один. O(nlgmn)
jbapple

1
Поліпшений аналіз пояснюється амортизацією, а не обмеженням дозволених операцій. Вставки та вилучення можуть бути підтримані розщепленнями та злиттями (фактично "приєднуючись") в той же амортизований часовий проміжок. O(logn)
Jeffε

Лише з цікавості, чи впливає час якщо дерева зберігаються в масивах замість пов'язаних списків (на що я припускаю, що ви мали на увазі, сказавши "зміна ... покажчиків ")? Ω(n)
mtahmed

За замовчуванням "двійкові дерева пошуку" - це структури на основі вказівника (не "пов'язані списки"); кожен вузол вказує на своїх двох дітей і, можливо, на свого батька. Але нижня межа не залежить від точного подання. Є способи об'єднання двохn-вузлів бінарних дерев пошуку, тому будь-який алгоритм на основі порівняння потребує щонайменшеlog2 ( 2n(2nn)nпорівняннящоб вибрати правильний. log2(2nn)2nO(logn)
Jeffε

1
@ Jɛ ff E: Я погоджуюсь, що розбиття та приєднання підтримуються, але я не думаю, що створювати чи знищувати дерева. Так, наприклад, якщо я хочу видалити "x" з алфавіту, я не отримаю просто "a..wyz", а й "x". Розмір Всесвіту (який , див. Розділ 2.1) не змінюється. Також в вступі до розділу 1 зазначається, що множини повинні розділяти Всесвіт, що я трактую (можливо, неправильно), щоб означати, що кожен елемент у Всесвіті знаходиться в якомусь дереві. Отже, як я це прочитав, ця конструкція не працює над безмежними всесвітами. Ось як я повинен писати свій коментар вище. n
jbapple

9

Ця посилання може бути корисною: Браун та Тарджан, алгоритм швидкого злиття , в якому автори показують, як об’єднати врівноважені бінарні (AVL) дерева в який є оптимальним (для порівняння на основі алгоритмів). mіn- довжини відсортованих списків, представлені двійковими деревами пошуку, і передбачається, щоmn.O(nlogmn)mnmn

Ви також можете побачити обговорення різних методик злиття впорядкованих наборів у розділі 11.5 цього документу на пальцях дерев пошуку


2
Обидва обмежена часом і відповідна нижня межа припускають, щоmn. O(nlogmn)mn
Jeffε

Я думав, що це має на увазі обмежений час, але я редагував питання, щоб зробити це явним.
Джо

0

1
Їх структура даних підтримує приєднання в O (1) амортизований час, а не злиття. Усі елементи в одному дереві повинні бути меншими за всі елементи в іншому.
Jeffε

Ааа, правда. Довелося перечитати статтю: "Приєднуйся ( , T j ), з'єднує два дерева в одне дерево. Дерева T i іTiTjTi впорядковані в тому сенсі, що всі елементи T j або менші, або більші, ніж найменші або Найбільший елемент T i . Припустимо, не втрачаючи загальності, що w ( T i ) = w ( T j ) . У цьому випадку дерево T j приєднується до дерева T i , а результатом цієї операції є деревоTjTjTiw(Ti)=w(Tj)TjTi приєднаний до вузла на корінці Т я «.TiTjTi
AT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.