diff --git a/starikovta/docs/report_task1.md b/starikovta/docs/report_task1.md new file mode 100644 index 0000000..7ed6178 --- /dev/null +++ b/starikovta/docs/report_task1.md @@ -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)) \ No newline at end of file diff --git a/starikovta/docs/report_task2.md b/starikovta/docs/report_task2.md new file mode 100644 index 0000000..720773e --- /dev/null +++ b/starikovta/docs/report_task2.md @@ -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 \ No newline at end of file