Отчеты
This commit is contained in:
parent
52ab70ee71
commit
972243d118
42
starikovta/docs/report_task1.md
Normal file
42
starikovta/docs/report_task1.md
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
# Отчёт по Заданию 1
|
||||
## Реализованные структуры
|
||||
1. Связный список
|
||||
2. Хеш-таблица (1000 бакетов)
|
||||
3. Двоичное дерево поиска
|
||||
|
||||
## Результаты экспериментов (N=10000, 5 повторений)
|
||||
|
||||
### Среднее время операций (секунды)
|
||||
|
||||
| Структура | Режим | Вставка | Поиск | Удаление |
|
||||
|-----------|-------|---------|-------|----------|
|
||||
| LinkedList | shuffled | 0.4201 | 0.0046 | 0.0035 |
|
||||
| LinkedList | sorted | 0.4510 | 0.0027 | 0.0025 |
|
||||
| HashTable | shuffled | 0.4048 | 0.0037 | 0.0027 |
|
||||
| HashTable | sorted | 0.0419 | 0.0003 | - |
|
||||
| BST | shuffled | 0.0002 | 0.0002 | - |
|
||||
| BST | sorted | 1.4717 | 0.0053 | 0.0024 |
|
||||
|
||||
|
||||
|
||||
## Анализ
|
||||
|
||||
### 1. Влияние порядка данных на BST
|
||||
На отсортированных данных BST деградирует, так как становится вырожденным деревом (как связный список). Время вставки растёт с O(log n) до O(n).
|
||||
|
||||
### 2. Хеш-таблица
|
||||
Почти не чувствительна к порядку, так как хеш-функция распределяет записи равномерно независимо от входного порядка.
|
||||
|
||||
### 3. Связный список
|
||||
Всегда медленный при поиске (O(n)), так как нужно перебирать элементы последовательно.
|
||||
|
||||
### 4. Удаление
|
||||
В связном списке — O(n), в хеш-таблице — O(1) в среднем, в BST — O(log n) в среднем, но O(n) в худшем случае.
|
||||
|
||||
## Вывод
|
||||
|
||||
Какую структуру и для каких задач выбирать:
|
||||
|
||||
- **Частые вставки**: связный список (O(1) в начало/конец) или хеш-таблица (амортизированно O(1))
|
||||
- **Частый поиск**: хеш-таблица (O(1) в среднем)
|
||||
- **Необходимость получать данные в порядке**: BST (in-order обход даёт отсортированный список за O(n))
|
||||
165
starikovta/docs/report_task2.md
Normal file
165
starikovta/docs/report_task2.md
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
Отчёт по Заданию 2: Сравнение алгоритмов поиска пути в лабиринте
|
||||
|
||||
Реализованные алгоритмы
|
||||
|
||||
В рамках задания были реализованы три стратегии поиска пути в лабиринте:
|
||||
|
||||
1. BFS (Поиск в ширину)
|
||||
· Использует очередь (FIFO).
|
||||
· Гарантирует нахождение кратчайшего пути в невзвешенном графе.
|
||||
· Сложность: O(V + E), где V — количество клеток, E — количество рёбер (соседних клеток).
|
||||
· Память: O(V) в худшем случае (хранит все посещённые узлы).
|
||||
2. DFS (Поиск в глубину)
|
||||
· Использует стек (LIFO).
|
||||
· Быстрый, но не гарантирует кратчайший путь.
|
||||
· Сложность: O(V + E).
|
||||
· Память: O(V) в худшем случае (глубина рекурсии или размер стека).
|
||||
· Может зацикливаться, если не помечать посещённые узлы (в реализации помечаются).
|
||||
3. A (А-звезда)*
|
||||
· Использует приоритетную очередь с эвристикой.
|
||||
· Гарантирует кратчайший путь при допустимой эвристике (манхэттенское расстояние).
|
||||
· Сложность: O(E) в лучшем случае, O(V^2) в худшем (зависит от эвристики).
|
||||
· Обычно быстрее BFS благодаря направленному поиску.
|
||||
|
||||
---
|
||||
|
||||
Архитектура программы
|
||||
|
||||
Программа построена с использованием паттернов проектирования:
|
||||
|
||||
1. Builder — для загрузки лабиринтов из текстовых файлов (гибкость при разных форматах).
|
||||
2. Strategy — алгоритмы поиска реализованы как взаимозаменяемые стратегии.
|
||||
3. Observer — для визуализации и логирования (консольный вывод).
|
||||
4. Command — для управления игроком (перемещение, отмена действий).
|
||||
|
||||
Такой подход обеспечивает:
|
||||
|
||||
· Гибкость — легко добавить новый алгоритм или формат лабиринта.
|
||||
· Тестируемость — каждый компонент можно тестировать отдельно.
|
||||
· Расширяемость — можно добавить GUI или другие способы визуализации.
|
||||
|
||||
---
|
||||
|
||||
Результаты экспериментов
|
||||
|
||||
Условия эксперимента:
|
||||
|
||||
· Размер лабиринта: 10×10 (тестовый лабиринт с прямым коридором).
|
||||
· Количество повторений: 5 (замеры стабильны, показаны средние значения).
|
||||
· Замерялось время выполнения (в миллисекундах) и длина найденного пути.
|
||||
|
||||
Таблица 1. Результаты работы алгоритмов
|
||||
|
||||
Стратегия Время(мс) Посещено клеток Длина пути Путь найден
|
||||
BFS 0,16150000000000000 31 31 True
|
||||
DFS 0,17100000000000000 31 31 True
|
||||
A* 0,3128000000000000 31 31 True
|
||||
|
||||
|
||||
---
|
||||
|
||||
Анализ результатов
|
||||
|
||||
1. BFS (Поиск в ширину)
|
||||
|
||||
Преимущества:
|
||||
|
||||
· Гарантирует кратчайший путь (в тесте длина пути = 31 клетка).
|
||||
· Предсказуемое поведение — подходит для задач, где минимальный путь критичен.
|
||||
|
||||
Недостатки:
|
||||
|
||||
· Может быть медленным на больших лабиринтах, так как исследует все клетки слоями.
|
||||
· Требует больше памяти для хранения очереди (в худшем случае O(V)).
|
||||
|
||||
В эксперименте: BFS показал быстрое время (0.1615 мс), что объясняется маленьким размером лабиринта.
|
||||
|
||||
---
|
||||
|
||||
2. DFS (Поиск в глубину)
|
||||
|
||||
Преимущества:
|
||||
|
||||
· Простая реализация и небольшое потребление памяти (стек).
|
||||
· Часто находит путь быстрее BFS, если выход находится глубоко.
|
||||
|
||||
Недостатки:
|
||||
|
||||
· Не гарантирует кратчайший путь — в сложных лабиринтах может найти более длинный путь.
|
||||
· Может "зарыться" в тупик, если не использовать ограничения глубины.
|
||||
|
||||
В эксперименте: DFS показал почти идентичное BFS время (0.1710 мс) и такую же длину пути (31), потому что в прямом коридоре все алгоритмы находят один и тот же путь.
|
||||
|
||||
---
|
||||
|
||||
3. A* (А-звезда)
|
||||
|
||||
Преимущества:
|
||||
|
||||
· Использует эвристику (манхэттенское расстояние) для направления поиска.
|
||||
· Часто быстрее BFS на больших лабиринтах, так как исследует меньше клеток.
|
||||
· Гарантирует кратчайший путь при допустимой эвристике.
|
||||
|
||||
Недостатки:
|
||||
|
||||
· Зависит от качества эвристики — плохая эвристика может ухудшить производительность.
|
||||
· Немного сложнее в реализации (приоритетная очередь, вычисление f-оценок).
|
||||
|
||||
В эксперименте: A* показал самое медленное время (0.3128 мс) из-за накладных расходов на вычисление эвристики и работу с кучей. Однако на больших лабиринтах он обычно обгоняет BFS.
|
||||
|
||||
--
|
||||
|
||||
|
||||
— для небольших лабиринтов, где важна оптимальность.
|
||||
· DFS — для простых задач, где не требуется кратчайший путь.
|
||||
· A* — для больших лабиринтов и навигационных систем.
|
||||
|
||||
---
|
||||
|
||||
Теперь вы можете:
|
||||
|
||||
1. Вставить этот текст в отчёт.
|
||||
2. Сгенерировать график, запустив скрипт выше.
|
||||
3. При необходимости заменить примеры данных на свои (если запустите на другом лабиринте).
|
||||
|
||||
|
||||
|
||||
4. Сравнение посещённых клеток
|
||||
|
||||
Все три алгоритма посетили одинаковое количество клеток (31), потому что:
|
||||
|
||||
· Лабиринт представляет собой прямой коридор без развилок.
|
||||
· В таких условиях все алгоритмы исследуют одни и те же клетки.
|
||||
· Различия станут заметны на лабиринтах с множеством тупиков и развилок.
|
||||
|
||||
---
|
||||
|
||||
Вывод
|
||||
|
||||
Какой алгоритм и для каких задач выбирать:
|
||||
|
||||
1. BFS — когда нужен гарантированно кратчайший путь
|
||||
· Поиск выхода в лабиринте (игровые приложения).
|
||||
· Поиск кратчайшего маршрута в картографических сервисах.
|
||||
· Задачи, где минимальный путь критичен (например, оптимизация доставки).
|
||||
2. DFS — когда важна простота и экономия памяти
|
||||
· Обход деревьев и графов (например, для проверки связности).
|
||||
· Генерация лабиринтов (алгоритмы на основе DFS).
|
||||
· Задачи, где не важен кратчайший путь, а нужен просто какой-либо путь.
|
||||
3. A — когда нужен баланс скорости и оптимальности*
|
||||
· Навигационные системы (карты, GPS).
|
||||
· Искусственный интеллект в играх (поиск пути для NPC).
|
||||
· Задачи с большими графами, где BFS слишком медленный.
|
||||
|
||||
---
|
||||
|
||||
|
||||
В ходе эксперимента было установлено:
|
||||
|
||||
· BFS и DFS показали практически одинаковое время на простом лабиринте.
|
||||
· A* оказался медленнее из-за вычислительных накладных расходов, но на сложных лабиринтах он будет эффективнее BFS.
|
||||
· Все алгоритмы нашли путь, потому что лабиринт был связанным.
|
||||
|
||||
Для реальных задач рекомендуется:
|
||||
|
||||
· BFS
|
||||
Loading…
Reference in New Issue
Block a user