假设我在某些任务之间有一堆依赖关系:
A --> B
A --> D
B --> C
C --> D
E --> F
F --> G
这样的A - > B表示B只能在A完成后运行。
我如何能够检测并删除无用的依赖项?
在这种情况下,它" A - > d"原因D取决于C,取决于B和B取决于A.
答案 0 :(得分:2)
将其转换为邻接矩阵,您将获得以下内容:
A B C D E F G
A 0 1 0 1 0 0 0
B 0 0 1 0 0 0 0
C 0 0 0 1 0 0 0
D 0 0 0 0 0 0 0
E 0 0 0 0 0 1 0
F 0 0 0 0 0 0 1
G 0 0 0 0 0 0 0
将此矩阵与其自身相乘将生成一个新矩阵,告诉您使用两个步骤从每个节点到每个节点有多少种不同的方式。 再次相乘,您将看到三个步骤的结果,依此类推。
一般来说,A次k将导致矩阵告诉您从一个节点到另一个节点的不同路径的数量,需要k步。
使用此信息,您可以尝试发现多个路径描述的节点/任务之间的依赖关系。在A和D之间,您将看到A ^ 1(A - > D)和A ^ 3(A - > B - > C - > D)的路径。
一旦发现从节点X到节点Y的这些多条路径,就可以删除原始邻接矩阵中的直接依赖关系。
答案 1 :(得分:0)
我设法找到一个比stuXnet提出的更容易实现的解决方案。
使用Jung library,我检查给定依赖项的每对之间是否有多个可用路径。如果是这种情况,那么这种依赖肯定是不必要的,所以我只需要删除相应的边缘。