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-Trees гарантирует O (1) оборотов за операцию вставки. Вот что на самом деле стоит производительности в реальных реализациях.
Упрощенно, RB-деревья получают это преимущество от того, что они концептуально представляют собой 2-3 дерева без дополнительных затрат на динамические структуры узлов. Физически RB-деревья реализованы как двоичные деревья, красные / черные флаги имитируют 2-3 поведения.
Насколько я понимаю, деревья AVL и деревья RB не так уж далеки с точки зрения производительности. Дерево RB - это просто вариант B-дерева, и балансировка реализована иначе, чем дерево AVL.
Наше понимание различий в производительности улучшилось с годами, и теперь основной причиной использования красно-черных деревьев вместо AVL будет отсутствие доступа к хорошей реализации AVL, поскольку они немного менее распространены, возможно, потому, что они не охвачены в CLRS.
Оба дерева теперь считаются формами деревьев со сбалансированным рангом, но красно-черные деревья стабильно медленнее примерно на 20% в реальных тестах . Или даже на 30-40% медленнее при вставке последовательных данных .
Поэтому люди, которые изучали красно-черные деревья, но не АВЛ-деревья, склонны выбирать красно-черные деревья. Основное использование красно-черных деревьев подробно описано в статье о них в Википедии .
Другие ответы здесь хорошо суммируют плюсы и минусы деревьев RB и AVL, но я нашел эту разницу особенно интересной:
Деревья AVL не поддерживают постоянную амортизированную стоимость обновления [в отличие от красно-черных деревьев]
Источник: Mehlhorn & Sanders (2008) (раздел 7.4).
Таким образом, хотя деревья RB и AVL гарантируют наихудшее время O (log (N)) для поиска, вставки и удаления, восстановление свойства AVL / RB после вставки или удаления узла может быть выполнено за O (1) амортизированное время для красно-черные деревья.
Программисты обычно не любят динамически выделять память. Проблема с деревом avl заключается в том, что для "n" элементов вам нужно как минимум log2 (log2 (n)) ... (height-> log2 (n)) бит для хранения высоты дерева! Поэтому, когда вы обрабатываете огромные данные, вы не можете быть уверены в том, сколько бит нужно выделить для хранения высоты в каждом узле.
Например, если вы используете 4 байта int (32 бита) для хранения высоты. Максимальная высота может быть: 2 ^ 32 и, следовательно, максимальное количество элементов, которые вы можете сохранить в дереве, составляет 2 ^ (2 ^ 32) - (кажется, очень большим, но в этом возрасте данных, я думаю, ничего не слишком велико). И, следовательно, если вы превысите этот предел, вам придется динамически выделять больше места для хранения высоты.
Это ответ, предложенный профессором моего университета, который мне показался разумным! Надеюсь, я понимаю.
Изменения: деревья AVL более сбалансированы по сравнению с красно-черными деревьями, но они могут вызывать большее вращение во время вставки и удаления. Поэтому, если ваше приложение включает в себя много частых вставок и удалений, предпочтительнее использовать деревья Red Black. И если вставки и удаления происходят реже, а поиск - более частая операция, то дерево 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 должна соответствовать следующему свойству. (Ссылка вики - AVL Tree )
В дереве AVL высота двух дочерних поддеревьев любого узла отличается не более чем на единицу; если в любой момент они отличаются более чем на единицу, выполняется повторная балансировка для восстановления этого свойства.
Таким образом, это означает, что общая высота дерева AVL не может сходить с ума, т.е. поиск будет лучше с деревьями AVL. И так как дополнительные операции (вращения) должны выполняться, чтобы не упустить высоту, операции модификации дерева могут быть немного дорогостоящими.