2015-08-03 2 views
6

Я прочитал много статей о красном черном дереве, где требуется время O (log n). Я не очень понимаю, как это работает и как на самом деле используется карта дерева с использованием алгоритма красного черного дерева для балансировки дерева по сравнению с деревом двоичного поиска.Как дерево использует алгоритм красного черного дерева

Ссылка Ссылки https://www.topcoder.com/community/data-science/data-science-tutorials/an-introduction-to-binary-search-and-red-black-trees/

Может кто-нибудь, пожалуйста, объясните с примером, как работает алгоритм.

ответ

11

Красно-черное дерево является дерево двоичного поиска. Это просто аромат BST, который имеет причудливые версии insert и delete операций, которые реорганизуют дерево по мере их запуска, чтобы дерево никогда не становилось «длинным и жестким». Чем длиннее и строче дерево получает, тем больше он ведет себя как связанный список. В среднем для операций с связанным списком требуется половина списка, который нужно коснуться (или весь список в худшем случае), поэтому время выполнения изменяется линейно (O (n) в количестве элементов n). Когда дерево «густое» или почти сбалансированное, тогда операции намного дешевле (O (log n)) каждый. Красно-черные алгоритмы гарантируют, что дерево остается густым.

Чтобы сделать это конкретным, вот два дерева, которые хранят ключи от A до G. Левые длинны и жесткие. Обратите внимание, как выглядит список. В худшем случае для поиска элемента требуется 4 ключевых сравнения. Дерево справа густое. Ему нужно только 3. Здесь разница небольшая. Для дерева из 1023 элементов для строкового дерева требуется 512 сравнений, а кустов - только 10. Это сила log n.

B     _D_ 
/\    / \ 
A D    B  F 
/\   /\ /\ 
    C F   A C E G 
    /\ 
    E G 

Красно-черное дерево не гарантировано идеально густые (в правильной терминологии «отлично сбалансированы»), но красно-черных правила гарантируют, что он достаточно густой математически строгим образом так, что операция раз изменяются как log n, а не линейно по n.

Гений красно-черных правил заключается в том, что они являются «местными». Во время вставки или удаления, которые нарушают правила, их можно восстановить, отрегулировав только постоянное количество узлов для каждого узла, затронутого операцией. Поэтому они дешевы и довольно просты в реализации.

Тем не менее, когда красно-черные правила верны для всего дерева, можно показать умным математическим доказательством, что оно достаточно густо, как описано выше.

А как насчет карты деревьев? Карта - это функция с доменом, называемым набором ключей K и диапазоном, называемым набором значений V. Для реализации карты дерева каждый узел хранит пару значений ключа <k,v>, где k \in K и v \in V. На рисунках выше (и большинстве презентаций) показаны только клавиши (буквы A-G). На карте, вставка, поиск и удаление работают на этих парах довольно очевидным образом. Например, поиск выполняет поиск ключа с использованием обычного алгоритма BST. Когда ключ найден, значение также найдено, потому что оно находится в одной паре. Это то, что вернулось. В java пара называется Map.Entry. Вы можете проверить это в Java source code.

Я не буду вдаваться в подробности о том, как работают красно-черные правила, потому что я не мог улучшить на the Wikipedia page. Я предполагаю и надеюсь, что вам не хватает «большой картины», поэтому теперь обсуждение будет иметь смысл. Хорошей новостью является то, что почти все языки обеспечивают тщательно проверенную и оптимизированную по производительности реализацию дерева, поэтому знание тайных деталей поворота не требуется. Конечно, если вам интересно и просто хотите знать, имейте это! Поздравления!

Для чего это стоит, лучшие объяснения алгоритмов Coder не всегда самые ясные. Охота вокруг для других, пока вам не понадобится «щелчок».Уважаемые учебники в CS уважаются по одной причине: их объяснения превосходны. Corman and Rivest является признанным фаворитом.

2

Прежде всего, вы должны уточнить свой вопрос. Укажите, что вы знаете, что вы не делаете и что вы пробовали.

Приходит к вопросу, TreeMap и Красно-черные деревья - совершенно разные понятия. Концептуальное понимание того или иного не зависит от другого, и я предлагаю вам не смешивать их. Я не дам вам точного ответа, скорее я дам краткий обзор концепций и последовательности, в которой вы должны их изучить (ИМО).

Структуры

Карта данных

  1. Карта
  2. Виды Карта - HashMap, SortedMap, TreeMap и т.д. Структуры

Дерево данных

  1. Дерево
  2. Binary Дерево
  3. Двоичное дерево (BST)
  4. Сбалансированный BST
  5. самобалансирующейся BST - AVL дерева, красно-черное дерево, и т.д.

Я предполагаю, что вы знаете, понятие Карты и Binary деревьев поиска. Если нет, простой поиск приведет вас к множеству хороших ресурсов.

Теперь, чтобы получить реальный ответ.

Прежде всего, вы должны знать, что такое SortedMap и Self-balancing BST.

Что такое SorteMap?

С Java docs,

карта, которая дополнительно обеспечивает полный порядок на его ключей. Карта упорядочена в соответствии с естественным порядком ее ключей или компаратором, обычно предоставляемым на время сортировки карты.

A SortedMap используется, если вы хотите, чтобы базовый ключ, пары значений сортировались (по ключу). Таким образом, было бы легче получить минимальные, максимальные или выполнить операции на основе диапазона.

Что такое самобалансирующееся двоичное дерево поиска?

От wikipedia,

самостоятельной балансировки (или высоту балансировки) бинарное дерево поиска является любым узлом на основе двоичного дерева поиска, которая автоматически сохраняет свою высоту (максимальное число уровней ниже корня) малые перед вставками и удалениями произвольных элементов.

Опять-таки, красно-черное дерево в одной реализации самобалансирующегося BST.Есть others как дерево ALV и т. Д. Наихудший случай для любой операции над обычным BST - O(n). Основным преимуществом использования Balanced BST по сравнению с обычным/не сбалансированным BST является то, что наихудший случай всех операций сводится к O(logn) с небольшими накладными расходами, связанными с перестановкой узлов при вставке/удалении. Посмотрите на this.

Итак, что такое TreeMap?

A TreeMap Реализация SortedMap.

Как связаны TreeMap и красно-черное дерево?

Нет, они не являются. Теоретически вы можете использовать любое из двоичных поисковых деревьев для реализации TreeMap. Чтобы получить хорошие результаты, мы используем Self-balancing Binary Search Trees, которые имеют меньшую временную сложность для операций вставки, удаления и извлечения. В случае Java используется красно-черное дерево. Я не знаю точной причины, почему используется красно-черное дерево, но я считаю, что есть одно.

Смежные вопросы