Объяснение реализации TreeMap на основе красно-черного дерева в JAVA
Я просматривал исходный код TreeMap на JAVA. Согласно документации:
реализация навигационной карты на основе красно-черного дерева. Карта сортируется в соответствии с естественным порядком ее ключей или компаратором, предоставляемым во время создания карты, в зависимости от используемого конструктора.
эта реализация обеспечивает гарантированную стоимость времени журнала (n) для операций containsKey, get, put и remove. Алгоритмы являются адаптациями тех, кто в Кормене, Лейзерсоне и введении Ривеста в алгоритмы.
в исходном коде я обнаружил, что внутренний класс запись использовался как узел.
static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
V value;
Entry<K,V> left = null;
Entry<K,V> right = null;
Entry<K,V> parent;
boolean color = BLACK;
....
что касается дефинации красно-черное дерево. Из Википедии я нашел:
красно–черное дерево-это типа self-балансировка бинарного дерева поиска, структура данных в информатике.
в самобалансировка обеспечивается окраской каждого узла одним из двух цветов (обычно они называются "красным" и "черным", отсюда и название деревьев) таким образом, что полученное окрашенное дерево удовлетворяет определенным свойствам, которые не позволяют ему стать значительно неуравновешенным. При изменении дерева новое дерево впоследствии перестраивается и перекрашивается для восстановления свойств окраски. Свойства сконструированы таким образом, что эта перестановка и перекраска могут быть выполнены эффективно.
Я попытался проанализировать код souce, но не смог понять следующее:
Как самобалансировка дерева реализуется в исходном коде java.
Я попытался найти подробную реализацию TreeMap, но был не удалось найти такую статью, как статье я нашел для HashMap
со вчерашнего дня я висел на этом дереве: (может кто-нибудь, пожалуйста, помогите мне спуститься...
1 ответов
-
цель
TreeMap
должен иметь дерево ключей, где ключи, которые ниже, чем ключ родителя слева и ключи выше, чем ключ родителя справа. Итак, если вы добавитеC
, потомE
, у вас будет это дерево:C \ E
если вы затем добавить
D
, изначально у вас будет:C \ E / D
но это дерево неуравновешенно, и поэтому поиск будет медленнее. Итак, дерево сбалансировано. После балансировки, дерево теперь становится намного эффективнее:
C C \ rotate \ rotate D E --- right ---> D --- left ---> / \ / around \ around C E D E E D
перебалансировка происходит внутри
fixAfterInsertion()
метод, который проверяет, является ли красно-черные свойства дерева по-прежнему сохраняются после вставки. И, если это не так, то он балансирует дерево, выполняющее либоrotateLeft()
илиrotateRight()
на оскорбительной ветви, чтобы восстановить баланс. Затем он перемещается вверх по дереву и проверяет баланс и так далее, пока не достигнет корня узел.
есть несколько ресурсов в интернете, которые объясняют красно-черные деревья в глубине. Но я думаю, что лучший способ понять процесс-это следовать анимированному учебнику, как это:http://www.csanimated.com/animation.php?t=Red-black_tree
нет ничего особенного в TreeMap
внедрение RBT. Он близко следует псевдокоду, данному В книге CLRS (Cormen, Leiserson, Rivest and Stein), которая является тем, что 99% реализаций вокруг делают.