Дискретка_Экзамен_Ответы / отн / 3 транзитивное замыкание
.docx3.6. Замыкание отношений
Пусть A и С – отношения на множестве М. Тогда отношение C называется замыканием отношения A относительно свойства S, если оно является пересечением всех отношений, обладающих свойством S и содержащих A в качестве подмножества, т.е. С - это отношение, наименьшее по мощности из всех отношений, обладающих свойством S и содержащих A в качестве подмножества.
Для того, чтобы получить замыкание отношения А относительно свойства S, в него нужно добавить минимально возможное количество пар, после чего полученное отношение будет обладать свойством S.
Транзитивное замыкание отношения A можно получить объединением всех положительных степеней отношения A от 1 до N-1, где N – мощность множества М, на котором построено отношение A.
Алгоритм 3.10 (рис.3.15) вычисления транзитивного замыкания отношения А.
Вход: А - двумерный массив, хранящий матрицу отношения А на множестве М;
N - мощность множества М.
Выход: С - двумерный массив, хранящий матрицу транзитивного замыкания отношения А.
Рис.3.15. Блок-схема алгоритма вычисления транзитивного замыкания
Существует наглядная интерпретация понятия транзитивного замыкания в терминах представления отношения в виде графа. Пусть дан граф, представляющий отношение А. Пара (a,b) принадлежит транзитивному замыканию отношения А тогда и только тогда, когда в графе
отношения А есть цепочка дуг, ведущая из вершины a в вершину b.
Для того, чтобы построить граф отношения С, являющимся транзитивным замыканием отношения А, изготовим копию графа отношения А. Затем будем отыскивать такие тройки вершин a, b и c, для которых в графе есть дуги из a в b и из b в c. Для каждой такой тройки добавим в граф дугу из a в c, если такой дуги ещё нет. Когда таким способом уже нельзя добавить новых дуг, каждые две вершины, соединённые цепочкой дуг, оказываются соединёнными одной дугой. Следовательно, построение закончено и граф транзитивного замыкания отношения А получен.
Для того чтобы систематизировать процесс добавления дуг, будем последовательно рассматривать все вершины графа с первой до последней. Для каждого пути длины два, проходящего через рассматриваемую вершину, проведём дугу из начальной вершины этого пути в его конечную вершину. Граф транзитивного замыкания отношения А будет построен после однократного исследования всех вершин графа. Повторное исследование вершин не может добавить новых дуг (доказано Уоршаллом в 1962 году).
Рассмотрим пример.
Отношение А задано графом на рис.3.16.
1
2
5
4
3
Рис.3.16. Граф отношения A
Анализируя вершину 1 видим дуги из 5 в 1 и из 1 в 2, образующие путь длины два и проходящий через вершину 1, поэтому добавляем дугу из 5 в 2 (рис.3.17,а). В вершину 2 теперь входят три дуги из 1, 4 и 5, а выходит одна дуга в вершину 3, поэтому добавляем дуги из 1 в 3, из 4 в 3, а дуга из 5 в 3 уже есть (рис.3.17,б). Из третьей вершины дуги не выходят, поэтому ничего не добавляем. Из четвёртой вершины ребро идёт в неё же и выходит во вторую, в этом случае новые дуги не добавляются. В пятую вершину дуги не входят, поэтому новые дуги не вводим. Т.о. исследованы все вершины графа, добавлены все необходимые дуги и граф (рис.3.17,б) транзитивного замыкания отношения А получен.
1
1
2
5
2
5
4
4
3
3
а) б)
Рис.3.17. Формирование транзитивного замыкания отношения А
Алгоритм 3.11 (рис.3.18) вычисления транзитивного замыкания отношения А основан на рассмотренном выше принципе (алгоритм Уоршалла).
Вход: А - двумерный массив, хранящий матрицу отношения А на множестве М;
N - мощность множества М.
Выход: С - двумерный массив, хранящий матрицу транзитивного замыкания отношения А.
Транзитивное замыкание
C := A
z:=1,N
x:=1, N
y:=1, N
Cx,y:=Cx,y or Cx,z and Cz,y
Конец
Рис.3.18. Блок-схема алгоритма вычисления транзитивного замыкания