6.3 Поиск в ширину
Предположим, что мы хотим найти кратчайший путь (shortest path) между двумя конкретными вершинами некоторого графа — путь, соединяющий вершины, обладающие тем свойством, что никакой другой путь, соединяющий эти вершины, не содержит меньшее число ребер. Классический метод решения этой задачи, получивший название поиска в ширину (BFS - breath-first search), служит основой многочисленных алгоритмов обработки графов; именно он и будет изучаться в данном разделе. Поиск в глубину мало пригоден для решения этой задачи, поскольку предлагаемый им порядок прохождения графа не имеет отношения к поиску кратчайших путей. В отличие от поиска в глубину, поиск в ширину предназначен как раз для достижения этой цели. Поиск кратчайшего пути от вершины v к вершине w мы начнем с того, что среди всех вершин, в которые можно перейти по одному ребру из вершины v, мы попытаемся обнаружить вершину w, затем мы проверяем все вершины, в которые мы можем перейти по двум ребрам, и т.д.
Когда во время просмотра графа мы попадаем в такую точку, из которой исходят более одного ребра, мы выбираем одно из них и запоминаем остальные для дальнейшего просмотра. В поиске в глубину для этой цели мы используем стек магазинного типа (которым управляет система, благодаря чему обеспечивается поддержка рекурсивной функции поиска). Применение правила LIFO (LastInFirstOut - последним пришел, первым обслужен), которое характеризует работу стека магазинного типа, соответствует исследованию соседних коридоров в лабиринте: из всех еще не исследованных коридоров выбирается последний из тех, с которым мы столкнулись. В поиске в ширину мы хотим проводить исследование вершин в зависимости от их удаления от исходной точки. В случае реального лабиринта для проведения исследований в таком порядке может потребоваться специальная команда исследователей; однако в компьютерной программе эта цель достигается намного проще: мы просто вместо стека используем очередь FIFO (FIFOqueue - первым пришел, первым обслужен).
Для исходной вершины мы помещаем в очередь фиктивную петлю, после чего выполняем следующие действия до тех пор, пока очередь не опустеет:
Выбираем ребра из очереди до тех пор, пока не найдем такое ребро, которое ведет на непосещенную вершину.
Просматриваем эту вершину; ставим в очередь все ребра, исходящие из этой вершины в вершины, которые мы еще не посещали.
Рисунок 43 иллюстрирует последовательный процесс поиска в ширину (BFS) на конкретном примере.
Ребро 7-4 показано серым цветом, поскольку мы могли бы и не устанавливать его в очередь, так как имеется еще одно ребро, которое ведет в вершину 4, уже помещенную в очередь. В завершение поиска мы удаляем оставшиеся ребра из очереди, полностью игнорируя при этом серые ребра, когда они вверху очереди (справа). Ребра поступают в очередь и покидают ее в порядке их удаленности от вершины 0.
Этот рисунок прослеживает процесс поиска в ширину на заданном примере. Мы начинаем его на всех ребрах, смежных с исходной вершиной в очереди (диаграмма вверху слева). Далее, мы переносим ребро 0-2 из очереди в дерево и приступаем к обработке инцидентных ему ребер 2-0 и 2-6 (вторая диаграмма сверху слева). Мы не помещаем ребро 2-0 в очередь, поскольку вершина 0 уже содержится в дереве. Затем мы переносим ребро 0-5 из очереди в дерево; и снова ребра, инцидентные вершине 5, не приводят нас к новым вершинам, однако мы добавляем в очередь ребра 5-3 и 5-4 (третья диаграмма сверху слева). После этого мы добавляем ребро 0-7 в дерево и устанавливаем ребро 7-1 в очередь (диаграмма внизу слева).
Как мы могли убедиться в предыдущем разделе, поиск в глубину подобен исследованию лабиринта, проводимого одним человеком. Поиск в ширину можно сравнить с исследованием, проводимым группой людей, рассыпавшихся веером по всем направлениям. Несмотря на то что поиски в глубину и в ширину отличаются друг от друга во многих аспектах, здесь уместно подчеркнуть то, что между этими двумя методами существует прочная глубинная связь.
Рисунок 43
С помощью поиска в ширину мы можем решить задачи обнаружения остовного дерева, связных компонент, поиска вершин и ряд других базовых задач связности, поскольку рассмотренные решения зависят только от способности алгоритма поиска анализировать каждый узел и каждое ребро, связанное с исходной точкой. Поиски в ширину и в глубину являются шаблонами многочисленных алгоритмов, обладающих этим свойством. Как уже отмечалось в начале данного раздела, наш повышенный интерес к поиску в ширину объясняется тем, что он является естественным алгоритмом поиска на графе для приложений, в условиях которых требуется знать кратчайший путь между двумя заданными вершинами. Далее, мы рассмотрим конкретное решение этой задачи.
Yandex.RTB R-A-252273-3- Общие сведения Сведения об эумк
- Методические рекомендации по изучению дисциплины
- Рабочая учебная программа
- Протокол согласования учебной программы по изучаемой учебной дисциплине с другими дисциплинами специальности
- Пояснительная записка
- Содержание дисциплины
- 1. Наименование тем, их содержание
- Тема 5. Отношения на множествах
- Тема 6. Соответствие и функции
- Тема 7. Мультимножества
- Раздел 2. Теория графов
- Тема 8. Основные понятия теории графов
- Тема 9. Графы
- Тема 10. Орграфы
- 3. Литература
- Теоретический раздел
- 1.2 Способы задания множеств
- Глава 2. Операции над множествами
- 2.1 Сравнение множеств
- 2.2 Операции над множествами
- 2.3 Свойства операций над множествами
- 2.4 Примеры доказательств тождеств с множествами
- 2.5 Булеан
- Глава 3. Упорядоченные множества
- 3.1 Кортеж
- 3.2 Операция проекции
- 3.3 Декартово произведение множеств
- 3.4 Графики
- Глава 4. Отношения на множествах
- 4.1 Понятие отношения
- 4.2 Свойства отношений
- 4.3 Операции над отношениями
- 4.4 Отношение эквивалентности
- 4.5 Отношение порядка
- Глава 5. Соответствия и функции
- 5.1 Основные понятия соответствия
- 5.2 Операции над соответствиями
- 5.3 Свойства соответствий
- 5.4 Отображения множеств
- 5.5 Функция
- Глава 6. Мультимножества
- 6.1 Понятие мультимножества
- 6.2 Операции над мультимножествами
- Раздел 2. Теория графов Глава 1. Основные понятия
- 1.1 Определения и примеры
- 1.2 Способы задания графов
- Глава 2. Графы
- 2.1 Типы графов
- 2.2 Подграфы
- 2.3 Сильно связные графы и компоненты графа
- 2.4 Маршруты, цепи, пути и циклы
- 2.5 Связность и компоненты графа
- 2.6 Операции над графами
- 2.7 Матрица смежности и инцидентности
- Глава 3. Орграфы
- 3.1 Определения и примеры
- 3.2 Орграфы и матрицы
- 3.3 Ориентированные эйлеровы графы
- Глава 4. Ориентированные ациклические графы и деревья
- 4.1 Ориентированные ациклические графы
- 4.2 Деревья
- Глава 5. Планарность и двойственность
- 5.1 Планарные графы
- 5.2 Точки сочленения, мосты и блоки
- 5.3 Двойственные графы
- Глава 6. Поиск на графах
- 6.1 Исследование лабиринта
- 6.2 Поиск в глубину
- 6.3 Поиск в ширину
- 6.4 Нахождение кратчайшего пути (Алгоритм Дейкстры)
- Практический раздел Контрольные работы Указания по выбору варианта
- Варианты контрольных заданий
- Контрольная работа № 1 Теоретическая часть (вопросы)
- Практическая часть Контрольное задание №1.
- Контрольное задание №2.
- Контрольное задание №3.
- Контрольное задание №4.
- Контрольное задание №5.
- Контрольное задание №6.
- Теоретическая часть (вопросы)
- Контрольное задание №1.
- Контрольное задание №2.
- Контрольное задание №3.