[2] добавлен отчёт
This commit is contained in:
parent
6e62599ff4
commit
3b859ab254
168
docs/report.md
Normal file
168
docs/report.md
Normal file
|
|
@ -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 Заключение
|
||||
|
||||
Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что **хеш-таблица является наилучшим выбором для реализации телефонного справочника**, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления.
|
||||
Loading…
Reference in New Issue
Block a user