AVL та Червоні чорні дерева одночасно балансують, за винятком Червоного та Чорного кольору у вузлах. Яка головна причина вибору Червоних чорних дерев замість дерев AVL? Які додатки Червоних чорних дерев?
AVL та Червоні чорні дерева одночасно балансують, за винятком Червоного та Чорного кольору у вузлах. Яка головна причина вибору Червоних чорних дерев замість дерев AVL? Які додатки Червоних чорних дерев?
Відповіді:
Яка головна причина вибору Червоних чорних дерев замість дерев AVL?
Як червоно-чорні дерева, так і AVL-дерева є найбільш часто використовуваними збалансованими деревами бінарного пошуку, і вони підтримують гарантію вставки, видалення та пошуку O(logN) time
. Однак є наступні моменти порівняння між ними:
O(N)
додаткове місце. Однак якщо ми знаємо, що ключі, які будуть вставлені у дерево, завжди будуть більшими за нуль, ми можемо використовувати бітові знаки клавіш для зберігання кольорової інформації червоно-чорного дерева. Таким чином, у таких випадках червоно-чорне дерево не займає зайвого місця.Яке застосування Червоного чорного дерева?
Червоно-чорні дерева мають більш загальне призначення. Вони відносно добре додають, видаляють та шукають, але дерева AVL мають більш швидкі пошуки за рахунок повільнішого додавання / видалення. Червоно-чорне дерево використовується в наступному:
java.util.TreeMap
,java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
неправда.
std:: map
і друзі використовують якусь конкретну структуру. Це залишається за реалізацією, хоча libstdc ++ та Dinkumware принаймні використовує червоно-чорні дерева, і, здається, ви праві на практиці.
Спробуйте прочитати цю статтю
Він пропонує корисну інформацію про відмінності, схожість, ефективність тощо.
Ось цитата зі статті:
RB-Дерева, як і дерева AVL, самоврівноважуються. Обидва вони забезпечують ефективність пошуку O (log n) та вставки.
Різниця полягає в тому, що RB-Дерева гарантують обертання O (1) за операцію вставки. Саме це фактично коштує продуктивності в реальних реалізаціях.
Спрощено, RB-Дерева отримують цю перевагу, оскільки концептуально вони складають 2-3 дерева, не переносячи накладні динамічні структури вузлів. Фізично RB-дерева реалізуються як бінарні дерева, червоні / чорні прапори імітують 2-3 поведінки
Що стосується мого власного розуміння, дерева AVL та дерева RB не дуже далекі в плані продуктивності. Дерево RB - це просто варіант B-дерева, і врівноваження реалізується інакше, ніж дерево AVL.
Наше розуміння відмінностей у продуктивності покращилось з роками, і тепер основною причиною використання червоно-чорних дерев над AVL було б відсутність доступу до гарної реалізації AVL, оскільки вони є дещо рідшими, можливо, тому що вони не охоплені CLRS.
Обидва дерева зараз вважаються формами збалансованих за рангом дерев, але червоно-чорні дерева послідовно повільніше приблизно на 20% у реальних тестах світу . Або навіть на 30-40% повільніше при введенні послідовних даних .
Тож люди, які вивчали червоно-чорні дерева, але не AVL-дерева, як правило, обирають червоно-чорні дерева. Основні напрямки використання червоно-чорних дерев детально описані у Вікіпедії .
Інші відповіді тут добре підсумовують плюси та мінуси дерев RB та AVL, але ця різниця мені здається особливо цікавою:
Дерева AVL не підтримують постійну амортизовану вартість оновлення [але червоно-чорні дерева]
Джерело: Mehlhorn & Sanders (2008) (розділ 7.4)
Отже, хоча і RB, і AVL дерева гарантують O (log (N)) найгірший час для пошуку, вставлення та видалення, відновлення властивості AVL / RB після вставки або видалення вузла може бути здійснено за O (1) амортизований час для червоно-чорні дерева.
Програмісти зазвичай не люблять динамічно розподіляти пам'ять. Проблема дерева avl полягає в тому, що для елементів "n" вам потрібні найменші біти log2 (log2 (n)) ... ... (висота-> log2 (n)), щоб зберігати висоту дерева! Отже, обробляючи величезні дані, ви не можете бути впевнені, скільки біт відведено для зберігання висоти на кожному вузлі.
Наприклад, якщо ви використовуєте 4 байти int (32 біта) для зберігання висоти. Максимальна висота може бути: 2 ^ 32 і, отже, Максимальна кількість елементів, які ви можете зберігати у дереві, становить 2 ^ (2 ^ 32) - (здається, дуже велика, але в цьому віці даних нічого не занадто великого, мабуть). Отже, якщо ви перевищуєте цю межу, вам доведеться динамічно виділяти більше місця для зберігання висоти.
Це відповідь, запропонована професором мого університету, яка мені здавалася розумною! Сподіваюся, я маю сенс.
Правки: дерева AVL є більш врівноваженими порівняно з червоними чорними деревами, але вони можуть викликати більше обертання під час вставки та видалення. Отже, якщо ваша заявка передбачає численні часті вставки та видалення, слід віддати перевагу червоним чорним деревам. І якщо вставки та видалення рідші, а пошук частіший, то слід віддати перевагу дереву AVL над Червоним Чорним деревом. --Джерело GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Мені не потрібна висота жодного вузла в AVL-дереві для його реалізації. Вам потрібен один біт додаткової інформації для кожного вузла ( Я ВЕЛИКИЙ (брат та сестра з найвищим під-деревом))); зручніше, як і звичайно, мати два зайвих біта (дитина вище для лівих та правих), як це представлено AV & L.
Перебалансування дерева AVL повинно відповідати наведеному нижче властивості. (Довідник Wiki - дерево AVL )
У дереві AVL висота двох дочірніх підрядів будь-якого вузла відрізняється щонайменше на одну; якщо в будь-який час вони відрізняються більш ніж одним, для відновлення цієї властивості робиться перебалансування.
Отже, це означає, що загальна висота дерева AVL не може зійти з розуму, тобто пошуки стануть кращими для AVL Дерев. Оскільки додаткові операції (обертання) потрібно робити, щоб висота не зійшла з розуму, операції з модифікації дерева можуть бути дорогими.