Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diskretnaya_matematika_Otvety.docx
Скачиваний:
24
Добавлен:
23.09.2019
Размер:
1.12 Mб
Скачать

21. Алгоритм поиска на графах (поиск в глубину).

Поиск в глубину (DFS – Depth First Search) – идея этого метода – идти вперед в неисследованную область, пока это возможно, если же вокруг все исследовано, отступить на шаг назад и искать новые возможности для продвижения вперед.

Обход начинается с посещения заданной стартовой вершины a, которая становится активной и единственной открытой вершиной. Затем выбирается инцидентное вершине a ребро (a,y) и посещается вершину y. Она становится открытой и активной. Если все ребра, инцидентные активной вершине x, уже исследованы, она превращается в закрытую. В противном случае выбирается одно из неисследованных ребер (x,y), это ребро исследуется. Если вершина y новая, то она посещается и превращается в открытую.

При поиске в глубину в качестве активной выбирается та из открытых вершин, которая была посещена последней. Для реализации такого правила выбора наиболее удобной структурой хранения множества открытых вершин является стек: открываемые вершины складываются в стек в том порядке, в каком они открываются, а в качестве активной выбирается последняя вершина.

Обозначим стек для открытых вершин через S. Через top(S) обозначается верхний элемент стека (т.е. последний элемент, добавленный к стеку).

Procedure DFS(a)

1. посетить вершину a

2. a => S

3. while S≠Ø do

4. x=top(S)

5. if имеется неисследованное ребро (x,y) then исследовать ребро (x,y)

6. if вершина y новая

7. then посетить вершину y

8. y => S

9. else удалить x из S

При поиске в глубину, если окрестности активной вершины x обнаруживается новая вершина y, то y помещается в стек и при следующем повторении цикла while станет активной. При этом x остается в стеке и через какое-то время снова станет активной. Иначе говоря, ребра, инцидентные вершине x, будут исследованы не подряд, а с перерывами.

В результате выполнения процедуры DFS будут посещены все вершины из компоненты связности, содержащие вершину a, и только они.

Время работы процедуры DFS есть O(m), где m – число ребер в компоненте связности, содержащей вершину a.

22. Алгоритм поиска на графах (поиск в ширину).

Поиск в ширину представляет собой один из простейших алгоритмов для обхода графа и является основой для многих важных алгоритмов для работы с графами.

Идея поиска в ширину состоит в том, чтобы посещать вершины в порядке их удаленности от некоторой заранее выбранной или указанной стартовой вершины a. Иначе говоря, сначала посещается сама вершина a, затем все вершины, смежные с a, то есть находящиеся от нее на расстоянии 1, затем вершины, находящиеся от a на расстоянии 2, и т.д.

Рассмотрим алгоритм поиска в ширину с заданной стартовой вершиной a. Вначале все вершины помечаются как новые. Первой посещается вершина a, она становится единственной открытой вершиной. В дальнейшем каждый очередной шаг начинается с выбора некоторой открытой вершины x. Эта вершина становится активной. Далее исследуются ребра, инцидентные активной вершине. Если такое ребро соединяет вершину x с новой вершиной y, то вершина y посещается и превращается в открытую. Когда все ребра, инцидентные активной вершине, исследованы, она перестает быть активной и становится закрытой. После этого выбирается новая активная вершина, и описанные действия повторяются. Процесс заканчивается, когда множество открытых вершин становится пустым.

Основная особенность поиска в ширину состоит в том, что в качестве активной вершины выбирается та из открытых, которая была посещена раньше других. Именно этим обеспечивается главное свойство поиска в ширину: чем ближе вершина к старту, тем раньше она будет посещена. Для реализации такого правила выбора активной вершины удобно использовать для хранения множества открытых вершин очередь – когда новая вершина становится открытой, она добавляется в конец очереди, а активная выбирается в ее начале.

Опишем процедуру поиска в ширину (BFS – Breadth First Search) из заданной стартовой вершины a. V(x) – множество всех вершин, смежных с вершиной x. Q – очередь открытых вершин. Предполагается, что при посещении вершины она помечается как посещенная и эта пометка означает, что вершина уже не является новой.

Procedure BFS(a)

1. посетить вершину a

2. a => Q

3. while Q!=Ø do

4. x <= Q

5. for y прин V(x) do

6. исследовать ребро (x,y)

7. if вершина y новая then посетить вершину y

8. y => Q

В результате выполнения процедуры BFS будут посещены все вершины из компоненты связности, содержащие вершину a, и только они.

Время работы процедуры BFS есть O(m), где m – число ребер в компоненте связности, содержащей вершину a.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]