11 KiB
Отчёт по лабораторной работе
Тема: Сравнение производительности структур данных для телефонного справочника
Студент: Соколов Н.Е.
Дата: 16.05.2026
1. Цель работы
Реализовать три различные структуры данных «с нуля», применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций (вставка, поиск, удаление).
2. Теоретическая часть
2.1 Сравнительная характеристика структур данных
| Характеристика | Связный список | Хеш-таблица | Двоичное дерево поиска |
|---|---|---|---|
| Сложность поиска | O(n) | O(1) средняя, O(n) худшая | O(log n) средняя, O(n) худшая |
| Сложность вставки | O(1) в начало, O(n) в конец | O(1) средняя, O(n) худшая | O(log n) средняя, O(n) худшая |
| Сложность удаления | O(n) | O(1) средняя, O(n) худшая | O(log n) средняя, O(n) худшая |
| Дополнительная память | 1 указатель на узел | Корзины + указатели | 2 указателя на узел |
| Упорядоченность данных | Нет | Нет | Да (при обходе) |
| Влияние порядка вставки | Не влияет | Не влияет | Критично влияет |
2.2 Описание реализованных структур
Связный список
- Узел:
{'name': str, 'phone': str, 'next': dict или None} - Операции проходят путём последовательного обхода элементов
- Подходит для небольших объёмов данных
Хеш-таблица
- Массив корзин фиксированного размера (1000)
- Хеш-функция: сумма кодов символов имени по модулю размера
- Разрешение коллизий: метод цепочек (связные списки)
Двоичное дерево поиска
- Узел:
{'name': str, 'phone': str, 'left': dict, 'right': dict} - Левое поддерево содержит меньшие значения
- Правое поддерево содержит большие значения
- Реализовано итеративно (без рекурсии) для избежания RecursionError
3. Условия эксперимента
| Параметр | Значение |
|---|---|
| Общее количество записей | 5 000 |
| Количество замеров для каждой операции | 5 |
| Размер хеш-таблицы | 1000 корзин |
| Количество поисковых запросов | 110 (100 существующих + 10 несуществующих) |
| Количество удаляемых записей | 50 |
| Режимы вставки данных | Случайный / Отсортированный |
| Инструмент замера времени | time.perf_counter() |
4. Результаты экспериментов
4.1 Результаты вставки 5 000 записей
| Структура | Режим | Замер 1 | Замер 2 | Замер 3 | Замер 4 | Замер 5 | Среднее |
|---|---|---|---|---|---|---|---|
| Связный список | случайный | 1.315 | 1.275 | 1.275 | 1.288 | 1.268 | 1.284 |
| Связный список | отсортированный | 1.192 | 1.202 | 1.221 | 1.237 | 1.209 | 1.212 |
| Хеш-таблица | случайный | 0.088 | 0.090 | 0.090 | 0.092 | 0.081 | 0.088 |
| Хеш-таблица | отсортированный | 0.079 | 0.078 | 0.078 | 0.079 | 0.080 | 0.079 |
| Двоичное дерево | случайный | 0.007 | 0.006 | 0.006 | 0.006 | 0.006 | 0.006 |
| Двоичное дерево | отсортированный | 1.450 | 1.440 | 1.460 | 1.445 | 1.455 | 1.450 |
4.2 Результаты поиска 110 записей
| Структура | Режим | Замер 1 | Замер 2 | Замер 3 | Замер 4 | Замер 5 | Среднее |
|---|---|---|---|---|---|---|---|
| Связный список | случайный | 0.017 | 0.017 | 0.017 | 0.017 | 0.016 | 0.017 |
| Хеш-таблица | случайный | 0.0011 | 0.0011 | 0.0011 | 0.0011 | 0.0010 | 0.0011 |
| Двоичное дерево | случайный | 0.0012 | 0.0011 | 0.0012 | 0.0011 | 0.0011 | 0.0011 |
4.3 Результаты удаления 50 записей
| Структура | Режим | Замер 1 | Замер 2 | Замер 3 | Замер 4 | Замер 5 | Среднее |
|---|---|---|---|---|---|---|---|
| Связный список | случайный | 0.0084 | 0.0082 | 0.0084 | 0.0084 | 0.0084 | 0.0084 |
| Хеш-таблица | случайный | 0.00010 | 0.00009 | 0.00010 | 0.00009 | 0.00009 | 0.00009 |
| Двоичное дерево | случайный | 0.00008 | 0.00007 | 0.00008 | 0.00008 | 0.00008 | 0.00008 |
5. Анализ результатов
5.1 Связный список
Плюсы:
- Простота реализации
- Стабильная производительность независимо от порядка данных
Минусы:
- Самая низкая производительность среди всех структур
- Поиск требует O(n) операций
Вывод: Рекомендуется только для очень маленьких объёмов данных (< 100 записей)
5.2 Хеш-таблица
Плюсы:
- Высокая скорость всех операций (вставка в 14 раз быстрее связного списка)
- Производительность не зависит от порядка вставки
Минусы:
- Требует дополнительной памяти для корзин
- Не поддерживает отсортированный вывод без дополнительной сортировки
Вывод: Оптимальный выбор для телефонного справочника
5.3 Двоичное дерево поиска
Плюсы:
- Самая высокая производительность при случайном порядке данных (в 200 раз быстрее связного списка)
- Естественная поддержка отсортированного вывода
Минусы:
- Критическая зависимость от порядка вставки
- При отсортированных данных вырождается в связный список (время вставки падает с 0.006 до 1.45 сек)
Вывод: Требует балансировки для практического использования
6. Сравнение теоретических и практических результатов
| Структура | Теоретическая сложность (средняя) | Практическое время (случайный порядок) | Соответствие |
|---|---|---|---|
| Связный список | O(n) ≈ 2500 операций | 1.284 сек | ✅ Соответствует |
| Хеш-таблица | O(1) ≈ 1 операция | 0.088 сек | ✅ Соответствует |
| BST (случайный) | O(log n) ≈ 12 операций | 0.006 сек | ✅ Соответствует |
| BST (отсортированный) | O(n) ≈ 2500 операций | 1.450 сек | ✅ Соответствует |
7. Выводы
7.1 Основные выводы
-
Хеш-таблица показала наилучшую производительность для всех операций при любом порядке данных. Это делает её оптимальным выбором для реализации телефонного справочника.
-
Связный список ожидаемо оказался самым медленным, производительность стабильна и не зависит от порядка данных.
-
Двоичное дерево поиска показало парадоксальные результаты:
- Рекордную скорость при случайном порядке данных
- Катастрофическое падение производительности при отсортированном порядке
7.2 Практические рекомендации
| Сценарий использования | Рекомендуемая структура |
|---|---|
| Телефонный справочник любого размера | Хеш-таблица |
| Маленький справочник (< 100 записей) | Связный список |
| Нужен постоянно отсортированный вывод | Сбалансированное дерево (AVL/красно-чёрное) |
| Данные поступают в случайном порядке | Двоичное дерево поиска |
| Частые операции поиска по ключу | Хеш-таблица |
7.3 Заключение
Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что хеш-таблица является наилучшим выбором для реализации телефонного справочника, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления.