双向图的传递闭合

时间:2019-03-12 21:07:33

标签: algorithm math graph-theory discrete-mathematics transitive-closure

我的项目结构很大,项目之间也有关系。 我需要找到所有项目的所有传递关系。我复制所有链接并使用传递闭包。例如:

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

对于使用传递闭包,我应该使用对[A-B,B-A,B-C,C-B,B-D,D-B,E-F,F-E,F-G,G-F]。 这对我来说是个大问题,因为数据集非常大。 解决我的问题的最好方法是一种算法,该算法只允许使用单边链接(A-B,B-C,C-D,E-F,F-G)获得所有关系。 是否有任何算法可以获取没有重复链接的图的每个元素的所有关系?

1 个答案:

答案 0 :(得分:1)

您可以将此问题建模为图形问题,并使用DFS(深度优先搜索)或BFS(宽度优先搜索)遍历您拥有的整个数据集。在遍历期间,您可以为要调查的数据的中的每个分配一个组件号,结果,您可以找到此< em> graph 您所拥有的数据。然后,对于每个连接的组件,您可以简单地使用其成员形成2人一组,并使用它们描述关系。如果元素数量奇数,则可以选择一个已使用的项目并将其链接到剩余的最后一个项目。

这显然假定您的目标是仅查找连接的组件,而不是按照特定方式打印您所说的 relations 。例如,如果您尝试打印链接,以使项目之间的最大距离尽可能小,则问题将变得更加复杂。

与我上面提到的假设相同的另一种方法是使用联合查找方法,也称为称为不交集的数据结构。您可以从具有N个项目的N个集合开始。然后,遍历这些关系时,对于每个关系(x, y),您将包含项xy的集合结合在一起。最后,所有连接的组件将位于同一集合中。

第一种方法的时间复杂度为O(V + E)VE分别是数据中项目的数量和关系。第二种方法具有O(V + E . k(V))的时间复杂度,其中k是一个称为Inverse Ackermann的函数,其增加非常缓慢。 (即比对数函数还要慢)