Транзитивное замыкание в двунаправленном графике - PullRequest
1 голос
/ 13 марта 2019

У меня большая структура с предметами и отношениями между предметами.Мне нужно найти все переходные отношения для всех предметов.Я дублирую все ссылки и использую транзитивное закрытие.Например:

A --- B --- C     E --- F --- G
      |
      |
      D

В результате мне нужно получить пары:

A-B, A-C, A-D, B-A, B-C, B-D, C-A, C-B, C-D, D-A, D-B, D-C,
E-F, E-G, F-E, F-G, G-E, G-F

Для использования транзитивного замыкания я должен использовать пары [AB, BA, BC, CB, BD, DB, EF, FE, FG, GF].Это большая проблема для меня, потому что набор данных очень большой.Лучшим способом решения моей проблемы был бы алгоритм, который позволяет получить все отношения, используя только односторонние ссылки (AB, BC, CD, EF, FG).Существуют ли алгоритмы для получения всех отношений для каждого элемента графа без повторяющихся ссылок?

1 Ответ

1 голос
/ 13 марта 2019

Вы можете смоделировать эту проблему как проблему с графиком и обойти весь имеющийся набор данных, используя либо DFS (поиск в глубину), либо BFS (поиск в ширину).Во время обхода вы можете назначить номер компонента каждому дереву в лесу данных, которые вы исследуете, и в результате вы можете найти все подключенные компоненты этого график данных у вас есть.Затем для каждого связанного компонента вы можете просто сформировать группы из 2, используя его членов, и использовать их для описания отношения.Если существует нечетное количество элементов, вы можете выбрать уже использованный элемент и связать его с последним оставшимся.

Это, очевидно, предполагает, что ваша цель - найти только подключенные компоненты, а не печатать отношения , как вы выразились, определенным образом.Например, если вы пытаетесь напечатать links так, чтобы максимальное расстояние между элементами было минимально возможным, проблема становится гораздо более сложной.

Другой подход, который разделяетто же самое предположение, которое я упомянул выше, будет состоять в использовании метода union-find, также известного как структура данных, называемая несвязанным множеством.Вы можете начать с N наборов, которые имеют N из ваших предметов.Затем при прохождении этих отношений для каждого отношения (x, y) вы объединяете множества, содержащие элементы x и y.В конце все подключенные компоненты будут в одном наборе.

Первый подход имеет O(V + E) сложность времени, V и E - количество элементов и отношений в ваших данных, соответственно,Второй подход имеет O(V + E . k(V)) сложность времени, где k - это функция, называемая Inverse Ackermann, которая увеличивается очень медленно.(т.е. даже медленнее, чем логарифмическая функция)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...