МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №3
по дисциплине «Алгоритмы и структуры данных»
Тема: Реализация и исследование АВЛ-деревьев
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Гаврилов А. В. |
Санкт-Петербург
2023
Цель работы.
Реализация и тестирование АВЛ-дерева, исследование функций данной структуры на различных размерах данных, сравнение полученных результатов с теоретической оценкой.
Задание.
В предыдущих лабораторных работах вы уже проводили исследования и эта не будет исключением. Как и в прошлые разы лабораторную работу можно разделить на две части:
1) решение задач на платформе moodle
2) исследование по заданной теме
В заданиях в качестве подсказки будет изложена основная структура данных (класс узла) и будет необходимо реализовать несколько основных функций: проверка дерева (является ли оно АВЛ деревом), нахождение разницы между связными узлами, вставка узла.
В качестве исследования нужно самостоятельно:
реализовать функции удаления узлов: любого, максимального и минимального
сравнить время и количество операций, необходимых для реализованных операций, с теоретическими оценками (очевидно, что проводить исследования необходимо на разных объемах данных)
В отчете помимо проведенного исследования необходимо приложить код всей получившей структуры: класс узла и функции.
Выполнение работы.
Класс Node имеет поля val (значение узла), left (левый дочерний узел) и right (правый дочерний узел). Конструктор класса устанавливает значения этих полей.
Функция height вычисляет высоту дерева, начиная с заданного узла.
Функция check проверяет, является ли дерево сбалансированным. Для этого она сравнивает разницу между высотами левого и правого поддеревьев каждого узла и возвращает False, если эта разница больше 1.
Функция diff вычисляет минимальную разницу между значением узла и значениями его дочерних узлов. Она рекурсивно вызывает себя для левого и правого поддеревьев и сравнивает полученные значения с текущим минимальной разницей.
Функция balance вычисляет коэффициент сбалансированности узла. Коэффициент сбалансированности – это разница между высотами левого и правого поддеревьев узла.
Функция min_val_node находит пустой наименьший узел в дереве. Она итеративно спускается по левым потомкам узла, пока не достигнет наименьшего узла.
Функции right_rotate и left_rotate выполняют правый и левый повороты соответственно. Эти операции используются для балансировки дерева при вставке или удалении узлов.
Функция insert вставляет новый узел со значением val в заданное дерево. Если заданное дерево пусто, она создает новый узел с заданным значением. Она также обновляет высоты узлов и выполняет повороты, если необходимо, чтобы сохранить сбалансированность дерева.
Функция delete удаляет узел с заданным значением из заданного дерева. Если узел, который нужно удалить, имеет двух потомков, его значение заменяется на значение наименьшего узла в правом поддереве, а затем этот наименьший узел удаляется. Если у узла нет одного или обоих потомков, он просто удаляется. После удаления узла обновляются высоты узлов и выполняются необходимые повороты для сохранения сбалансированности дерева.
Функция find_node находит узел с заданным значением в дереве.
Функции find_min и find_max находят узлы с наименьшим и наибольшим значениями соответственно в дереве. Они итеративно спускаются по левым (в случае функции find_min) или правым (в случае функции find_max) потомкам до достижения наименьшего или наибольшего значения.
Функции delete_min_node и delete_max_node сначала находят минимальный узел node (в случае функции delete_min_node) или максимальный (в случае функции delete_max_node). Затем они сохраняют значение данного узла в переменную value и вызывает функцию delete для удаления узла.
Разработанный программный код см. в приложении А.
