Алгоритм Пурдома: различия между версиями
| [непроверенная версия] | [непроверенная версия] |
Daryin (обсуждение | вклад) |
Daryin (обсуждение | вклад) |
||
| Строка 14: | Строка 14: | ||
=== Вычислительное ядро алгоритма === | === Вычислительное ядро алгоритма === | ||
=== Макроструктура алгоритма === | === Макроструктура алгоритма === | ||
Вычисления производятся в четыре этапа: | |||
# Найти [[Связность в графах|компоненты сильной связности]] исходного графа, заменить каждую компоненту на одну вершину и удалить образовавшиеся рёбра-петли. | |||
# Выполнить топологическую сортировку полученного ациклического графа <math>\tilde G</math>. | |||
# Вычислить транзитивное замыкание графа <math>\tilde G</math>, двигаясь от вершин с бо॑льшими номерами к меньшим. | |||
# По найденному транзитивному замыканию <math>\tilde G</math> восстановить транзитивное замыкание исходного графа. | |||
Последний этап не является обязательным, если рассматривать транзитивное замыкание <math>\tilde G</math> как «упакованное» транзитивное замыкание <math>G</math>. | |||
=== Описание схемы реализации последовательного алгоритма === | === Описание схемы реализации последовательного алгоритма === | ||
=== Последовательная сложность алгоритма === | === Последовательная сложность алгоритма === | ||
Версия от 08:15, 14 июня 2015
Свойства и структура алгоритмов
Общее описание алгоритма
Алгоритм Пурдома[1] находит транзитивное замыкание ориентированного графа за время [math]\displaystyle{ O(\mu n) }[/math], где [math]\displaystyle{ \mu \le m }[/math] – число рёбер, соединяющих компоненты сильной связности этого графа.
Математическое описание
Алгоритм основан на следующих свойствах:
- Если вершины [math]\displaystyle{ v }[/math] и [math]\displaystyle{ w }[/math] принадлежат одной компоненте сильной связности графа [math]\displaystyle{ G }[/math], то его транзитивное замыкание [math]\displaystyle{ G^+ }[/math] содержит рёбра [math]\displaystyle{ (v, w) }[/math] и [math]\displaystyle{ (w, v) }[/math].
- Если вершины [math]\displaystyle{ x }[/math] и [math]\displaystyle{ y }[/math] принадлежат одной компоненте сильной связности графа [math]\displaystyle{ G }[/math], а вершины [math]\displaystyle{ z }[/math] и [math]\displaystyle{ t }[/math] – другой, то рёбра [math]\displaystyle{ (x, z) }[/math], [math]\displaystyle{ (x, t) }[/math], [math]\displaystyle{ (y, z) }[/math], [math]\displaystyle{ (y, t) }[/math] принадлежат или не принадлежат транзитивному замыканию [math]\displaystyle{ G^+ }[/math] одновременно.
Таким образом, поиск транзитивного замыкания графа [math]\displaystyle{ G }[/math] сводится к поиску транзитивного замыкания ациклического графа [math]\displaystyle{ \tilde G }[/math], полученного из [math]\displaystyle{ G }[/math] схлопыванием каждой компоненты сильной связности в одну вершину. Транзитивное замыкание ациклического графа вычисляется с использованием топологической сортировки вершин графа.
Вычислительное ядро алгоритма
Макроструктура алгоритма
Вычисления производятся в четыре этапа:
- Найти компоненты сильной связности исходного графа, заменить каждую компоненту на одну вершину и удалить образовавшиеся рёбра-петли.
- Выполнить топологическую сортировку полученного ациклического графа [math]\displaystyle{ \tilde G }[/math].
- Вычислить транзитивное замыкание графа [math]\displaystyle{ \tilde G }[/math], двигаясь от вершин с бо॑льшими номерами к меньшим.
- По найденному транзитивному замыканию [math]\displaystyle{ \tilde G }[/math] восстановить транзитивное замыкание исходного графа.
Последний этап не является обязательным, если рассматривать транзитивное замыкание [math]\displaystyle{ \tilde G }[/math] как «упакованное» транзитивное замыкание [math]\displaystyle{ G }[/math].
Описание схемы реализации последовательного алгоритма
Последовательная сложность алгоритма
Информационный граф
Описание ресурса параллелизма алгоритма
Описание входных и выходных данных
Свойства алгоритма
Программная реализация алгоритмов
Особенности реализации последовательного алгоритма
Описание локальности данных и вычислений
Возможные способы и особенности реализации параллельного алгоритма
Масштабируемость алгоритма и его реализации
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
- Boost Graph Library (функция
transitive_closure).
Литература
- ↑ Purdom, Paul, Jr. “A Transitive Closure Algorithm.” Bit 10, no. 1 (March 1970): 76–94. doi:10.1007/BF01940892.