# Отчёт по лабораторной работе ## Тема: Сравнение производительности структур данных для телефонного справочника **Студент:** Соколов Н.Е. **Дата:** 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 Основные выводы 1. **Хеш-таблица показала наилучшую производительность** для всех операций при любом порядке данных. Это делает её оптимальным выбором для реализации телефонного справочника. 2. **Связный список ожидаемо оказался самым медленным**, производительность стабильна и не зависит от порядка данных. 3. **Двоичное дерево поиска показало парадоксальные результаты:** - Рекордную скорость при случайном порядке данных - Катастрофическое падение производительности при отсортированном порядке ### 7.2 Практические рекомендации | Сценарий использования | Рекомендуемая структура | |------------------------|------------------------| | Телефонный справочник любого размера | **Хеш-таблица** | | Маленький справочник (< 100 записей) | Связный список | | Нужен постоянно отсортированный вывод | Сбалансированное дерево (AVL/красно-чёрное) | | Данные поступают в случайном порядке | Двоичное дерево поиска | | Частые операции поиска по ключу | **Хеш-таблица** | ### 7.3 Заключение Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что **хеш-таблица является наилучшим выбором для реализации телефонного справочника**, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления.