9.7 KiB
Отчет по лабораторной работе: Сравнение структур данных для телефонного справочника
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. Заключение
В ходе лабораторной работы были успешно реализованы три структуры данных:
- Связный список - простейшая структура с последовательным доступом
- Хеш-таблица - структура с прямым доступом через хеш-функцию
- Двоичное дерево поиска - иерархическая структура с логарифмическим доступом
Экспериментально подтверждены теоретические оценки сложности:
- Хеш-таблица показала наилучшие результаты для поиска
- BST сильно зависит от порядка входных данных
- Связный список предсказуемо медлен для всех операций
Главный вывод: выбор структуры данных должен основываться на конкретных задачах и сценариях использования. Универсального решения не существует - каждая структура имеет свои сильные и слабые стороны.