4.6 KiB
Отчёт: Задание 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 |
Графики
Анализ результатов
Связный список
Вставка в список занимает ~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).
