
Минобрнауки России
Санкт-петербургский государственный
Электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
Отчёт
Лабораторная работа №3
По дисциплине «АиСД»
Тема: деревья
Студент гр. 3316 |
|
Руденский И.М. |
Преподаватель |
|
Манирагена Валенс |
Санкт-Петербург
2024
Постановка задачи
Цель работы: исследование алгоритмов для работы с двоичным деревом.
Задание на обработку:
18 |
Двоичное |
Ширинная |
Внутренний |
Количество вершин на самом нижнем уровне |
Обоснование выбора представления в памяти:
1) Дерево строится динамически, и узлы добавляются по мере необходимости.
Не требуется заранее резервировать память для фиксированного количества элементов, это особенно важно для структур, где размер заранее неизвестен.
2) Указатели позволяют эффективно связать узлы:
Каждый узел знает о своих потомках через указатели left и right, связи между узлами интуитивны и легко поддерживаются.
3) Универсальность структуры: можно представить любые виды двоичных деревьев: двоичное дерево поиска, двоичное дерево с балансировкой, полное двоичное дерево и т.д.
4) Читаемость и модульность кода:
Разделение логики узлов и самого дерева упрощает реализацию. Логика вставки, обхода, разметки находится в классе BinaryTree, что делает её легко расширяемой.
5) Эффективное использование памяти: каждый узел хранит только свои данные и два указателя. Нет дополнительных структур, которые могли бы увеличивать накладные расходы.
Ход работы
1) Пример со случайными числами:
2) Пример со вводом с клавиатуры:
Таблица сложностей алгоритмов:
Операция |
Временная сложность |
||
Добавление узла (insert) |
O(log n) — лучший случай O(n) — худший случай |
||
Генерация дерева |
O(n log n) — лучший случай O(n^2) — худший случай |
||
Внутренний обход |
|
||
Ширинный обход |
|
||
Печать дерева |
|
||
Разметка дерева (ширинная) |
|
||
Подсчёт узлов на нижнем уровне |
|
Выводы о результатах испытания алгоритмов
В результате испытаний алгоритмы обхода деревьев показали свою эффективность для выполнения задач поиска, сортировки и обработки узлов. Внутренний обход (in-order) доказал свою полезность при работе с бинарными деревьями поиска, так как он позволяет обойти узлы в отсортированном порядке. Ширинный обход (по уровням) оказался удобен для задач визуализации и обработки узлов в порядке их удаления от корня. Алгоритмы имеют линейную временную сложность относительно числа узлов, что подтверждает их пригодность для работы с деревьями большого размера. Использование рекурсивных методов для обхода в глубину обеспечивает лаконичность кода, однако может приводить к увеличению расхода памяти при работе с глубоко вложенными деревьями.