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

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Строка 19: Строка 19:
 
# Найти [[Связность в графах|компоненты сильной связности]] исходного графа, заменить каждую компоненту на одну вершину и удалить образовавшиеся рёбра-петли.
 
# Найти [[Связность в графах|компоненты сильной связности]] исходного графа, заменить каждую компоненту на одну вершину и удалить образовавшиеся рёбра-петли.
 
# Выполнить топологическую сортировку полученного ациклического графа <math>\tilde G</math>.
 
# Выполнить топологическую сортировку полученного ациклического графа <math>\tilde G</math>.
# Вычислить транзитивное замыкание графа <math>\tilde G</math>, двигаясь от вершин с бо॑льшими номерами к меньшим.
+
# Вычислить транзитивное замыкание графа <math>\tilde G</math>, двигаясь от вершин с бо́льшиминомерами к меньшим.
 
# По найденному транзитивному замыканию <math>\tilde G</math> восстановить транзитивное замыкание исходного графа.
 
# По найденному транзитивному замыканию <math>\tilde G</math> восстановить транзитивное замыкание исходного графа.
  

Версия 11:52, 14 июня 2015

1 Свойства и структура алгоритмов

1.1 Общее описание алгоритма

Алгоритм Пурдома[1] находит транзитивное замыкание ориентированного графа за время O(\mu n), где \mu \le m – число рёбер, соединяющих компоненты сильной связности этого графа.

1.2 Математическое описание

Алгоритм основан на следующих свойствах:

  1. Если вершины v и w принадлежат одной компоненте сильной связности графа G, то его транзитивное замыкание G^+ содержит рёбра (v, w) и (w, v).
  2. Если вершины x и y принадлежат одной компоненте сильной связности графа G, а вершины z и t – другой, то рёбра (x, z), (x, t), (y, z), (y, t) принадлежат или не принадлежат транзитивному замыканию G^+ одновременно.

Таким образом, поиск транзитивного замыкания графа G сводится к поиску транзитивного замыкания ациклического графа \tilde G, полученного из G схлопыванием каждой компоненты сильной связности в одну вершину. Транзитивное замыкание ациклического графа вычисляется с использованием топологической сортировки вершин графа.

1.3 Вычислительное ядро алгоритма

1.4 Макроструктура алгоритма

Вычисления производятся в четыре этапа:

  1. Найти компоненты сильной связности исходного графа, заменить каждую компоненту на одну вершину и удалить образовавшиеся рёбра-петли.
  2. Выполнить топологическую сортировку полученного ациклического графа \tilde G.
  3. Вычислить транзитивное замыкание графа \tilde G, двигаясь от вершин с бо́льшиминомерами к меньшим.
  4. По найденному транзитивному замыканию \tilde G восстановить транзитивное замыкание исходного графа.

Последний этап не является обязательным, если рассматривать транзитивное замыкание \tilde G как «упакованное» транзитивное замыкание G.

1.5 Описание схемы реализации последовательного алгоритма

1.6 Последовательная сложность алгоритма

1.7 Информационный граф

1.8 Описание ресурса параллелизма алгоритма

1.9 Описание входных и выходных данных

1.10 Свойства алгоритма

2 Программная реализация алгоритмов

2.1 Особенности реализации последовательного алгоритма

2.2 Описание локальности данных и вычислений

2.3 Возможные способы и особенности реализации параллельного алгоритма

2.4 Масштабируемость алгоритма и его реализации

2.5 Динамические характеристики и эффективность реализации алгоритма

2.6 Выводы для классов архитектур

2.7 Существующие реализации алгоритма

3 Литература

  1. Purdom, Paul, Jr. “A Transitive Closure Algorithm.” Bit 10, no. 1 (March 1970): 76–94. doi:10.1007/BF01940892.