forked from UNN/2026-rff_mp
86 lines
5.5 KiB
Markdown
86 lines
5.5 KiB
Markdown
|
|
# Отчёт по лабораторной работе
|
|||
|
|
|
|||
|
|
## Цель работы
|
|||
|
|
|
|||
|
|
Реализовать три структуры данных «с нуля» (связный список, хеш-таблица, двоичное дерево поиска), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций.
|
|||
|
|
|
|||
|
|
## Параметры эксперимента
|
|||
|
|
|
|||
|
|
- Количество записей: 10000
|
|||
|
|
- Количество повторов каждого теста: 5
|
|||
|
|
- Размер хеш-таблицы: 1000 корзин
|
|||
|
|
|
|||
|
|
## Результаты экспериментов
|
|||
|
|
|
|||
|
|
### 1. Связный список
|
|||
|
|
|
|||
|
|
| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) |
|
|||
|
|
|-------|---------------|-------------|----------------|
|
|||
|
|
| Случайный | 6.2254 | 0.0446 | 0.0286 |
|
|||
|
|
| Отсортированный | 5.9099 | 0.0058 | 0.0006 |
|
|||
|
|
|
|||
|
|
### 2. Хеш-таблица
|
|||
|
|
|
|||
|
|
| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) |
|
|||
|
|
|-------|---------------|-------------|----------------|
|
|||
|
|
| Случайный | 0.4748 | 0.0014 | 0.0006 |
|
|||
|
|
| Отсортированный | 0.3728 | 0.0002 | 0.0001 |
|
|||
|
|
|
|||
|
|
### 3. Двоичное дерево поиска (BST)
|
|||
|
|
|
|||
|
|
| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) |
|
|||
|
|
|-------|---------------|-------------|----------------|
|
|||
|
|
| Случайный | 0.0240 | 0.0002 | 0.0001 |
|
|||
|
|
| Отсортированный | 6.6866 | 0.0005 | 0.0008 |
|
|||
|
|
|
|||
|
|
## Анализ результатов
|
|||
|
|
|
|||
|
|
### 1. Влияние порядка данных на BST
|
|||
|
|
При добавлении уже отсортированных элементов BST вырождается в линейную структуру — сложность падает с O(log n) до O(n).
|
|||
|
|
Время вставки выросло с 0.0240 до 6.6866 секунд — замедление в 278.7 раза.
|
|||
|
|
|
|||
|
|
### 2. Почему хеш-таблица не чувствительна к порядку
|
|||
|
|
|
|||
|
|
Хеш-функция равномерно распределяет ключи по корзинам независимо от их исходного порядка. Поэтому последовательность добавления практически не влияет на производительность.
|
|||
|
|
Сравнение случайного и упорядоченного ввода:
|
|||
|
|
- Случайный режим: 0.4748 с
|
|||
|
|
- Упорядоченный режим: 0.3728 с
|
|||
|
|
- Различие: 0.79
|
|||
|
|
|
|||
|
|
### 3. Почему связный список медленный при поиске
|
|||
|
|
|
|||
|
|
Поиск в связном списке требует линейного обхода O(n) — структура не поддерживает произвольный доступ. Это делает его непригодным для крупных справочников, где нужен быстрый поиск по ключу.
|
|||
|
|
|
|||
|
|
Сравнение скорости поиска на случайных данных:
|
|||
|
|
- LinkedList: 0.0446 сек
|
|||
|
|
- HashTable: 0.0014 сек (преимущество в 30.8)
|
|||
|
|
- BST: 0.0002 сек
|
|||
|
|
|
|||
|
|
### 4. Сравнение удаления
|
|||
|
|
|
|||
|
|
| Структура | Сложность | Время на 50 удалений (случайные данные) |
|
|||
|
|
|-----------|-----------|------------------------------------------|
|
|||
|
|
| Связный список | O(n) | 0.0286 сек|
|
|||
|
|
| Хеш-таблица | O(1) в среднем | 0.0006 сек |
|
|||
|
|
| BST | O(log n) в среднем | 0.0001 сек |
|
|||
|
|
|
|||
|
|
## Вывод:
|
|||
|
|
|
|||
|
|
| Задача | Рекомендация | Почему |
|
|||
|
|
|--------|-------------|--------|
|
|||
|
|
| Частый поиск | Хеш-таблица | O(1) в среднем, не зависит от порядка |
|
|||
|
|
| Частые вставки/удаления | Хеш-таблица | Амортизированное O(1) |
|
|||
|
|
| Нужен отсортированный вывод | Сбалансированное дерево (AVL/Red-Black) | In-order обход даёт сортировку |
|
|||
|
|
| Мало данных (<100 элементов) | Связный список или массив | Простота, накладные расходы не оправданы |
|
|||
|
|
| Последовательный доступ (очередь/стек) | Связный список | Вставка/удаление в начало/конец за O(1) |
|
|||
|
|
|
|||
|
|
## Заключение
|
|||
|
|
Проведённый эксперимент подтверждает теоретические оценки сложности:
|
|||
|
|
|
|||
|
|
1. **Небалансированное BST это плохой выбор** при работе с реальными данными, которые могут оказаться упорядоченными. Деградация до O(n) делает его непригодным для надёжных систем.
|
|||
|
|
|
|||
|
|
2. **Хеш-таблица показывает стабильные результаты** вне зависимости от порядка входных данных — ключевое преимущество для телефонного справочника с произвольными именами абонентов.
|
|||
|
|
|
|||
|
|
3. **Связный список — нишевый инструмент**, эффективный только при работе с малыми объёмами данных.
|
|||
|
|
|