2026-rff_mp/docs/report.md

168 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Отчёт по лабораторной работе
## Тема: Сравнение производительности структур данных для телефонного справочника
**Студент:** Соколов Н.Е.
**Дата:** 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 Заключение
Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что **хеш-таблица является наилучшим выбором для реализации телефонного справочника**, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления.