Алгоритм Косарайю: различия между версиями
[непроверенная версия] | [непроверенная версия] |
РобоСтася (обсуждение | вклад) более не распознаётся как изолированная статья, Replaced: {{изолированная статья|кластер3}} |
|||
Строка 1: | Строка 1: | ||
{{изолированная статья|кластер3}} |
|||
'''Алгоритм Косарайю''' — алгоритм поиска [[Компонента_сильной_связности_в_орграфе|компонент сильной связности]] в [[Граф_(математика)#.D0.9E.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|орграфе]]. Чтобы найти компоненты сильной связности, сначала выполняется [[Поиск_в_глубину|поиск в глубину]] на обращении исходного графа (ребра инвертированы), вычисляя вектор обратного порядка обхода. Затем мы используем обращение этого вектора, чтобы выполнить поиск в глубину на исходном графе (в очередной раз берем вершину с максимальным номером, полученным при обратном проходе). Деревья в лесе DFS, которые выбираются в результате, представляют собой сильные компоненты. |
'''Алгоритм Косарайю''' — алгоритм поиска [[Компонента_сильной_связности_в_орграфе|компонент сильной связности]] в [[Граф_(математика)#.D0.9E.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|орграфе]]. Чтобы найти компоненты сильной связности, сначала выполняется [[Поиск_в_глубину|поиск в глубину]] на обращении исходного графа (ребра инвертированы), вычисляя вектор обратного порядка обхода. Затем мы используем обращение этого вектора, чтобы выполнить поиск в глубину на исходном графе (в очередной раз берем вершину с максимальным номером, полученным при обратном проходе). Деревья в лесе DFS, которые выбираются в результате, представляют собой сильные компоненты. |
||
Версия от 21:35, 28 июня 2008
Алгоритм Косарайю — алгоритм поиска компонент сильной связности в орграфе. Чтобы найти компоненты сильной связности, сначала выполняется поиск в глубину на обращении исходного графа (ребра инвертированы), вычисляя вектор обратного порядка обхода. Затем мы используем обращение этого вектора, чтобы выполнить поиск в глубину на исходном графе (в очередной раз берем вершину с максимальным номером, полученным при обратном проходе). Деревья в лесе DFS, которые выбираются в результате, представляют собой сильные компоненты.
Определения
Ориентированный ациклический граф (directed acyclic graph) — это орграф, не содержащий направленных циклов.
Алгоритм
1) Инвертируем ребра исходного орграфа.
2) Запускаем поиск в глубину на этом обращенном графе. В результате получаем вектор обхода.
3) Запускаем поиск в глубину на исходном графе, в очередной раз выбирая не посещенную вершину с максимальным номером в векторе, полученном в п.2.
4) Полученные деревья из п.3, и являются сильно связными компонентами.
Свойство
Метод Косарайю обеспечивает поиск сильных компонент связности графа за линейное время и память.
Док-во: Этот метод состоит из двух процедур поиска в глубину, подвергнутых незначительным изменениям, в результате время его выполнения пропорционально V² в случае насыщенных графов и V + E в случае разреженных графов (если графы представлены в виде списков смежных вершин).
Пример
Ниже приведен пример работы алгоритма Косарайю.
Чтобы вычислить сильные компоненты орграфа, расположенного снизу слева, мы сначала выполняем поиск в глубину на его обращении (вверху слева), вычисляя вектор обратного порядка обхода (Order). Этот порядок эквивалентен обратному порядку обхода леса DFS. Используя обращение этого порядка мы производим обход в глубину на исходном графе. То есть начинаем с вершины 3. Деревья в лесе DFS, которые выбираются в результате этого процесса, представляют собой сильные компоненты. Содержимое вектора id: номер компоненты, цифры слева - номер вершины. Справа изображен результат работы алгоритма Косарайю.
Ссылки
Литература
- Роберт Седжвик. Алгоритмы на графах = Graph algorithms. — 3-е изд. — Россия, Санкт-Петербург: «ДиаСофтЮП», 2002. — С. 496. — ISBN 5-93772-054-7.