Может кто-нибудь объяснить, в чем основные различия между этими двумя структурами данных? Я пытался найти в Интернете источник, который подчеркивал бы различия / сходства, но не нашел ничего слишком информативного. В каких случаях одно предпочтительнее другого? Какие практические ситуации делают использование одного «лучше» другого?
82
Для небольших данных :
insert : дерево RB и дерево avl имеют постоянное количество максимальных оборотов, но дерево RB будет быстрее, потому что в среднем дерево RB использует меньшее вращение.
поиск : дерево AVL быстрее, потому что дерево AVL имеет меньшую глубину.
delete : дерево RB имеет постоянное максимальное количество оборотов, но дерево AVL может иметь O (log N) раз вращения как худшее. и в среднем дерево RB также имеет меньшее количество оборотов, поэтому дерево RB работает быстрее.
для больших данных :
вставить : дерево AVL работает быстрее. потому что перед вставкой вам нужно найти конкретный узел. по мере того, как у вас есть больше данных, разница во времени при поиске конкретного узла растет пропорционально O (log N). но дерево AVL и дерево RB по-прежнему требуют постоянного числа оборотов в худшем случае. Таким образом, горлышко бутылки станет временем, когда вы будете искать этот конкретный узел.
поиск : дерево AVL работает быстрее. (как и в случае с маленькими данными)
delete : дерево AVL в среднем быстрее, но в худшем случае дерево RB быстрее. потому что вам также необходимо найти очень глубокий узел для замены перед удалением (аналогично причине вставки). в среднем оба дерева имеют постоянное число оборотов. но дерево RB имеет постоянную верхнюю границу вращения.
источник
Цитата из этого: Разница между AVL и красно-черными деревьями
источник
Из статьи в Википедии о деревьях AVL
источник
Максимальная высота деревьев имеет первостепенное значение для сохранения равновесия. Это почти то же самое
1.44 * log(n)
для AVL, но для дерева RB это так2 * log(n)
. Таким образом, мы можем сделать вывод, что лучше использовать AVL, когда проблема заключается в стимулировании поиска. Другой вопрос для дерева AVL и RB. Дерево RB лучше, чем AVL, когда сталкивается со случайной вставкой при более низкой стоимости вращения, но AVL подходит для вставки восходящих или нисходящих данных. Поэтому, если проблема заключается в стимулировании вставки, мы можем использовать дерево RB.источник
Чтобы получить представление о том, как работает дерево AVL, это интерактивная визуализация помогает.
AVL, а также RedBlack Trees представляют собой структуры данных дерева со сбалансированной высотой. Они очень похожи, и реальная разница заключается в количестве операций вращения, выполняемых при любой операции добавления / удаления - больше в случае AVL, чтобы сохранить общую более однородную балансировку.
Обе реализации масштабируются как a
O(lg N)
, где N - количество листьев, но на практике дерево AVL быстрее выполняет задачи с интенсивным поиском: благодаря лучшей балансировке обходы дерева в среднем короче. С другой стороны, с точки зрения вставки и удаления дерево AVL работает медленнее: требуется большее количество поворотов для правильной перебалансировки структуры данных после модификации.Для реализаций общего назначения (т.е. априори не ясно, являются ли поиски преобладающими операциями), деревья RedBlack предпочтительнее: их проще реализовать и быстрее в общих случаях - везде, где структура данных изменяется так же часто, как и поиск . Например,
TreeMap
иTreeSet
в Java используют поддержку RedBlack Tree.источник
Однако тот факт, что деревья RedBlack имеют меньшее вращение, может ускорить их вставку / удаление .... Поскольку они обычно немного глубже, они также могут быть медленнее при вставке и удалении. Каждый раз, когда вы переходите от одного уровня в дереве к следующему, происходит большое изменение: запрошенная информация не находится в кеше и должна быть получена из ОЗУ. Таким образом, время, полученное при меньшем количестве оборотов, уже может быть потеряно, поскольку ему приходится перемещаться глубже и, следовательно, необходимо чаще обновлять свой кеш. Возможность работать из кеша или нет, имеет большое значение. Если соответствующая информация находится в кеше, то вы можете выполнить несколько операций ротации за время, необходимое для перехода на дополнительный уровень, а информация о следующем уровне не находится в кеше. Таким образом, в тех случаях, когда RedBlack теоретически быстрее, глядя только на необходимые операции, на практике он может быть медленнее,
источник
Из того, что я видел, кажется, что деревья AVL делают столько вращений (иногда рекурсивно вверх по дереву), сколько необходимо, чтобы получить желаемую высоту дерева AVL (Log n). Это делает его более жестким.
Для красно-черных деревьев существует 5 наборов правил, которые необходимо соблюдать при вставке и удалении, которые вы можете найти здесь http://en.wikipedia.org/wiki/Red-black_tree .
Главное, что может помочь вам с красно-черными деревьями, - это то, что в зависимости от этих пяти правил вы можете рекурсивно раскрасить дерево до корня, если дядя красный. Если дядя черный, вам нужно будет сделать максимум два поворота, чтобы исправить любые проблемы, которые у вас есть, но после этих одного или двух вращений ВЫ ЗАВЕРШЕНЫ. Упакуйте его и пожелайте спокойной ночи, потому что это конец манипуляции, которую вам нужно сделать.
Большое правило - номер 5 ... «Каждый простой путь от данного узла к любому из его дочерних листьев содержит одинаковое количество черных узлов».
Это вызовет большинство вращений, которые вам понадобятся для работы дерева, и это заставит дерево не уйти слишком далеко от баланса.
источник
В общем: AvlTrees немного лучше сбалансированы, чем RedBlackTrees. Оба дерева в целом занимают O (log n) времени для поиска, вставки и удаления, но для вставки и удаления первое требует O (log n) поворотов, а второе - только O (1) вращений.
Поскольку ротация означает запись в память, а запись в память стоит дорого, RedBlackTrees на практике обновляются быстрее, чем AvlTrees.
источник