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

Программирование – 1 курс осень 2021 – 10 занятие

ТиМПИ
November 26, 2021

Программирование – 1 курс осень 2021 – 10 занятие

ТиМПИ

November 26, 2021
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 3/41 Структуры данных: сложность Поиск Поиск по индексу Вставка /

    Удаление Начало Середина Конец Связный список O(n) O(n) O(1) O(1) + поиск по индексу O(1) | O(n) Массив O(n) O(1) 一 一 一 Динамический массив O(n) O(1) O(n) O(n) O(1)
  2. 5/41 • Важен быстрый поиск объектов ◦ Реализация типа данных

    “Множество”, “Словарь” (set и map) • Управление иерархией данных ◦ Хранение структуры каталогов • Синтаксический разбор выражений ◦ Арифметические выражения ◦ Анализ кода Область применения деревьев
  3. 6/41 • N-арное дерево • Сбалансированное дерево • Двоичное дерево

    • Двоичное дерево поиска • АВЛ-дерево • Красно-чёрное дерево • 2—3 дерево • Куча • Двоичная куча = пирамида = сортирующее дерево Примеры деревьев
  4. 7/41 Двоичное дерево (поиска) Двоичное дерево, где для каждого узла:

    • В левом поддереве все значения меньше, чем значения в узле • В правом поддереве – больше
  5. 9/41 Двоичное дерево в виде массива • A[0] – корневой

    элемент • Для A[i] потомками являются A[2i+1] и A[2i+2]
  6. 18/41 Находим вершину, которую хотим удалить a. У вершины нет

    детей – удаляем узел и обнуляем ссылку у родительского узла b. Если есть один ребенок – ставим ребенка на место текущей вершины c. Есть оба ребенка i. Если нет левого узла правого поддерева – копируем данные из правого узла в удаляемый и создаем ссылку на правый узел правого ребенка. ii. Иначе 1. Выберем самый левый узел L правого поддерева 2. Копируем данные из этого узла в удаляемый 3. Удалим L Удаление элемента: алгоритм
  7. 20/41 У узла есть два ребенка, но нет левого узла

    правого поддерева Удаление элемента: пример 2
  8. 21/41 У узла есть оба ребенка, и есть левый узел

    правого поддерева Удаление элемента: пример 3
  9. 22/41 • В среднем имеем сложность O(log(n)) для всех трех

    операций • Однако в случае вырожденного дерева сложность операций будет равна O(n) Асимптотика работы с двоичным деревом
  10. 28/41 Самобалансирующиеся деревья • Может появиться экстремально несбалансированное бинарное дерево

    поиска • Что тогда делать? Применять самобалансирующиеся деревья! Сбалансированное бинарное дерево поиска — бинарное дерево поиска с логарифмической высотой. Примеры: ◦ АВЛ-дерево ◦ Красно-чёрное дерево ◦ 2-3 дерево
  11. 29/41 • Сбалансированное двоичное дерево поиска • Критерий сбалансированности: высоты

    левого и правого поддеревьев любого узла различаются не более чем на единицу • Показатель сбалансированности узла — высота правого поддерева минус высота левого поддерева • Максимальная высота АВЛ-дерево
  12. 35/41 Вставка почти такая же, как и в ДДП: 1.

    Спускаемся по дереву, выбирая левое или правое направление и вставляем значение 2. При возвращении из рекурсии выполняем балансировку для текущего узла АВЛ-дерево: вставка элемента
  13. 37/41 1. Удаление элемента в двоичном дереве. 2. Вычисление высоты

    дерева. 3. Реализовать обходы бинарного дерева в глубину (DFS): a. прямой обход; b. обратный обход; c. центрированный обход. 4. Реализовать обход дерева в ширину (BFS). 5. Алгоритм Прима. 6. Алгоритм Краскала. 7. Реализация АВЛ-дерева. 8. (для присутствовавших на практике) задача про башню и охранников из контеста Яндекса Практические задания (до 03.12.2021)
  14. 38/41 Домашнее задания (до 10.12.2021) компилятор Напишите функцию, которая проверяет

    является ли дерево бинарным и если является, то проверить, является ли оно и двоичным деревом поиска. Вход: в качестве аргумента функции передается указатель на корень дерева. Выход: • -1 – если дерево НЕ двоичное. • 0 – если произвольное двоичное дерево. • 1 – если двоичное дерево поиска. ЛЕГКО
  15. 39/41 Домашнее задания (до 10.12.2021) компилятор Напишите функцию swapNodes, которая

    меняет две вершины в дереве с произвольным числом сыновей. Вход: в качестве аргумента функции передаются указатель на корень дерева, и глубины узлов в дереве (у корня глубина = 0, у его детей = 1 и т.д.) и порядковые их номера на уровне залегания (т.е. среди всех узлов глубины). Выход: вывести в консоль изначальную структуру дерева, порядок обхода дерева и поиска узлов и результат перестановки узлов в дереве. СРЕДНЕ
  16. 40/41 Домашнее задания (до 10.12.2021) компилятор Написать программу, реализующую алгоритм

    Борувки (по поиску минимального остовного дерева во взвешенном неориентированном связном графе) . Вход: указатель на первый элемент графа. Выход: вывести в консоль структуру полученного дерева. СЛОЖНО