
- •Временная сложность алгоритмов
- •Задачи решимости, задачи оптимизации
- •Применение полного перебора для решения задачи коммивояжера. Перебор всех перестановок. Простой рекурсивный алгоритм
- •Применение полного перебора для решения задачи о рюкзаке. Перебор всех подмножеств множества. Сведение к перебору двоичных векторов. Коды Грея.
- •Общая схема метода ветвей и границ. Применение метода ветвей и границ для решения задачи о рюкзаке
- •Динамическое программирование
- •Жадные алгоритмы. Задача о выборе заявок. Свойства задач, для которых применимы жадные алгоритмы.
- •Эвристические методы решения задач. Эвристика жадного выбора и локального поиска. Примеры. Задача о покрытии, задача о камнях. Метаэвристики
- •Абстрактные типы данных. Атд стек, очередь, корневое дерево, множество, словарь, очередь с приоритетом, система непересекающихся множеств, граф и способы их реализации
- •Обходы графа. Поиск в глубину, поиск в ширину
Обходы графа. Поиск в глубину, поиск в ширину
Определение: Граф - это абстрактная структура данных, состоящая из вершин (узлов) и ребер (связей между вершинами). Графы могут быть ориентированными (ребра имеют направление) или неориентированными (ребра не имеют направления).
Способы реализации графов:
1. Матрица смежности: граф представляется двумерным массивом, где каждый элемент указывает наличие или отсутствие ребра между двумя вершинами.
2. Список смежности: граф представляется списком, где каждая вершина имеет связанный список смежных с ней вершин.
3. Список ребер: граф представляется списком ребер, где каждое ребро определяется парой вершин, которые оно соединяет.
Время выполнения операций также зависит от выбранной реализации графа. Например, операции добавления вершины и ребра обычно выполняются за константное время (O(1)) в списках смежности и списках ребер, но могут потребовать O(n^2) времени в матрице смежности, где n - количество вершин.
Примеры обхода графа:
1. Поиск в ширину (BFS - Breadth-First Search): начиная с заданной вершины, происходит поэтапное обследование всех соседей вершины, затем переход к следующей "уровню" соседей. Поиск в ширину позволяет определить расстояния между вершинами и найти кратчайший путь в невзвешенном графе.
2. Поиск в глубину (DFS - Depth-First Search): начиная с заданной вершины, происходит исследование каждого соседа до тех пор, пока не будут исследованы все доступные пути. Поиск в глубину позволяет обнаруживать компоненты связности, классифицировать ребра графа и находить все циклы.
Классификация ребер при обходе в глубину в неориентированном графе:
- Ребра дерева (Tree Edges): ребра, которые образуют остовное дерево при обходе в глубину. Они связывают вершину с ее не посещенными соседями.
- Опорные ребра (Back Edges): ребра, которые соединяют вершину с ее предками в дереве обхода в глубину. Они указывают на наличие циклов в графе.
- Перекрестные ребра (Cross Edges): ребра, которые соединяют вершины, не являющиеся предками и потомками друг друга в дереве обхода в глубину. Они возникают в ациклических графах или при обходе неориентированного графа.
- Прямые ребра (Forward Edges): ребра, которые соединяют вершину с ее потомками в дереве обхода в глубину. Они возникают при наличии ориентированных ребер в графе.
Время выполнения обхода в ширину и обхода в глубину зависит от количества вершин и ребер в графе и может быть описано как O(V + E), где V - количество вершин, E - количество ребер.