Объяснение реализации 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% реализаций вокруг делают.