Різниця між червоно-чорними деревами та деревами AVL


82

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

Відповіді:


100

Дерева AVL підтримують більш жорсткий баланс, ніж червоно-чорні дерева. Шлях від кореня до найглибшого листя у дереві AVL становить максимум ~ 1,44 фунта (n + 2), тоді як у червоних чорних дерев це максимум ~ 2 lg (n + 1).

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


3
Прохання краще зрозуміти концепцію. І дерево avl, і дерево червоного чорного мають щонайменше два обертання за вставку. Отже, як можна сказати, що дерева AVL повільні? Спасибі заздалегідь!
user2626445

@larsmans! Чи різниця в продуктивності настільки велика, що створюється нова концепція?
Шашват,

@Shashwat Я не розумію, що ти маєш на увазі. Нова концепція?
Фред Фу,

2
@larsmans! Я маю на увазі, чому у нас є така відома концепція Червоно-Чорного дерева, коли у нас є дерево AVL, хоча є лише незначні відмінності в їх вставці, видаленні та оновлення. Чи є щось головне, що відрізняє червоно-чорне дерево від дерева AVL?
Шашват,

Алгоритми їх обслуговування різні, тому вони отримують різні назви. AFAIK вони підтримують однаковий набір операцій з однаковими великими часовими рамками.
Fred Foo

54

Для невеликих даних :

вставити : Дерево RB та дерево avl має постійну кількість максимального обертання, але дерево RB буде швидшим, оскільки в середньому дерево RB використовує менше обертання.

пошук : Дерево AVL швидше, оскільки дерево AVL має меншу глибину.

delete : Дерево RB має постійну кількість максимального обертання, але дерево AVL може мати O (log N) разів обертання як найгірший. і в середньому дерево RB також має менше число обертань, тому дерево RB швидше.

для великих даних :

вставити : Дерево AVL швидше. тому що перед вставкою потрібно шукати певний вузол. оскільки у вас більше даних, різниця в часі при пошуку певного вузла зростає пропорційно O (log N). але дерево AVL та дерево RB все ще потребують лише постійної кількості обертань у гіршому випадку. Таким чином горловина пляшки стане часом, коли ви будете шукати цей конкретний вузол.

пошук : Дерево AVL швидше. (те саме, що у випадку з малими даними)

видалити : дерево AVL в середньому швидше, але в гіршому випадку дерево RB швидше. тому що вам також потрібно шукати дуже глибокий вузол для обміну перед видаленням (подібно до причини вставки). в середньому обидва дерева мають постійну кількість обертань. але дерево RB має постійну верхню межу для обертання.


2
це, мабуть, означає, що дерева AVL майже завжди були б кращими з великими обсягами даних. Чому це використовується в Java та C ++ STL? stackoverflow.com/questions/3901182 / ...
emschorsch

Вам потрібно мати певний обсяг даних (наприклад, 1 мільйон), щоб зробити дерево AVL кращим, ніж дерево RB у випадку вставки / видалення, і це насправді залежить від того, як ви його реалізуєте. Розумна реалізація AVL може перевершити std :: map навіть із меншим обсягом даних. Наприклад, вам не потрібно перевіряти, чи є дитина та онук нульовими, якщо батьків-> зріст більше 5.
DU Jiaen

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

1
Як скорочений підсумок "малих даних", я взяв з цього: AVL виконує більше роботи заздалегідь і є жорсткішим (записи / обертання), щоб пізніше збільшити продуктивність (читає). Читання стає важливішим у міру зростання даних, оскільки ви читаєте більше, ніж пишете (обертання буде незначним порівняно з пошуком). Отже, AVL виграє за всіма підрахунками, оскільки він оптимізований для читання.
Бен Баттерворт

8

Цитата з цього: Різниця між AVL та червоно-чорними деревами

RB-дерева, як і дерева AVL, є самобалансованими. Обидва вони забезпечують ефективність пошуку та вставки O (log n). Різниця полягає в тому, що RB-Дерева гарантують обертання O (1) за операцію вставки. Це те, що насправді коштує продуктивності в реальних реалізаціях. Спрощено, RB-дерева отримують цю перевагу, оскільки концептуально становлять 2-3 дерева, не переносячи накладні витрати на динамічні структури вузлів. Фізично RB-дерева реалізовані у вигляді двійкових дерев, червоні / чорні прапорці імітують 2-3 поведінки.

за визначенням, кожен AVL, отже, є підмножинами червоно-чорного. Потрібно мати можливість забарвити будь-яке дерево AVL без реструктуризації чи обертання, щоб перетворити його на червоно-чорне дерево.


3

Дерева AVL часто порівнюють з червоно-чорними деревами, оскільки обидва підтримують однаковий набір операцій і вимагають O(log n)часу на основні операції. Для інтенсивних пошукових програм дерева AVL швидші, ніж червоно-чорні дерева, оскільки вони є більш жорстко збалансованими. Подібно до червоно-чорних дерев, дерева AVL збалансовані по висоті. Обидва вони, як правило, не збалансовані за вагою та не є збалансованими для будь-яких μ ≤ ½; тобто вузли братів і сестер можуть мати надзвичайно різну кількість нащадків.

Зі статті Вікіпедії про дерева AVL


3

Максимальна висота дерев - першорядне значення для збереження рівноваги. Це майже дорівнює 1.44 * log(n)для AVL, але для дерева RB це так 2 * log(n). Тож ми можемо дійти висновку, що краще використовувати AVL, коли проблема полягає у стимулюванні пошуку. Важливим є інше питання щодо дерева AVL та RB. Дерево RB краще, ніж AVL, коли стикається з випадковою вставкою за меншої вартості обертання, але AVL, який добре вставляє зростаючі або спадні дані. Отже, якщо проблема полягає в заохоченні вставки, ми можемо використовувати дерево RB.


3

Щоб отримати уявлення про те, як працює дерево AVL, ця інтерактивна візуалізація допомагає.

AVL, а також RedBlack Trees - це збалансовані по висоті Деревові структури даних. Вони досить схожі, і реальна різниця полягає в кількості операцій обертання, виконаних під час будь-якої операції додавання / видалення - вище у випадку AVL, щоб зберегти загальне більш однорідне балансування.

Обидві реалізації масштабуються як a O(lg N), де N - кількість листків, але на практиці дерево AVL швидше виконує інтенсивні завдання пошуку: використовуючи переваги кращого балансування, обхід дерева в середньому коротший. З іншого боку, з точки зору вставки та видалення дерево AVL відбувається повільніше: потрібна більша кількість обертань, щоб правильно збалансувати структуру даних після модифікації.

Для реалізацій загального призначення (тобто апріорі незрозуміло, чи переважають операції пошуку), RedBlack Trees віддають перевагу: їх легше реалізувати та швидше у звичайних випадках - скрізь, де Структура даних змінюється так часто, як часто шукається . Приклад, TreeMapі TreeSetв Java використовують резервне RedBlack Tree.


2

Той факт, що дерева RedBlack мають менше обертань, може зробити їх швидшими при вставці / видаленні, однак ..... Оскільки вони зазвичай трохи глибші, вони також можуть бути повільнішими при вставках та видаленнях. Кожного разу, коли ви переходите з одного рівня у дереві на наступний, відбувається велика зміна в тому, що запитувана інформація відсутня в кеш-пам'яті, і її потрібно отримати з оперативної пам'яті. Таким чином, час, отриманий на менших обертах, вже може бути втрачений, оскільки йому доводиться орієнтуватися глибше і, отже, доведеться частіше оновлювати кеш. Можливість працювати з кеш-пам'яті чи ні - це велика різниця. Якщо відповідна інформація знаходиться в кеш-пам’яті, ви можете зробити кілька операцій обертання за час, необхідний для навігації додатковим рівнем, а інформація про наступний рівень відсутня в кеші. Таким чином, у випадках, коли RedBlack теоретично працює швидше, дивлячись лише на необхідні операції, на практиці це може бути повільніше,


1

З того, що я бачив, здається, що дерева AVL роблять стільки обертань (іноді рекурсивно вгору по дереву), скільки потрібно, щоб отримати бажану висоту дерева AVL (Log n). Це робить його більш жорстко збалансованим.

Для Червоних чорних дерев існує 5 наборів правил, які вам потрібні, щоб переконатися, що ви залишаєтеся шляхом вставки та видалення, які ви можете знайти тут http://en.wikipedia.org/wiki/Red-black_tree .

Головне, що може допомогти вам для червоних чорних дерев, це той факт, що залежно від цих п’яти правил ви можете рекурсивно забарвити дерево до кореня, якщо дядько червоний. Якщо дядько темношкірий, вам потрібно буде зробити максимум два обертання, щоб вирішити будь-які проблеми, які у вас є, але після цих одного-двох обертань ВИ ГОТОВО. Зберіть його і скажіть на добраніч, тому що на цьому маніпуляція вам закінчується.

Великим правилом є номер 5 ... "Кожен простий шлях від даного вузла до будь-якого з його нащадкових листків містить однакову кількість чорних вузлів".

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


1

Підсумовуючи: AvlTrees дещо краще збалансований, ніж RedBlackTrees. Обидва дерева займають загальний час O (log n) для пошуку, вставки та видалення, але для вставки та видалення перше вимагає обертання O (log n), тоді як друге - лише O (1) обертання.

Оскільки обертання означають запис у пам’ять, а запис у пам’ять дорогий, RedBlackTrees на практиці оновлюються швидше, ніж AvlTrees

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