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

  • Как бинарное дерево, красно-черное обладает свойствами

  • Свойства красно-черных деревьев

  • Ну и почему такое дерево является сбалансированным

  • Как производится вставка

  • Splay-дерево

  • ответы сессия довгалюк 2 семестр. Определение Правосторонний бинарный поиск


    Скачать 3.01 Mb.
    НазваниеОпределение Правосторонний бинарный поиск
    Анкорответы сессия довгалюк 2 семестр
    Дата10.02.2022
    Размер3.01 Mb.
    Формат файлаdocx
    Имя файлаAlgoritmy.docx
    ТипДокументы
    #357616
    страница9 из 11
    1   2   3   4   5   6   7   8   9   10   11

    Красно-черные деревья: коротко и ясно



    Итак, сегодня хочу немного рассказать о красно-черных деревьях. Рассказ будет кратким, без рассмотрения алгоритмов балансировки при вставке/удалении элементов в красно-черных деревьях.


    Красно-черные деревья относятся к сбалансированным бинарным деревьям поиска.

    Как бинарное дерево, красно-черное обладает свойствами:



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

    2) Для каждого узла с ключом   выполняется критерий упорядочения:

    ключи всех левых потомков <=   < ключи всех правых потомков



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

    Свойства красно-черных деревьев:



    1) Каждый узел окрашен либо в красный, либо в черный цвет (в структуре данных узла появляется дополнительное поле – бит цвета).

    2) Корень окрашен в черный цвет.

    3) Листья(так называемые NULL-узлы) окрашены в черный цвет.

    4) Каждый красный узел должен иметь два черных дочерних узла. Нужно отметить, что у черного узла могут быть черные дочерние узлы. Красные узлы в качестве дочерних могут иметь только черные.

    5) Пути от узла к его листьям должны содержать одинаковое количество черных узлов(это черная высота).

    Ну и почему такое дерево является сбалансированным?



    Действительно, красно-черные деревья не гарантируют строгой сбалансированности (разница высот двух поддеревьев любого узла не должна превышать 1), как в АВЛ-деревьях. Но соблюдение свойств красно-черного дерева позволяет обеспечить выполнение операций вставки, удаления и выборки за время  . И сейчас посмотрим, действительно ли это так.

    Пусть у нас есть красно-черное дерево. Черная высота равна  (black height).

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

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

    То есть, пути из корня к листьям могут различаться не более, чем вдвое ( , где h — высота поддерева), этого достаточно, чтобы время выполнения операций в таком дереве было 

    Как производится вставка?



    Вставка в красно-черное дерево начинается со вставки элемента, как в обычном бинарном дереве поиска. Только здесь элементы вставляются в позиции NULL-листьев. Вставленный узел всегда окрашивается в красный цвет. Далее идет процедура проверки сохранения свойств красно-черного дерева  .

    Свойство 1 не нарушается, поскольку новому узлу сразу присваивается красный цвет.

    Свойство 2 нарушается только в том случае, если у нас было пустое дерево и первый вставленный узел (он же корень) окрашен в красный цвет. Здесь достаточно просто перекрасить корень в черный цвет.

    Свойство 3 также не нарушается, поскольку при добавлении узла он получает черные листовые NULL-узлы.

    В основном встречаются 2 других нарушения:

    1) Красный узел имеет красный дочерний узел (нарушено свойство ).

    2) Пути в дереве содержат разное количество черных узлов (нарушено свойство ).


    Splay-дерево — это самобалансирующееся бинарное дерево поиска. Дереву не нужно хранить никакой дополнительной информации, что делает его эффективным по памяти. После каждого обращения, даже поиска, splay-дерево меняет свою структуру.

    Основная эвристика splay-дерева — move-to-root. После обращения к любой вершине, она поднимается в корень. Подъем реализуется через повороты вершин. За один поворот, можно поменять местами родителя с ребенком, как показано на рисунке ниже.



    Чтобы реализовать вставку и удаление ключа, нам потребуются две процедуры: split и merge (разрезать и слить).

    Процедура split получает на вход ключ key и делит дерево на два. В одном дереве все значения меньше ключа key, а в другом — больше.

    Процедура merge получает на вход два дерева: левое left и правое right. Для корректной работы, ключи дерева left должны быть меньше ключей дерева right. Здесь мы берем вершину с наименьшим ключом правого дерева right и тянем ее вверх. После этого в качестве левого поддерева присоединяем дерево left.
    1   2   3   4   5   6   7   8   9   10   11


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