Upgrade to Pro — share decks privately, control downloads, hide ads and more …

№ 6. Деревья, бинарные деревья поиска, splay-деревья

B1196c22fd3ca181eec43e1b67823d3f?s=47 ОПК
March 29, 2021

№ 6. Деревья, бинарные деревья поиска, splay-деревья

1. Структура данных дерево.
2. Представление деревьев в Python.
3. Двоичные деревья.
4. Обходы двоичных деревьев, связь обходов с древовидным представлением арифметических выражений.
5. Преобразование произвольного дерева в двоичное.
6. Интерфейс и применение деревьев поиска.
7. Высота дерева поиска.
8. Удаление элемента.
9. Оптимальные деревья поиска.
10. Выворачивание (splay trees).

B1196c22fd3ca181eec43e1b67823d3f?s=128

ОПК

March 29, 2021
Tweet

Transcript

  1. ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ Лекция № 6 
 29 марта 2021

    г.
  2. ЗНАКОМЫЕ СТРУКТУРЫ ДАННЫХ Операции в массивах и связных списках :

    • Вставка: O(N) и O(1) . • Удаление: O(N) и O(1) . • Доступ по индексу: O(1) и O(N) . • Поиск по значению: O(N) и O(N).
  3. ДАЛЕЕ: НАЙТИ ОБЩЕЕ

  4. Генеалогическое дерево

  5. Файлы и каталоги

  6. Организационная структура предприятия

  7. Дерево решений да нет Есть ли нерешенные месы? Ботать! Кодить!

  8. СТРУКТУРА ДАННЫХ: ДЕРЕВО • Состоит из элементов (узлов) . •

    Имеет корень (узел без родителя) . • Все остальные узлы, кроме корня (узлы с одним родителем), распределены по непересекающимся подмножествам — поддеревьям.
  9. ДРЕВОВЕДЕНИЕ • Корень (root) (2) . • Листья (leaf) (3,

    6, 5, 7) . • Родитель (parent) (2 для 4, 5, 7; 4 для 3; 5 для 6, 5) и потомки (children) . • Сестринские узлы (siblings) (4, 5 и 7; 6 и 5). 2 4 3 5 7 6 5
  10. ИНТЕРФЕЙС ДЕРЕВА • Вставка узла . • Удаление узла .

    • Обход дерева (посещение всех узлов) . • Переходы (от потомка к родителю, от сестринского узла к другому сестринскому и т.д.)
  11. РЕАЛИЗАЦИЯ ДЕРЕВЬЕВ Динамический массив ссылок на дочерние узлы class TreeNode:

    # parent: Optional[TreeNode] # children: List[TreeNode] # data: Any
  12. ДВОИЧНОЕ (БИНАРНОЕ) ДЕРЕВО • У каждого узла максимум два потомка:

    левый и правый . • Может быть так, что правый потомок присутствует, а левый — нет . • Допустимо пустое двоичное дерево.
  13. РЕАЛИЗАЦИЯ 
 ДВОИЧНЫХ ДЕРЕВЬЕВ Популярность двоичных деревьев 
 связана с

    удобством представления 
 и работы с ними class TreeNode: # parent: Optional[TreeNode] # left: Optional[TreeNode] # right: Optional[TreeNode] # data: Any
  14. АРИФМЕТИЧЕСКОЕ ВЫРАЖЕНИЕ 4×3+(2×7−5) + × − 4 3 × 2

    7 5
  15. ОБХОДЫ ДВОИЧНОГО ДЕРЕВА • Сверху вниз: P, L, R .

    • Слева направо: L, P, R . • Снизу вверх: L, R, P. P L R
  16. ОБХОДЫ ДЕРЕВА ВЫРАЖЕНИЯ Сверху вниз (PLR) + × 4 3

    − × 2 7 5 Слева направо (LPR) 4 × 3 + 2 × 7 − 5 Снизу вверх (LRP) 4 3 × 2 7 × 5 − + + × − 4 3 × 2 7 5 (префиксный) (инфиксный) (постфиксный)
  17. ПРЕОБРАЗОВАНИЕ ЛЮБОГО ДЕРЕВА В ДВОИЧНОЕ D E H F G

    J D E H F G J K K
  18. ДЕРЕВО ПОИСКА • BST (Binary Search Tree) . • Каждому

    узлу n сопоставлен ключ k(n) . • k(x) < k(n) для x из левого поддерева n . • k(y) > k(n) для y из правого поддерева n . • Тривиальный алгоритм поиска. 44 13 8 1 9 14 16 97 81 Рис. 10. Пример дерева поиска На рис. 10 приведен пример дерева поиска. Ра
  19. ИНТЕРФЕЙС ДЕРЕВА ПОИСКА • Поиск элемента по ключ у •

    Вставка элемента по ключ у • Удаление элемента по ключ у • Перечисление всех ключей 14 9 8 1 13 44 16 81 97 Рис. 11. Дерево поиска, эквивалентное дереву на рис 97 Поиск и вставка за O(h(N))!
  20. ВЫСОТА ДЕРЕВА ПОИСКА • Бинарное дерево высоты h содержит максимум

    2h–1 узлов . • Значит высота h(N) ≥ log(N) . • При добавлении случайных элементов h(N) ~ 2,99 log(N). 
 Средняя глубина узла ~ 1,39 log(N) . • Но в худшем случае…
  21. НЕ ВСЕ ДЕРЕВЬЯ ОДИНАКОВО ПОЛЕЗНЫ 14 9 8 1 13

    44 16 81 97 Рис. 11. Дерево поиска, эквивалентное дереву на 44 13 8 1 9 14 16 97 81 Рис. 10. Пример дерева поиска 0 приведен пример дерева поиска. Рассмотрим, как оиск. Допустим, требуется определить, присутству- в дереве. Поиск начинается с корня; 9 < 44, следо- 1 97 Рис. 11. Дерево поиска, эквивалентное дереву на рис. 10 97 81 44 16 14 13 9 8 1
  22. СЛОЖНОСТЬ ОПЕРАЦИЙ В ДЕРЕВЕ ПОИСКА НЕ ЛОГАРИФМИЧЕСКАЯ

  23. ПРИМЕНЕНИЯ ДЕРЕВА ПОИСКА • АТД Множество (set ) • АТД

    Мультимножество (multiset ) • АТД Ассоциативный массив 
 (отображение, map, словарь, dictionary)
  24. УДАЛЕНИЕ ЭЛЕМЕНТА • Если лист (нет потомков), то просто удаляе

    м • Если потомок один, он заменит удаляемый узе л • Если два потомка, то нужно найти либо самый правый узел левого поддерева, либо самый левый узел правого поддерева и поставить на место удаляемого узла
  25. УДАЛЕНИЕ ЭЛЕМЕНТА • Представленный алгоритм удаления приводит к тому, что

    высота дерева растет и становится ~ N½ . • Даже если случайным образом выбирать, с какой стороны брать новый элемент . • Есть ли способы гарантированно выполнять поиск и вставку за O(log(N))?
  26. РЕШЕНИЯ ПРОБЛЕМЫ «КРИВЫХ» ДЕРЕВЬЕВ • Восстановление оптимальности : • «Выворачивание»

    (splay trees), • АВЛ-деревья , • Красно-черные деревья. 1 97 Рис. 11. Дерево поиска, эквивалентное дереву на ри 97 81 44 16 14 13 9 8 1
  27. SPLAY TREES • Обычное дерево поиска, но после каждого поиска

    найденный элемент помещается в вершину . • При удалении предок удаленного элемента помещается в вершину . • Помещение в вершину происходит пошагово («всплытие») . • «Средняя» сложность операций – O(log(N)).
  28. ПОВОРОТ «ЗИГ-ЗИГ» p d x c g a b Зиг-Зиг

    a p b g x c d
  29. ПОВОРОТ «ЗИГ-ЗАГ» p d x a g b c Зиг-Заг

    p g b a x d c
  30. ПОВОРОТ «ЗИГ» x c a b p p a b

    c x Зиг Последний шаг, если элемент X изначально 
 на четном уровне.
  31. ПРИМЕР «ВСПЛЫТИЯ» 2 1 4 3 5 0 7 6

    Зиг-Заг 2 1 4 3 6 0 7 5 6 7 4 5 2 3 1 0 Зиг-Зиг
  32. КОНЕЦ ШЕСТОЙ ЛЕКЦИИ Каждый программист в своей жизни должен …,

    … и реализовать модуль работы с деревом