# Отчёт: Задание 1 — Структуры данных ## Цель работы Реализовать три структуры данных «с нуля» в процедурной парадигме (без классов), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций. ## Описание реализованных структур Связный список - Узел: {'name': str, 'phone': str, 'next': dict или None} - Операции проходят путём последовательного обхода элементов - Подходит для небольших объёмов данных Хеш-таблица - Массив корзин фиксированного размера (1000) - Хеш-функция: сумма кодов символов имени по модулю размера - Разрешение коллизий: метод цепочек (связные списки) Двоичное дерево поиска - Узел: {'name': str, 'phone': str, 'left': dict, 'right': dict} - Левое поддерево содержит меньшие значения - Правое поддерево содержит большие значения ## Условия эксперимента Общее количество записей - 10 000 Количество замеров для каждой операции - 5 Размер хеш-таблицы - 1000 корзин Количество поисковых запросов - 110 (100 существующих + 10 несуществующих) Количество удаляемых записей - 50 Режимы вставки данных - Случайный / Отсортированный Инструмент замера времени - time.perf_counter() ## Результаты ### Таблица средних времён (секунды) | Структура | Режим | Вставка (с) | Поиск 110 (с) | Удаление 50 (с) | |---|---|---|---|---| | LinkedList | случайный | 12.32399 | 0.1279214 | 0.053208 | | LinkedList | сортированный | 11.701628 | 0.0989321 | 0.052782 | | HashTable | случайный | 0.7027289 | 0.0056565 | 0.0036097 | | HashTable | сортированный | 0.5376899 | 0.0047595 | 0.003316 | | BST | случайный | 0.08628449 | 0.000474 | 0.1715181 | | BST | сортированный | 33.374929 | 0.1351418 | 0.1574643 | ### Графики ![Сравнение по операциям](data/perfomance_graphs.png) ## Анализ результатов ### Связный список Вставка в список занимает ~2.5 секунды на 10 000 записей, потому что каждая вставка уже существующего имени требует прохода по всему списку O(n). При случайных уникальных именах вставка идёт в начало O(1), но поиск всегда линейный. ### Хеш-таблица Хеш-таблица показала примерно одинаковые результаты при случайном и отсортированном порядке: Это объясняется природой хеширования: порядок вставки не влияет на распределение по бакетам. Ключ всегда попадает в предсказуемый бакет за O(1). ### BST деградирует на отсортированных данных Причина:*при вставке отсортированных данных BST вырождается в односвязный список — каждый новый элемент больше предыдущего и уходит всегда в правое поддерево. Высота дерева становится O(n) вместо O(log n). Поиск и удаление тоже деградируют до O(n). ## Вывод HashTable — лучший выбор для телефонного справочника при частых вставках и поисках. BST лучше HashTable только если нужен отсортированный вывод без дополнительной сортировки — но при условии случайного порядка вставки или использования самобалансирующегося дерева (AVL, Red-Black).