AVL и красные черные деревья являются самобалансирующимися, за исключением красного и черного цветов в узлах. Какова основная причина выбора красных черных деревьев вместо деревьев AVL? Каковы приложения красных черных деревьев?
Красное черное дерево над деревом
Ответ 1
В чем основная причина выбора красных черных деревьев вместо деревьев AVL?
красно-черные деревья и AVL-деревья являются наиболее часто используемыми сбалансированными бинарными деревьями поиска, и они гарантированно поддерживают вставку, удаление и поиск O(logN) time
, Тем не менее, есть следующие точки сравнения между ними:
- Деревья AVL более жестко сбалансированы и, следовательно, обеспечивают более быстрый поиск. Таким образом, для интенсивного поиска используйте дерево AVL.
- Для вставки интенсивных задач используйте красно-черное дерево.
- Деревья AVL хранят коэффициент баланса в каждом узле. Это занимает
O(N)
дополнительное пространство. Однако, если мы знаем, что ключи, которые будут вставлены в дерево, всегда будут больше нуля, мы можем использовать знаковый бит ключей для хранения информации о цвете красно-черного дерева. Таким образом, в таких случаях красно-черное дерево не занимает лишних мест.
Какое применение красное черное дерево?
Красно-черные деревья более общего назначения. Они сравнительно хорошо работают при добавлении, удалении и поиске, но деревья AVL имеют более быстрый поиск за счет более медленного добавления/удаления. Красно-черное дерево используется в следующих случаях:
- Java:
java.util.TreeMap
,java.util.TreeSet
- C++ STL (в большинстве реализаций): карта, мультикарта, мультимножество
- Ядро Linux: полностью честный планировщик, linux/rbtree.h
Ответ 2
Попробуйте прочитать статью .
Он предлагает некоторое представление о различиях, сходствах, производительности и т.д.
Вот цитата из статьи:
RB-деревья, а также деревья AVL, самобалансируются. Оба они обеспечивают O (log n) поиск и производительность вставки.
Разница в том, что RB-деревья гарантируют O (1) вращения на операцию вставки. Это то, что фактически стоит производительность в реальных реализациях.
Упрощенные, RB-деревья получают это преимущество от концептуального создания 2-3 деревьев, не несущих накладных расходов динамических структур node. Физически RB-деревья реализованы как двоичные деревья, красные/черные флаги имитируют поведение 2-3.
Насколько я понимаю, деревья AVL и деревья RB не очень далеки от производительности. Дерево RB - это просто вариант B-дерева, и балансировка реализована иначе, чем дерево AVL.
Ответ 3
Наше понимание различий в производительности улучшилось с годами, и теперь основная причина использования красно-черных деревьев над AVL не будет иметь доступа к хорошей реализации AVL, поскольку они немного менее распространены, возможно, потому что они не охвачены в CLRS.
Оба дерева теперь рассматриваются как формы сбалансированные по рангам деревья, но красно-черные деревья последовательно медленнее на около 20% в реальных тестах. Или даже на 30-40% медленнее, если вставлены последовательные данные.
Таким образом, люди, которые изучали красно-черные деревья, но не деревья AVL, склонны выбирать красно-черные деревья. Основное использование для красно-черных деревьев подробно описано в записи Википедии для них.
Ответ 4
Другие ответы здесь обобщают плюсы и минусы деревьев RB и AVL, но я нашел эту разницу особенно интересной:
Деревья AVL не поддерживают постоянную стоимость амортизированного обновления [но красно-черные деревья делают]
Источник: Mehlhorn and Sanders (2008) (раздел 7.4)
Итак, хотя деревья RB и AVL гарантируют O (log (N)) наихудшее время поиска, вставки и удаления, восстановление свойства AVL/RB после вставки или удаления node может быть выполнено в O ( 1) амортизированное время для красно-черных деревьев.
Ответ 5
Программистам обычно не нравится динамически выделять память. Проблема с деревом avl заключается в том, что для элементов "n" вам нужно как минимум log2 (log2 (n))... (height- > log2 (n)) битов, чтобы сохранить высоту дерева! Поэтому, когда вы обрабатываете огромные данные, вы не можете быть уверены в том, сколько бит выделяется для хранения высоты на каждом node.
Например, если вы используете 4 байта int (32 бит) для хранения высоты. Максимальная высота может быть: 2 ^ 32 и, следовательно, максимальное количество элементов, которые вы можете сохранить в дереве, равно 2 ^ (2 ^ 32) - (кажется, очень большое, но в этом возрасте данных ничего слишком большого, я думаю). И, следовательно, если вы преодолеете этот предел, вам придется динамически выделять больше места для хранения высоты.
Это ответ, предложенный профессором моего университета, который казался мне разумным! Надеюсь, у меня есть смысл.
Редактирование: деревья AVL более сбалансированы по сравнению с красными черными деревьями, но при вставке и удалении они могут вызывать большее количество поворотов. Поэтому, если ваше приложение связано с многочисленными частыми вставками и удалениями, то предпочтение следует отдавать от деревьев красного цвета. И если вставки и удаления менее часты, а поиск - более частая операция, тогда дерево AVL должно быть предпочтительнее Red Black Tree. --Source GEEKSFORGEEKS.ORG
Ответ 6
Повторная балансировка дерева AVL должна соответствовать следующему свойству. (Ссылка на Wiki - Дерево AVL)
В дереве AVL высоты двух дочерних поддеревьев любого node отличаются не более чем одним; если в любое время они отличаются друг от друга более чем одним, выполняется перебалансировка, чтобы восстановить это свойство.
Таким образом, это означает, что общая высота дерева AVL не может сходить с ума, так как поисковые запросы будут лучше с AVL деревьями. И так как дополнительные операции (вращения) должны быть сделаны, чтобы не допустить, чтобы высота сходила с ума, операции изменения дерева могут быть дорогостоящими.