From 3b859ab2548009720befdb388493d564bb996177 Mon Sep 17 00:00:00 2001 From: Sokolov Nikita Date: Sat, 16 May 2026 18:21:03 +0300 Subject: [PATCH] =?UTF-8?q?[2]=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BE=D1=82=D1=87=D1=91=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/report.md | 168 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 docs/report.md diff --git a/docs/report.md b/docs/report.md new file mode 100644 index 0000000..88eae98 --- /dev/null +++ b/docs/report.md @@ -0,0 +1,168 @@ +# Отчёт по лабораторной работе +## Тема: Сравнение производительности структур данных для телефонного справочника + +**Студент:** Соколов Н.Е. +**Дата:** 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 Заключение + +Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что **хеш-таблица является наилучшим выбором для реализации телефонного справочника**, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления. \ No newline at end of file