Алгоритм Косарайю: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
См. https://ru.wikipedia.org/wiki/Индийско-русская_практическая_транскрипция
Строка 1: Строка 1:
'''Алгоритм Косарайю''' (в честь американского учёного индийского происхождения {{нп3|Самбасива Рао Косарайю|Самбасивы Рао Косарайю|en|S. Rao Kosaraju}}) — алгоритм поиска [[Компонента сильной связности в орграфе|областей сильной связности]] в [[Орграф|ориентированном графе]]. Чтобы найти области сильной связности, сначала выполняется [[поиск в глубину]] (DFS) на обращении исходного графа (то есть против дуг), вычисляя порядок ''выхода'' из вершин. Затем мы используем обращение этого порядка, чтобы выполнить поиск в глубину на исходном графе (в очередной раз берём вершину с максимальным номером, полученным при обратном проходе). Деревья в лесе DFS, которые выбираются в результате, представляют собой сильные компоненты.
'''Алгоритм Косараджу''' (в честь американского учёного индийского происхождения {{нп3|Самбасива Рао Косараджу|Самбасивы Рао Косараджу|en|S. Rao Kosaraju}}) — алгоритм поиска [[Компонента сильной связности в орграфе|областей сильной связности]] в [[Орграф|ориентированном графе]]. Чтобы найти области сильной связности, сначала выполняется [[поиск в глубину]] (DFS) на обращении исходного графа (то есть против дуг), вычисляя порядок ''выхода'' из вершин. Затем мы используем обращение этого порядка, чтобы выполнить поиск в глубину на исходном графе (в очередной раз берём вершину с максимальным номером, полученным при обратном проходе). Деревья в лесе DFS, которые выбираются в результате, представляют собой сильные компоненты.


== Определения ==
== Определения ==
Строка 11: Строка 11:


== Свойство ==
== Свойство ==
'''Метод Косарайю обеспечивает поиск сильных компонент связности графа за линейное время и память.'''
'''Метод Косараджу обеспечивает поиск сильных компонент связности графа за линейное время и память.'''


Доказательство:
Доказательство:
Строка 17: Строка 17:


== Пример ==
== Пример ==
Ниже приведён пример работы алгоритма Косарайю.
Ниже приведён пример работы алгоритма Косараджу.


Чтобы вычислить сильные компоненты ориентированного графа, расположенного снизу слева, мы сначала выполняем поиск в глубину на его обращении (вверху слева), вычисляя вектор обратного порядка обхода (Order). Этот порядок эквивалентен обратному порядку обхода леса DFS. Используя обращение этого порядка мы производим обход в глубину на исходном графе. То есть начинаем с вершины 3. Деревья в лесе DFS, которые выбираются в результате этого процесса, представляют собой сильные компоненты. Содержимое вектора id: номер компоненты, цифры слева — номер вершины.
Чтобы вычислить сильные компоненты ориентированного графа, расположенного снизу слева, мы сначала выполняем поиск в глубину на его обращении (вверху слева), вычисляя вектор обратного порядка обхода (Order). Этот порядок эквивалентен обратному порядку обхода леса DFS. Используя обращение этого порядка мы производим обход в глубину на исходном графе. То есть начинаем с вершины 3. Деревья в лесе DFS, которые выбираются в результате этого процесса, представляют собой сильные компоненты. Содержимое вектора id: номер компоненты, цифры слева — номер вершины.

Версия от 15:17, 4 ноября 2019

Алгоритм Косараджу (в честь американского учёного индийского происхождения Самбасивы Рао Косараджу[англ.]) — алгоритм поиска областей сильной связности в ориентированном графе. Чтобы найти области сильной связности, сначала выполняется поиск в глубину (DFS) на обращении исходного графа (то есть против дуг), вычисляя порядок выхода из вершин. Затем мы используем обращение этого порядка, чтобы выполнить поиск в глубину на исходном графе (в очередной раз берём вершину с максимальным номером, полученным при обратном проходе). Деревья в лесе DFS, которые выбираются в результате, представляют собой сильные компоненты.

Определения

Ориентированный ациклический граф — это ориентированный граф, не содержащий направленных циклов.

Алгоритм

  1. Инвертируем дуги исходного ориентированного графа.
  2. Запускаем поиск в глубину на этом обращённом графе, запоминая, в каком порядке выходили из вершин.
  3. Запускаем поиск в глубину на исходном графе, в очередной раз выбирая не посещённую вершину с максимальным номером в векторе, полученном в п.2.
  4. Полученные из п.3 деревья и являются сильно связными компонентами.

Свойство

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

Доказательство: Этот метод состоит из двух процедур поиска в глубину, подвергнутых незначительным изменениям, в результате время его выполнения пропорционально V² в случае насыщенных графов и V + E в случае разреженных графов (если графы представлены в виде списков смежных вершин).

Пример

Ниже приведён пример работы алгоритма Косараджу.

Чтобы вычислить сильные компоненты ориентированного графа, расположенного снизу слева, мы сначала выполняем поиск в глубину на его обращении (вверху слева), вычисляя вектор обратного порядка обхода (Order). Этот порядок эквивалентен обратному порядку обхода леса DFS. Используя обращение этого порядка мы производим обход в глубину на исходном графе. То есть начинаем с вершины 3. Деревья в лесе DFS, которые выбираются в результате этого процесса, представляют собой сильные компоненты. Содержимое вектора id: номер компоненты, цифры слева — номер вершины.

Ссылки

Литература

  • Роберт Седжвик. Алгоритмы на графах = Graph algorithms. — 3-е изд. — Россия, Санкт-Петербург: «ДиаСофтЮП», 2002. — С. 496. — ISBN 5-93772-054-7.