Главная страница
Навигация по странице:

  • Сбалансированное дерево поиска ( self - balancing binary search tree )

  • Операция Средний случай ( average case ) Худший случай

  • Применение красно-черных деревьев

  • Красно-черное дерево ( Red - black tree , RB - tree )

  • Какие свойства красно-черного дерева могут быть нарушены после вставки нового узла (красного цвета)

  • После добавления нового элемента свойства 2 и 4 могут быть нарушены

  • Левый поворот дерева ( left rotation )

  • Правый поворот дерева ( right rotation )

  • Случаи 4, 5 и 6 симметричны случаям 1, 2 и 3

  • Лемма.

  • Red-black tree vs. AVL tree

  • Красно-чёрные деревья. Красночёрные деревья Двоичные деревья поиска (Binary search Tree, bst)


    Скачать 0.62 Mb.
    НазваниеКрасночёрные деревья Двоичные деревья поиска (Binary search Tree, bst)
    АнкорКрасно-чёрные деревья
    Дата06.12.2020
    Размер0.62 Mb.
    Формат файлаdocx
    Имя файлаRB-Trees.docx
    ТипДокументы
    #157648

    Красно-чёрные деревья
    Двоичные деревья поиска (Binary search Tree, BST) 


    Двоичное дерево поиска (binary search treeBST) - это двоичное дерево, в котором: 

    1. Каждый узел (node) имеет не более двух дочерних узлов (child nodes) 

    1. Каждый узел содержит ключ (key) и значение (value) и для него выполняются следующие условия: 

    • Ключи всех узлов левого поддерева меньше значения ключа родительского узла 

    • Ключи всех узлов правого поддерева больше значения ключа родительского узла 

     



    1. Операции имеют трудоемкость пропорциональную высоте дерева 

    1. В среднем случае высота дерева O(log(n)) – логарифмическую сложность 

    1. В худшем случае элементы добавляются по возрастанию (убыванию) ключей – дерево вырождается в список длины n 

    bstree_add(1, value)  

    bstree_add(2, value) 

    bstree_add(3, value) 

    bstree_add(4, value) 

    Сбалансированные деревья поиска 


    • Сбалансированное дерево поиска (self-balancingbinarysearchtree) – дерево поиска в котором высота любого узла различаются не более чем на заданную константу k 

    • Виды сбалансированных деревьев поиска: 

    • АВЛ-деревья 

    • Красно-черные деревья 

    • Splay tree 

    • AA tree 

    • Etc… 

    Red-black tree 

    Операция

    Средний случай (average case)

    Худший случай  
    (worst case)

    Add(key, value)

    O(log n) 

    O(log n) 

    Lookup(key)

    O(log n) 

    O(log n) 

    Remove(key)

    O(log n) 

    O(log n) 

    Min 

    O(log n) 

    O(log n) 

    Max 

    O(log n) 

    O(log n) 

     

    Сложность по памяти: O(n) 

    Применение красно-черных деревьев 

    • GNU libstdc++ (/usr/include/c++/bits) 
      std::map, std::multimap, std::set, std::multiset 

     

    • LLVM libc++ 
      std::map, std::set 
       

    • Java 
      java.util.TreeMap, java.util.TreeSet 
       

    • Microsoft .NET 4.5 Framework Class Library 
      SortedDictionary, SortedSet 

    Красно-черное дерево (Red-blacktreeRB-tree– это бинарное дерево поиска, для которого выполняются красно-черные свойства (red-black properties): 

    1. Каждый узел является красным или черным 

    1. Корень дерева является черным 

    1. Каждый лист дерева (NULL) является черным 

    1. У красного узла оба дочерних узла – черные 

    1. У любого узла все пути от него до листьев, являющихся его потомками, содержат одинаковое кол-во черных улов  

    Пример красно-черного дерева 


     

    Добавление элемента 


    1. Находим лист для вставки нового элемента 

    1. Создаем элемент и окрашиваем его в красный цвет 

    1. Перекрашиваем узлы и выполняем повороты 

     

     

    Нарушение свойств красно-черного дерева 


    Какие свойства красно-черного дерева могут быть нарушены после вставки нового узла (красного цвета)? 

    1. Каждый узел является красным или черным – выполняется 

    1. Корень дерева является черным – не выполняется (например, при добавление первого элемента) 

    1. Каждый лист дерева (NULL) является черным – выполняется 

    1. У красного узла оба дочерних являются черными – не выполняется 

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

     

    После добавления нового элемента свойства 2 и 4 могут быть нарушены 

    1. Каждый узел является красным или черным – выполняется 

    1. Корень дерева является черным – не выполняется (например, при добавление первого элемента) 

    1. Каждый лист дерева (NULL) является черным – выполняется 

    1. У красного узла оба дочерних узла являются черными – не выполняется 

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

     

    Восстановление красно-черного дерева 


    • Возможно 6 случаев, нарушающих свойства красно-черного дерева (3 случая симметричны другим трем) 

    • Восстановление свойств начинаем с нового элемента и продвигаемся вверх к корню дерева 

     

    Случай 1 

     

    • Узел P – это корень левого поддерева своего родителя G 

    • Узел z красный 

    • Родительский узел P узла z красный 

    • Узел U (дядя узла z) красный 

     

     

     

    Перекрашиваем узлы: 

     

    • P – черный 

    • U – черный 

    • G – красный 

     

     

     

     

     

     

     

     

     

     

     

    Случай 2 

     

    • Узел P – это корень левого поддерева своего родителя G 

    • Узел z красный 

    • Родительский узел P узла z красный 

    • Узел U черный 

    • Узел z– правый дочерний элемент P 

     

     

     

     

     

    Переходим к случаю 3 путем поворота дерева P влево 

     

    Левый поворот дерева (leftrotation) 

     

    function LeftRotate(x) 

    y = x.right 

    x.right = y.left /* Subtree b */ 

    if y.left != NULL then 

    y.left.parent = x /* Setup parent of b */ 

    y.parent = x.parent 

    if x = x.parent.left then /* x is left subtree */ 

    x.parent.left = y 

    else 

    x.parent.right = y 

    y.left = x 

    x.parent = y 

    end function 

     

    Случай 3 

     

    • Узел P – это корень левого поддерева своего родителя G 

    • Узел z красный 

    • Родительский узел P узла z красный 

    • Узел U черный 

    • Узел z– правый дочерний элемент P 

     

     

    1. Перекрашиваем вершины: 

     

    • P – черный 

    • G – красный 

     

    1. Поворачиваем дерево G вправо 

     

     

     

    Правый поворот дерева (rightrotation) 

     

    function RightRotate(x) 

    y = x.left 

    x.left = y.right /* Subtree c */ 

    if y.right != NULL then 

    y.right.parent = x /* Setup parent of c */ 

    y.parent = x.parent 

    if x = x.parent.left then /* x is left subtree */ 

    x.parent.left = y 

    else 

    x.parent.right = y 

    y.right = x 

    x.parent = y 

    end function 

    Восстановление красно-черного дерева 


    Случаи 4, 5 и 6 симметричны случаям 1, 2 и 3 

    • Узел P – это корень правого поддерева своего родителя G 

    • Узел z красный 

    • Родительский узел P узла z красный 

    • Узел U черный или красный 

    • Узел z– левый или правый дочерний элемент P 

    function RBTree_Fixup(z) 

    while z.parent.color = RED do 

    if z.parent = z.parent.parent.left then 

    /* z in left subtree of G */ 

    y = z.parent.parent.right; /* Uncle */ 

    if y.color = RED then 

    /* Case 1 */ 

    z.parent.color = BLACK 

    y.color = BLACK 

    z.parent.parent.color = RED 

    z = z.parent.parent 

    else 

    if z = z.parent.right then 

    /* Case 2 --> case 3 */ 

    z = z.parent 

    RBTree_RotateLeft(z) 

    end if 

    /* Case 3 */ 

    z.parent.color = BLACK 

    z.parent.parent.color = RED 

    RBTree_RotateRight(z.parent.parent) 

    end if 

    else 

    /* z in right subtree of G */ 

    /* ... */ 

    end if 

    end while 

    root.color = BLACK 

    end function 

     

    Удаление элемента 

    1. По заданному ключу находим элемент для удаления 

    1. Удаляем элемент (как в случае обычного дерева поиска) 

    1. Перекрашиваем узлы и выполняя повороты восстанавливаем структуру красно-черного дерева 

    Высота красно-черных деревьев 


    Обозначим: 

    h(x) –высота красно-черного дерева с корнем в узле x 

    bh(x) – кол-во черных элементов на пути от узла x к листу («черная» высота дерева, black height) 

     

    Лемма. Красно-черное дерево с nвнутренними узлами имеет высоту не более чем 2log(n+1) 

    Доказательство  

    • Покажем по индукции, что любое поддерево с вершиной в узле xсодержит не менее 2bh(x) – 1 внутренних узлов 

    • Базис индукции: bh(x) = 0, следовательно это лист (NULL, не содержит внутренних узлов): 20 – 1 = 0 

    • Индуктивное предположение: считаем, в любом поддереве xс черной высотой < 2bh(x) – 1 

    • Если xчерный, оба узла имеют черную высоту bh(x– 1, если xкрасный, узлы имею высоту bh(x) 

    • Следовательно в поддереве xчисло nвнутренних узлов 

     

     

     

     

     

     

     

    • Следовательно 

     

     

    • Логарифмируем 

     

    Red-black tree vs. AVL tree 

    • Высота AVL-дерева 

     

    • Высота красно-черного дерева 

     

     


    написать администратору сайта