背景: 我有一个节点集合,代表产品在流程中的交集。这些节点连接在一起成为有向图。有几个独立的图表,因为产品并不总是相交。
产品将始终从初始源节点开始,一个没有父节点。它最终将终止于最终目标节点,一个没有子节点。初始源可以具有一个或多个最终目的地,并且最终目的地可以具有一个或多个初始源。
我们能够编制所需初始源列表,以遵循用户给出的一组标准。这些来源可能(但不一定)属于同一图表。
目标: 鉴于这个初始源列表,我需要能够确定哪些初始源与哪个最终目的地相对应。这些源和目标必须按图表分组,不能重复。换句话说:
示例:如果我的初始来源列表是1,2,3,4,5,6,7和8,我会得到以下结果(我的未知目的地是A, C,D,E,G,K,L):
1,4,5,6 -> A,G,K
2 -> C
3 -> D,E
7,8 -> L
问题:执行此任务的有效(并且希望最有效)算法是什么?
当前解决方案,仅供参考:
For each initial source:
If we have not visited the initial source yet
Mark as belonging to a new graph
Add childrens to a list of nodes to visit.
For each node to visit:
If we have not visited this node yet:
Mark as belonging to current graph
If there are no children
add to list of final destinations
End if
add all parents and all children to a list of nodes to visit
End if
Do next node
End if
Do next source
显然,由于我们要访问所有的孩子以及每个节点的所有父母,因为我们将会对我们之前已经看过的节点进行大量访问,因此会有一些额外的开销。
答案 0 :(得分:3)
您描述的算法是Depth First Search。遵循非循环有向图的这类问题可能由Breadth First Search更好地处理。即使图表不是非循环的,这仍然是一种更好的方法。