Объяснение реализации 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, но не смог понять следующее:

  1. Как самобалансировка дерева реализуется в исходном коде java.

Я попытался найти подробную реализацию TreeMap, но был не удалось найти такую статью, как статье я нашел для HashMap

со вчерашнего дня я висел на этом дереве: (может кто-нибудь, пожалуйста, помогите мне спуститься...

1 ответов


  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
    
  2. перебалансировка происходит внутри fixAfterInsertion() метод, который проверяет, является ли красно-черные свойства дерева по-прежнему сохраняются после вставки. И, если это не так, то он балансирует дерево, выполняющее либо rotateLeft() или rotateRight() на оскорбительной ветви, чтобы восстановить баланс. Затем он перемещается вверх по дереву и проверяет баланс и так далее, пока не достигнет корня узел.

есть несколько ресурсов в интернете, которые объясняют красно-черные деревья в глубине. Но я думаю, что лучший способ понять процесс-это следовать анимированному учебнику, как это:http://www.csanimated.com/animation.php?t=Red-black_tree

нет ничего особенного в TreeMap внедрение RBT. Он близко следует псевдокоду, данному В книге CLRS (Cormen, Leiserson, Rivest and Stein), которая является тем, что 99% реализаций вокруг делают.