Скачать презентацию 4. Красно-черные деревья   4. 1. Красно-черные Скачать презентацию 4. Красно-черные деревья 4. 1. Красно-черные

4 RB-деревья .ppt

  • Количество слайдов: 89

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

 4. 1. Красно-черные деревья Бинарное дерево поиска с дополнительным полем цвета в узле 4. 1. Красно-черные деревья Бинарное дерево поиска с дополнительным полем цвета в узле struct Node { int color; int key; struct Node *left, *right; struct Node *parent; }; 2

 4. 1. Красно-черные деревья Значения NULL рассматриваются как указатели на внешние узлы (листья) 4. 1. Красно-черные деревья Значения NULL рассматриваются как указатели на внешние узлы (листья) – EList бинарного дерева поиска Двоичное Красно-черное дерево . . . EList . . . 3

 4. 1. Красно-черные деревья Красно-черное бинарное дерево поиска удовлетворяет следующим свойствам: 1. Каждый 4. 1. Красно-черные деревья Красно-черное бинарное дерево поиска удовлетворяет следующим свойствам: 1. Каждый узел является красным или черным 2. Корень дерева является черным 3. Каждый лист дерева (EList) является черным 4. Если узел – красный, то оба его дочерних узла – черные 4

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

 4. 1. Красно-черные деревья Количество черных узлов на пути от узла x (не 4. 1. Красно-черные деревья Количество черных узлов на пути от узла x (не считая сам узел) к листу называется черной высотой листа – bh(x) Черной высотой дерева является черная высота его корня 6

4. 2. Пример красно-черного дерева 2 41 2 30 1 47 1 28 1 4. 2. Пример красно-черного дерева 2 41 2 30 1 47 1 28 1 38 EList 35 1 39 1 EList EList 7

4. 3. Представление красно- черного дерева 41 30 47 28 35 39 8 Elist 4. 3. Представление красно- черного дерева 41 30 47 28 35 39 8 Elist

 4. 3. Представление красно- черного дерева 2 41 2 30 1 47 1 4. 3. Представление красно- черного дерева 2 41 2 30 1 47 1 28 1 38 35 1 39 1 9

 4. 4. Характеристики красно- черного дерева Лемма Красно-черное дерево с n внутренними узлами 4. 4. Характеристики красно- черного дерева Лемма Красно-черное дерево с n внутренними узлами имеет высоту h не более чем 2 lg (n + 1) Доказательство Следствие: Время поиска – O(lg(n)) 10

 4. 5. Повороты Локальные операции в дереве поиска, сохраняющие его свойства x Левый 4. 5. Повороты Локальные операции в дереве поиска, сохраняющие его свойства x Левый поворот – left_rotate(x) y A B Правый поворот – right_rotate(y) y x B A 11

 4. 6. Левый поворот p A A' x y B C' y x 4. 6. Левый поворот p A A' x y B C' y x C B' 12

 4. 6. Левый поворот 1. Для узла x: а) переустанавливается правое поддерево б) 4. 6. Левый поворот 1. Для узла x: а) переустанавливается правое поддерево б) переустанавливается родительский узел 13

 4. 6. Левый поворот 2. Для узла y: а) переустанавливается левое поддерево б) 4. 6. Левый поворот 2. Для узла y: а) переустанавливается левое поддерево б) переустанавливается родительский узел 14

 4. 6. Левый поворот 3. Для узла p: переустанавливается левое (или правое) поддерево 4. 6. Левый поворот 3. Для узла p: переустанавливается левое (или правое) поддерево 4. Для левого поддерева узла y: переустанавливается родительский узел 15

 4. 7. Алгоритм Left_rotate(x) x – заданный узел y = x->right – правое 4. 7. Алгоритм Left_rotate(x) x – заданный узел y = x->right – правое поддерево узла x Переустановить правое поддерево x (1 a): x->right = y->left Переустановить родительский узел левого поддерева y (если он есть) (4): if y->left ≠ EList y->left->parent = x 16

 4. 7. Алгоритм Left_rotate(x) Переустановить родительский узел y (2 б): y->parent = x->parent 4. 7. Алгоритм Left_rotate(x) Переустановить родительский узел y (2 б): y->parent = x->parent Возможно, x был корнем дерева: if x->parent = EList root = y – новый корень дерева else { 17

 4. 7. Алгоритм Left_rotate(x) Переустановить левое или правое поддерево родительского узла x (3): 4. 7. Алгоритм Left_rotate(x) Переустановить левое или правое поддерево родительского узла x (3): if x->parent->left = x x->parent->left = y else x->parent->right = y } 18

 4. 7. Алгоритм Left_rotate(x) Переустановить левое поддерево y (2 a): y->left = x 4. 7. Алгоритм Left_rotate(x) Переустановить левое поддерево y (2 a): y->left = x Переустановить родительский узел для x (1 б): x->parent = y Время выполнения – Ο(1) 19

4. 8. Вставка в красно-черное дерево Алгоритм RB_Insert(x): 1. Вставить узел x как в 4. 8. Вставка в красно-черное дерево Алгоритм RB_Insert(x): 1. Вставить узел x как в обычное бинарное дерево поиска 2. Полям left и right нового узла присвоить значение указателя на узлы-листы 3. Окрасить новый узел в красный цвет 4. Перекрасить узлы и выполнить повороты 20

 4. 9. Алгоритм RB_Insert(x) prev = EList – родительский узел ptr = root 4. 9. Алгоритм RB_Insert(x) prev = EList – родительский узел ptr = root – текущий узел while дерево не пусто: ptr ≠ EList { prev = ptr – родительский узел if x->key < ptr->key – выбор поддерева ptr = ptr->left – левое поддерево else ptr = ptr->right– правое поддерево } 21

 4. 9. Алгоритм RB_Insert(x) x->parent = prev – родительский узел if вставка в 4. 9. Алгоритм RB_Insert(x) x->parent = prev – родительский узел if вставка в пустое дерево: prev = EList root = x – новый корень дерева else выбрать поддерево: if x->key < prev->key вставить в левое поддерево: prev->left = x else вставить в правое поддерево: prev->right = x 22

 4. 9. Алгоритм RB_Insert(x) Установить поля left и right нового узла дерева: x->left 4. 9. Алгоритм RB_Insert(x) Установить поля left и right нового узла дерева: x->left = EList x->right = EList Покрасить узел: x->color = RED Выполнить перекраску узлов и повороты дерева: RB_Insert_Fixup(x) 23

 4. 10. Нарушение свойств дерева при вставке 1. Каждый узел является красным или 4. 10. Нарушение свойств дерева при вставке 1. Каждый узел является красным или черным не нарушается 2. Корень дерева является черным может быть нарушено 3. Каждый лист дерева является черным не нарушается 24

 4. 10. Нарушение свойств дерева при вставке 4. Если узел – красный, то 4. 10. Нарушение свойств дерева при вставке 4. Если узел – красный, то оба его дочерних узла – черные может быть нарушено 5. Для каждого узла все пути от него до листьев, являющихся потомками данного узла, содержат одно и то же количество черных узлов не нарушается 25

 4. 11. Примеры вставки 2 41 2 30 1 47 1 28 1 4. 11. Примеры вставки 2 41 2 30 1 47 1 28 1 38 35 1 39 1 25 Новый элемент 25 40 Новый элемент 40 26

 4. 12. Восстановление свойств дерева pp Новый узел – x A p 1 4. 12. Восстановление свойств дерева pp Новый узел – x A p 1 = x->parent p 2 узел p 1 – красный B p 1 C pp = p 1 ->parent – черный x D p 2 = pp->right (или p 2 = pp->left) 27

 4. 13. Случай 1 Узел p 2 – красный Узел pp – черный 4. 13. Случай 1 Узел p 2 – красный Узел pp – черный Узлы , , – черные Коррекция: перекрасить узлы p 1 и p 2 в черный цвет, pp – в красный Переустановить узел x Продолжить коррекцию дерева 28

4. 13. Случай 1 pp A p 2 B p 1 C x D 4. 13. Случай 1 pp A p 2 B p 1 C x D 29

 4. 13. Случай 1 pp x pp A p 2 B p 1 4. 13. Случай 1 pp x pp A p 2 B p 1 C x D 30

 4. 13. Случай 1 pp x pp A p 2 B p 1 4. 13. Случай 1 pp x pp A p 2 B p 1 C B p 1 C x D 31

 4. 14. Вставка узла 40 2 41 2 30 1 47 1 28 4. 14. Вставка узла 40 2 41 2 30 1 47 1 28 1 38 35 1 39 1 25 40 Новый элемент 32

 4. 14. Вставка узла 40 2 41 2 30 2 47 Нарушение свойства 4. 14. Вставка узла 40 2 41 2 30 2 47 Нарушение свойства дерева 1 28 1 38 35 1 39 1 25 40 Новый элемент 33

 4. 15. Случай 2 Узел p 2 – черный Узел x – в 4. 15. Случай 2 Узел p 2 – черный Узел x – в правом поддереве узла p 1 Узел pp – черный Узлы , , – черные Коррекция: шаг 1 – левый поворот вокруг узла p 1 Переходим к случаю 3 34

 4. 15. Случай 2 pp A p 2 B p 1 C D 4. 15. Случай 2 pp A p 2 B p 1 C D p 1 C x B x D 35

4. 16. Вставка узла 40 (продолжение) 2 41 2 30 1 Левый поворот 47 4. 16. Вставка узла 40 (продолжение) 2 41 2 30 1 Левый поворот 47 1 28 1 38 35 1 39 1 25 40 36

4. 16. Вставка узла 40 (продолжение) Нарушение свойства дерева 2 41 38 2 1 4. 16. Вставка узла 40 (продолжение) Нарушение свойства дерева 2 41 38 2 1 47 30 1 39 1 1 28 35 1 40 25 37

 4. 17. Случай 3 Узел p 2 – черный Узел x – в 4. 17. Случай 3 Узел p 2 – черный Узел x – в левом поддереве узла p 1 Узел pp – черный Узлы , , – черные Коррекция: шаг 1 – перекрасить узел p 1 в черный цвет, узел pp – в красный цвет шаг 2 – правый поворот вокруг узла pp 38

 4. 17. Случай 3 pp а) перекраска pp A p 2 D p 4. 17. Случай 3 pp а) перекраска pp A p 2 D p 1 C D p 1 C x B 39

 4. 17. Случай 3 б) правый поворот pp D p 1 A x 4. 17. Случай 3 б) правый поворот pp D p 1 A x pp p 2 B A D p 1 C x p 2 B C 40

4. 18. Вставка узла 40 (продолжение) Перекрашивание 2 3 ? ? ? 41 38 4. 18. Вставка узла 40 (продолжение) Перекрашивание 2 3 ? ? ? 41 38 1 2 1 47 30 1 39 1 1 28 35 1 40 25 41

4. 18. Вставка узла 40 (продолжение) Правый поворот 2 3 ? ? ? 41 4. 18. Вставка узла 40 (продолжение) Правый поворот 2 3 ? ? ? 41 38 2 1 47 30 1 39 1 1 28 35 1 40 25 42

4. 18. Вставка узла 40 (продолжение) 38 2 30 1 41 1 28 35 4. 18. Вставка узла 40 (продолжение) 38 2 30 1 41 1 28 35 1 39 1 47 25 40 43

4. 19. Алгоритм RB_Insert_Fixup(x) x – вставленный узел while родительский узел для x – 4. 19. Алгоритм RB_Insert_Fixup(x) x – вставленный узел while родительский узел для x – красный (x->parent = RED) { p 1 = x->parent – родительский узел x pp = p 1 ->parent – родительский узел p 1 if p 1 = pp->left { #1 – начало Узел вставляется в левое поддерево p 2 = pp->right 44

4. 19. Алгоритм RB_Insert_Fixup(x) if p 2 ->color = RED { случай 1: перекрасить 4. 19. Алгоритм RB_Insert_Fixup(x) if p 2 ->color = RED { случай 1: перекрасить вершины: p 1 ->color = BLACK p 2 ->color = BLACK pp->color = RED x = pp } 45

4. 19. Алгоритм RB_Insert_Fixup(x) else { if x в правом поддереве p 1 (x 4. 19. Алгоритм RB_Insert_Fixup(x) else { if x в правом поддереве p 1 (x = p 1 ->right) { случай 2: x = p 1 левый поворот: left_rotate(x) p 1 = x->parent } 46

4. 19. Алгоритм RB_Insert_Fixup(x) Случай 3: перекрасить вершины: p 1 ->color = BLACK pp->color 4. 19. Алгоритм RB_Insert_Fixup(x) Случай 3: перекрасить вершины: p 1 ->color = BLACK pp->color = RED правый поворот: Right_rotate(pp) } } #1 – конец 47

4. 19. Алгоритм RB_Insert_Fixup(x) else { узел вставляется в правое поддерево: повторить коды от 4. 19. Алгоритм RB_Insert_Fixup(x) else { узел вставляется в правое поддерево: повторить коды от #1 – начало до #1 – конец, заменив в них left на right, и наоборот } } – конец цикла root->color = BLACK 48

 4. 20. Анализ эффективности Вставка в красно-черное дерево = • вставка в двоичное 4. 20. Анализ эффективности Вставка в красно-черное дерево = • вставка в двоичное дерево – О(h) • Коррекция красно-черного дерева Коррекция: итерации – для случая 1 – O(h) для случаев 2 и 3 – максимум два поворота h 2 lg(n + 1), вставка – O(lg(n)) 49

 4. 21. Удаление • Удалить узел как в бинарном дереве поиска; учесть представление 4. 21. Удаление • Удалить узел как в бинарном дереве поиска; учесть представление листьев • Восстановить красно-черные свойства дерева x – удаляемый узел дерева 50

 4. 22. Алгоритм RB_Delete(x) if x->left = Elist или x->right = Elist y=x 4. 22. Алгоритм RB_Delete(x) if x->left = Elist или x->right = Elist y=x else y = successor(x) if y->left ≠ Elist p = y->left else p = y->right 51

 4. 22. Алгоритм RB_Delete(x) p->parent = y->parent --- отличается! if y->parent = EList 4. 22. Алгоритм RB_Delete(x) p->parent = y->parent --- отличается! if y->parent = EList root = p else if y->parent->left = y y->parent->left = p else y->parent->right = p 52

 4. 22. Алгоритм RB_Delete(x) if y ≠ x { x->key = y->key копирование 4. 22. Алгоритм RB_Delete(x) if y ≠ x { x->key = y->key копирование сопутствующих данных } if y->color = BLACK RB_Delete_Fixup(p) Успех 53

 4. 23. Нарушение свойств дерева при удалении Если удаляется красный узел: • никакая 4. 23. Нарушение свойств дерева при удалении Если удаляется красный узел: • никакая черная высота в дереве не изменяется • никакие красные узлы не становятся соседними • корень остается черным 54

 4. 23. Нарушение свойств дерева при удалении Если удаляется черный узел: 1. Каждый 4. 23. Нарушение свойств дерева при удалении Если удаляется черный узел: 1. Каждый узел является красным или черным не нарушается 2. Корень дерева является черным может быть нарушено 3. Каждый лист дерева является черным не нарушается 55

 4. 23. Нарушение свойств дерева при удалении 4. Если узел – красный, то 4. 23. Нарушение свойств дерева при удалении 4. Если узел – красный, то оба его дочерних узла – черные может быть нарушено 5. Для каждого узла все пути от него до листьев, являющихся потомками данного узла, содержат одно и то же количество черных узлов нарушается!!! 56

 4. 24. Примеры удаления 2 41 1 2 30 1 47 1 28 4. 24. Примеры удаления 2 41 1 2 30 1 47 1 28 1 49 1 38 39 + черный 35 1 39 1 + черный Удаляемый элемент 57

 4. 24. Примеры удаления удаляемый узел + черный bh = 1 EList 58 4. 24. Примеры удаления удаляемый узел + черный bh = 1 EList 58

 4. 24. Примеры удаления удаляемый узел + черный bh = 1 EList 59 4. 24. Примеры удаления удаляемый узел + черный bh = 1 EList 59

 4. 25. Восстановление черной высоты вершины У потомка – дополнительная чернота: – «дважды 4. 25. Восстановление черной высоты вершины У потомка – дополнительная чернота: – «дважды черный» (атрибут color узла имеет значение BLACK) – «красно-черный» (атрибут color узла имеет значение RED): • восстанавливается свойство 5 • нарушается свойство 1 – значение атрибута color узла не соответствует цвету узла 60

4. 26. Восстановление цвета узла Переместить дополнительную черноту вверх по дереву: 1. Узел является 4. 26. Восстановление цвета узла Переместить дополнительную черноту вверх по дереву: 1. Узел является красно-черным – сделать данный узел «единожды черным» 2. Узел является корнем дерева – убрать излишнюю черноту 3. Выполнить повороты и перекраску, устраняющие двойную черноту 61

4. 26. Восстановление цвета узла Обозначения: x – анализируемый узел дерева p = x->parent 4. 26. Восстановление цвета узла Обозначения: x – анализируемый узел дерева p = x->parent – родительский узел Пусть x = p->left p w = p->right – второй потомок узла p x w x – дважды черный узел w ≠ EList 62

4. 26. Восстановление цвета узла начало Продолжать итерации нет w – красный да нет 4. 26. Восстановление цвета узла начало Продолжать итерации нет w – красный да нет да нет да x – в левом правый поддереве потомок w – черный Случай 1 конец нет у w оба потомка черные да Случай 3 Случай 2 Случай 4 63

 4. 27. Случай 1 p Узел w – красный Потомки w – черные 4. 27. Случай 1 p Узел w – красный Потомки w – черные x w Узел p – черный 1. Обменять цвета w и p 2. Выполнить левый поворот вокруг узла p Получим случаи 2, 3 или 4 64

 4. 27. Случай 1 180 Шаг 1 Удаляемый элемент ? p 150 2 4. 27. Случай 1 180 Шаг 1 Удаляемый элемент ? p 150 2 . . . 130 1 w 161 2 x 0+1 154 1 173 1 EList 65

 4. 27. Случай 1 Шаг 2 180 p 150 ? . . . 4. 27. Случай 1 Шаг 2 180 p 150 ? . . . w 161 2 x 0+1 154 1 173 1 EList 66

 4. 27. Случай 1 2 180 161 . . . p 150 2 4. 27. Случай 1 2 180 161 . . . p 150 2 x 0+1 w 154 1 173 1 EList 67

 4. 28. Случай 2 + черный p Узел w черный оба его потомка 4. 28. Случай 2 + черный p Узел w черный оба его потомка – черные x w Шаг 1 – забрать черную окраску у x (станет единожды черным) и w (станет красным) Шаг 2 – добавить дополнительный черный цвет узлу p Шаг 3 – переустановить узел x, продолжить коррекцию дерева 68

 4. 28. Случай 2 2 89 61 . . . p 45 2 4. 28. Случай 2 2 89 61 . . . p 45 2 x 0+1 w 54 1 73 1 EList 69

 4. 28. Случай 2 Шаг 2 2 89 61 . . . Шаг 4. 28. Случай 2 Шаг 2 2 89 61 . . . Шаг 1 p 45 1 + черный 2 Шаг 3 x 0 0+1 w 54 1 73 1 EList 70

 4. 28. Случай 2 89 61 . . . 45 1 0 54 4. 28. Случай 2 89 61 . . . 45 1 0 54 1 73 1 EList 71

 4. 28. Случай 2 Удаляемый элемент 89 45 3 . . . p 4. 28. Случай 2 Удаляемый элемент 89 45 3 . . . p 37 2 + черный 1 2 61 24 1 w 42 1 54 2 73 1 x 0 0+1 50 1 57 1 EList 72

 4. 29. Случай 3 p Узел w – черный, его левый дочерний x 4. 29. Случай 3 p Узел w – черный, его левый дочерний x w узел – красный, правый – черный Шаг 1 – обменять цвета w и w->left Шаг 2 – выполнить правый поворот вокруг w Получим случай 4 73

 4. 29. Случай 3 89 p 45 3 . . . x 37 4. 29. Случай 3 89 p 45 3 . . . x 37 1 + черный 2 w 61 42 1 54 2 73 1 50 1 57 1 74

 4. 29. Случай 3 89 p 45 3 . . . x 37 4. 29. Случай 3 89 p 45 3 . . . x 37 1 + черный 2 шаг 1 w 61 42 1 54 2 73 1 50 1 57 1 75

 4. 29. Случай 3 89 p 45 3 . . . x 37 4. 29. Случай 3 89 p 45 3 . . . x 37 1 + черный ? шаг 2 w 61 42 1 54 2 73 1 50 1 57 1 76

 4. 29. Случай 3 89 p 45 3 . . . x 37 4. 29. Случай 3 89 p 45 3 . . . x 37 1 + черный 54 2 42 1 50 1 w 61 2 57 1 73 1 77

 4. 30. Случай 4 p Узел w – черный, его правый дочерний x 4. 30. Случай 4 p Узел w – черный, его правый дочерний x w узел – красный Шаг 1 – обменять цвета у узлов w, p и правого дочернего узла w Шаг 2 – левый поворот вокруг узла p Шаг 3 – отнять черный цвет у узла x 78

 4. 30. Случай 4 89 p 45 3 . . . x 37 4. 30. Случай 4 89 p 45 3 . . . x 37 1 + черный w 54 2 42 1 50 1 61 2 57 1 73 1 79

 4. 30. Случай 4 89 p 45 3 . . . Шаг 1 4. 30. Случай 4 89 p 45 3 . . . Шаг 1 x 37 1 + черный w 54 2 42 1 50 1 61 2 57 1 73 1 80

 4. 30. Случай 4 Шаг 2 89 p 45 ? . . . 4. 30. Случай 4 Шаг 2 89 p 45 ? . . . x 37 1 + черный w 54 ? 42 1 50 1 61 2 57 1 73 1 81

 4. 30. Случай 4 89 2 ? w 54 . . . Шаг 4. 30. Случай 4 89 2 ? w 54 . . . Шаг 3 p 45 ? 2 61 2 x 37 1 + черный 50 1 57 1 73 1 42 1 82

 4. 31. RB_Delete_Fixup(x) Обозначения: x – анализируемый узел дерева p = x->parent – 4. 31. RB_Delete_Fixup(x) Обозначения: x – анализируемый узел дерева p = x->parent – родительский узел w = p->right (или p->left) – второй потомок узла p x – дважды черный узел 83

 4. 31. RB_Delete_Fixup(x) while продолжать итерации: x ≠ root и x->color == BLACK 4. 31. RB_Delete_Fixup(x) while продолжать итерации: x ≠ root и x->color == BLACK { проверка, в каком поддереве лежит x: p = x->parent if х – в левом поддереве: x == p->left { # 1 – начало w = p->right анализ возможных ситуаций 84

 4. 31. RB_Delete_Fixup(x) if w – красый: w->color == RED { – случай 4. 31. RB_Delete_Fixup(x) if w – красый: w->color == RED { – случай 1 поменять цвета у w и p: w->color = BLACK p->color = RED выполнить левый поворот вокруг p: Left_Rotate(p) w = p->right } 85

 4. 31. RB_Delete_Fixup(x) if у w оба потомка черные: w->left->color == BLACK и 4. 31. RB_Delete_Fixup(x) if у w оба потомка черные: w->left->color == BLACK и w->right->color == BLACK { – случай 2 забрать черную окраску у w: w->color = RED переместиться вверх по дереву: x=p } 86

4. 31. RB_Delete_Fixup(x) else { if правый потомок w черный: w->right->color == BLACK { 4. 31. RB_Delete_Fixup(x) else { if правый потомок w черный: w->right->color == BLACK { – случай 3 поменять цвета у w и w->left: w->color = RED w->left->color = BLACK правый поворот вокруг w: Right_Rotate(w) w = p->right } 87

 4. 31. RB_Delete_Fixup(x) – случай 4 поменять цвета: w->color = p->color = BLACK 4. 31. RB_Delete_Fixup(x) – случай 4 поменять цвета: w->color = p->color = BLACK w->right->color = BLACK левый поворот вокруг узла p Left_Rotate(p) x = root } } # 1 – конец 88

 4. 31. RB_Delete_Fixup(x) else { повторить коды между #1 – начало и #1 4. 31. RB_Delete_Fixup(x) else { повторить коды между #1 – начало и #1 – конец, заменив left на right, и наоборот } } x->color = BLACK 89