Підрядок червоного і чорного дерева


14

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

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

Звичайно, верхньою межею складності була б складність переходу одного дерева та побудови іншого шляхом додавання елементів.


3
@Radu: У функції редагування коментарів є помилка. Якщо ви використовуєте латекс у коментарі та редагуєте коментар, ви бачите дивну поведінку, як дублювання тощо.
Aryabhata

@Radu Я додав пару абзаців, щоб краще пояснити своє запитання.
Даніель К. Собрал

Чи непорушні дерева?
Tsuyoshi Ito

Також ви мали на увазі верхню межу замість нижньої межі в останньому абзаці?
Цуйосі Іто

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: Я не можу побачити причину, чому хтось піклується про кількість робочої області, не піклуючись про кількість місця, необхідного для зберігання самого результату. У теорії складності проблема зазвичай визначає, що є результатом, і тому простір, необхідний для зберігання результату, не залежить від алгоритмів. Однак у поточній проблемі існує багато способів реалізації необхідної операції, а для деяких реалізацій потрібно більше місця для зберігання результату, ніж для інших. Якщо ви ігноруєте різницю цієї кількості простору, я не бачу, чому ви дбаєте, скільки робочого простору нам потрібно.
Tsuyoshi Ito

Проблема непорушних дерев відрізняється від проблеми для дерев, що змінюються. Я розумію різницю, тому мені не було про що питати. Тепер, збільшуючи масштаб однієї з двох проблем, є два аспекти для обговорення --- пам'ять та час. Ви не сказали, скільки пам'яті використовуєте, і мені не здавалося очевидним, що відповідь, тому я запитав. Я не бачу, як це змусило вас думати, що я ігнорую різницю між двома проблемами.
Radu GRIGо

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), зберігаючи розміри підкреслень у їх коренях.
Раду ГРИГо

... але зберігання розмірів у вузлах суперечить вимозі не використовувати допоміжний простір, тому моє спостереження не стосується вашої турботи щодо пам'яті.
Radu GRIGбільше

1
Бінарні дерева можна ідеально збалансувати, використовуючи лише КОНСТАНТ додатковий простір (окрім самого дерева): eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε

O(m+lgn)O(1)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.