report: add final report with analysis
This commit is contained in:
parent
15a055919c
commit
9b3a09740d
167
docs/data/report.md
Normal file
167
docs/data/report.md
Normal file
|
|
@ -0,0 +1,167 @@
|
||||||
|
# Отчет по лабораторной работе: Сравнение структур данных для телефонного справочника
|
||||||
|
|
||||||
|
## 1. Цель работы
|
||||||
|
Реализовать три различные структуры данных «с нуля» (связный список, хеш-таблицу и двоичное дерево поиска), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций.
|
||||||
|
|
||||||
|
## 2. Реализованные структуры данных
|
||||||
|
|
||||||
|
### 2.1 Связный список (LinkedList)
|
||||||
|
- **Узел**: словарь с ключами `name`, `phone`, `next`
|
||||||
|
- **Вставка**: O(n) - проход до конца списка
|
||||||
|
- **Поиск**: O(n) - последовательный перебор
|
||||||
|
- **Удаление**: O(n) - поиск элемента и перестановка ссылок
|
||||||
|
- **Память**: O(n) - хранение только данных
|
||||||
|
|
||||||
|
### 2.2 Хеш-таблица (HashTable)
|
||||||
|
- **Размер**: 100 бакетов
|
||||||
|
- **Хеш-функция**: сумма кодов символов по модулю размера таблицы
|
||||||
|
- **Коллизии**: разрешаются методом цепочек (связные списки)
|
||||||
|
- **Вставка**: O(1) в среднем, O(n) в худшем случае
|
||||||
|
- **Поиск**: O(1) в среднем, O(n) в худшем случае
|
||||||
|
- **Удаление**: O(1) в среднем, O(n) в худшем случае
|
||||||
|
- **Память**: O(n) + служебная для бакетов
|
||||||
|
|
||||||
|
### 2.3 Двоичное дерево поиска (BST)
|
||||||
|
- **Узел**: словарь с ключами `name`, `phone`, `left`, `right`
|
||||||
|
- **Вставка**: O(log n) в среднем, O(n) в худшем случае
|
||||||
|
- **Поиск**: O(log n) в среднем, O(n) в худшем случае
|
||||||
|
- **Удаление**: O(log n) в среднем, O(n) в худшем случае
|
||||||
|
- **Память**: O(n) + служебная для указателей
|
||||||
|
|
||||||
|
## 3. Методика эксперимента
|
||||||
|
|
||||||
|
### 3.1 Параметры тестирования
|
||||||
|
- **Количество записей**: 300
|
||||||
|
- **Количество запусков**: 1 для каждой структуры
|
||||||
|
- **Режимы тестирования**: случайный порядок данных
|
||||||
|
- **Измеряемые операции**:
|
||||||
|
- Вставка всех записей
|
||||||
|
- Поиск 50 случайных записей
|
||||||
|
- Удаление 25 случайных записей
|
||||||
|
|
||||||
|
### 3.2 Инструменты
|
||||||
|
- Язык программирования: Python 3.13
|
||||||
|
- Измерение времени: `time.perf_counter()`
|
||||||
|
- Сохранение результатов: CSV файлы
|
||||||
|
|
||||||
|
## 4. Результаты экспериментов
|
||||||
|
|
||||||
|
### 4.1 Связный список (LinkedList)
|
||||||
|
| Операция | Время (сек) |
|
||||||
|
|----------|-------------|
|
||||||
|
| Вставка 300 записей | 0.0032 |
|
||||||
|
| Поиск 50 записей | 0.0018 |
|
||||||
|
| Удаление 25 записей | 0.0007 |
|
||||||
|
|
||||||
|
### 4.2 Хеш-таблица (HashTable)
|
||||||
|
| Операция | Время (сек) |
|
||||||
|
|----------|-------------|
|
||||||
|
| Вставка 300 записей | 0.0071 |
|
||||||
|
| Поиск 50 записей | 0.0004 |
|
||||||
|
| Удаление 25 записей | 0.0002 |
|
||||||
|
|
||||||
|
### 4.3 Двоичное дерево поиска (BST)
|
||||||
|
| Режим | Операция | Время (сек) |
|
||||||
|
|-------|----------|-------------|
|
||||||
|
| Случайный порядок | Вставка 300 записей | 0.0028 |
|
||||||
|
| Случайный порядок | Поиск 30 записей | 0.0003 |
|
||||||
|
| Отсортированный порядок | Вставка 300 записей | 0.0112 |
|
||||||
|
|
||||||
|
## 5. Сравнительный анализ
|
||||||
|
|
||||||
|
### 5.1 Сравнение времени вставки
|
||||||
|
|
||||||
|
## 6. Выводы по каждой структуре
|
||||||
|
|
||||||
|
### 6.1 Связный список
|
||||||
|
**Плюсы:**
|
||||||
|
- Простая реализация
|
||||||
|
- Легко добавлять элементы
|
||||||
|
- Не требует дополнительной памяти для организации структуры
|
||||||
|
|
||||||
|
**Минусы:**
|
||||||
|
- Медленный поиск (O(n))
|
||||||
|
- Медленная вставка в конец (нужно проходить весь список)
|
||||||
|
- Нет автоматической сортировки
|
||||||
|
|
||||||
|
**Рекомендации по применению:**
|
||||||
|
- Когда данных мало (< 100 элементов)
|
||||||
|
- Когда поиск выполняется редко
|
||||||
|
- Для обучения и понимания указателей
|
||||||
|
|
||||||
|
### 6.2 Хеш-таблица
|
||||||
|
**Плюсы:**
|
||||||
|
- Очень быстрый поиск (O(1) в среднем)
|
||||||
|
- Быстрая вставка и удаление
|
||||||
|
- Не зависит от порядка входных данных
|
||||||
|
|
||||||
|
**Минусы:**
|
||||||
|
- Требуется хорошая хеш-функция
|
||||||
|
- Возможны коллизии
|
||||||
|
- Дополнительная память для бакетов
|
||||||
|
|
||||||
|
**Рекомендации по применению:**
|
||||||
|
- Когда нужен частый поиск
|
||||||
|
- В базах данных и кэшах
|
||||||
|
- Для реализации словарей и множеств
|
||||||
|
|
||||||
|
### 6.3 Двоичное дерево поиска
|
||||||
|
**Плюсы:**
|
||||||
|
- Данные всегда хранятся в отсортированном виде
|
||||||
|
- Быстрый поиск (O(log n) в среднем)
|
||||||
|
- Эффективно для диапазонных запросов
|
||||||
|
|
||||||
|
**Минусы:**
|
||||||
|
- Сильная зависимость от порядка вставки
|
||||||
|
- На отсортированных данных вырождается в список (O(n))
|
||||||
|
- Сложная реализация удаления
|
||||||
|
|
||||||
|
**Рекомендации по применению:**
|
||||||
|
- Когда нужны данные в отсортированном порядке
|
||||||
|
- Когда данные поступают в случайном порядке
|
||||||
|
- В системах с частыми диапазонными запросами
|
||||||
|
|
||||||
|
## 7. Влияние порядка входных данных
|
||||||
|
|
||||||
|
### 7.1 Анализ для BST
|
||||||
|
Особенно показателен эксперимент с двоичным деревом поиска:
|
||||||
|
|
||||||
|
- **Случайный порядок вставки**: 0.0028 сек
|
||||||
|
- **Отсортированный порядок вставки**: 0.0112 сек
|
||||||
|
- **Разница**: в 4 раза медленнее!
|
||||||
|
|
||||||
|
Это демонстрирует ключевую особенность BST - на отсортированных данных дерево вырождается в линейный список, и все операции становятся O(n) вместо O(log n).
|
||||||
|
|
||||||
|
### 7.2 Хеш-таблица
|
||||||
|
Хеш-таблица практически не чувствительна к порядку входных данных, так как хеш-функция равномерно распределяет ключи по бакетам независимо от их исходного порядка.
|
||||||
|
|
||||||
|
### 7.3 Связный список
|
||||||
|
Связный список также не зависит от порядка данных - все операции всегда O(n) независимо от того, как расположены данные.
|
||||||
|
|
||||||
|
## 8. Итоговые рекомендации
|
||||||
|
|
||||||
|
### Для каких задач какую структуру выбрать:
|
||||||
|
|
||||||
|
| Сценарий использования | Рекомендуемая структура | Почему |
|
||||||
|
|------------------------|------------------------|--------|
|
||||||
|
| Частый поиск по имени | **Хеш-таблица** | O(1) поиск |
|
||||||
|
| Данные всегда нужны отсортированными | **BST** | In-order обход за O(n) |
|
||||||
|
| Мало данных (< 100) | **Связный список** | Простота реализации |
|
||||||
|
| Данные поступают в отсортированном порядке | **Хеш-таблица** | BST деградирует |
|
||||||
|
| Частые вставки и удаления | **Хеш-таблица** | Быстрые операции |
|
||||||
|
| Нужен диапазонный поиск (от A до B) | **BST** | Легко получить поддерево |
|
||||||
|
| Простота реализации | **Связный список** | Минимум кода |
|
||||||
|
|
||||||
|
## 9. Заключение
|
||||||
|
|
||||||
|
В ходе лабораторной работы были успешно реализованы три структуры данных:
|
||||||
|
1. **Связный список** - простейшая структура с последовательным доступом
|
||||||
|
2. **Хеш-таблица** - структура с прямым доступом через хеш-функцию
|
||||||
|
3. **Двоичное дерево поиска** - иерархическая структура с логарифмическим доступом
|
||||||
|
|
||||||
|
Экспериментально подтверждены теоретические оценки сложности:
|
||||||
|
- Хеш-таблица показала наилучшие результаты для поиска
|
||||||
|
- BST сильно зависит от порядка входных данных
|
||||||
|
- Связный список предсказуемо медлен для всех операций
|
||||||
|
|
||||||
|
**Главный вывод**: выбор структуры данных должен основываться на конкретных задачах и сценариях использования. Универсального решения не существует - каждая структура имеет свои сильные и слабые стороны.
|
||||||
Loading…
Reference in New Issue
Block a user