This repository has been archived on 2026-10-01. You can view files and clone it, but cannot push or open issues or pull requests.
2026-rff_mp/KiryshkinPA/task1/report.md
Кирюшкин Павел Андреевич 0d7eab6cac [1-2] task 1 and task2
2026-09-25 22:52:26 +03:00

74 lines
4.6 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.

# Отчёт: Задание 1 — Структуры данных
## Цель работы
Реализовать три структуры данных «с нуля» в процедурной парадигме (без классов), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций.
## Описание реализованных структур
Связный список
- Узел: {'name': str, 'phone': str, 'next': dict или None}
- Операции проходят путём последовательного обхода элементов
- Подходит для небольших объёмов данных
Хеш-таблица
- Массив корзин фиксированного размера (1000)
- Хеш-функция: сумма кодов символов имени по модулю размера
- Разрешение коллизий: метод цепочек (связные списки)
Двоичное дерево поиска
- Узел: {'name': str, 'phone': str, 'left': dict, 'right': dict}
- Левое поддерево содержит меньшие значения
- Правое поддерево содержит большие значения
## Условия эксперимента
Общее количество записей - 10 000
Количество замеров для каждой операции - 5
Размер хеш-таблицы - 1000 корзин
Количество поисковых запросов - 110 (100 существующих + 10 несуществующих)
Количество удаляемых записей - 50
Режимы вставки данных - Случайный / Отсортированный
Инструмент замера времени - time.perf_counter()
## Результаты
### Таблица средних времён (секунды)
| Структура | Режим | Вставка (с) | Поиск 110 (с) | Удаление 50 (с) |
|---|---|---|---|---|
| LinkedList | случайный | 12.32399 | 0.1279214 | 0.053208 |
| LinkedList | сортированный | 11.701628 | 0.0989321 | 0.052782 |
| HashTable | случайный | 0.7027289 | 0.0056565 | 0.0036097 |
| HashTable | сортированный | 0.5376899 | 0.0047595 | 0.003316 |
| BST | случайный | 0.08628449 | 0.000474 | 0.1715181 |
| BST | сортированный | 33.374929 | 0.1351418 | 0.1574643 |
### Графики
![Сравнение по операциям](performance_graphs.png)
## Анализ результатов
### Связный список
Вставка в список занимает ~2.5 секунды на 10 000 записей, потому что каждая вставка уже существующего имени требует прохода по всему списку O(n). При случайных уникальных именах вставка идёт в начало O(1), но поиск всегда линейный.
### Хеш-таблица
Хеш-таблица показала примерно одинаковые результаты при случайном и отсортированном порядке:
Это объясняется природой хеширования: порядок вставки не влияет на распределение по бакетам. Ключ всегда попадает в предсказуемый бакет за O(1).
### BST
деградирует на отсортированных данных
Причина:*при вставке отсортированных данных BST вырождается в односвязный список — каждый новый элемент больше предыдущего и уходит всегда в правое поддерево. Высота дерева становится O(n) вместо O(log n). Поиск и удаление тоже деградируют до O(n).
## Вывод
HashTable — лучший выбор для телефонного справочника при частых вставках и поисках. BST лучше HashTable только если нужен отсортированный вывод без дополнительной сортировки — но при условии случайного порядка вставки или использования самобалансирующегося дерева (AVL, Red-Black).