【发布时间】:2011-12-14 06:31:59
【问题描述】:
背景: 我有一组节点,它们代表产品在流程中移动时的交集。这些节点连接在一起形成有向图。有几个独立的图,因为产品并不总是相交。
产品总是从一个初始源节点开始,一个没有父节点的节点。它最终会在一个没有子节点的最终目标节点处结束。初始源可能有一个或多个最终目的地,而最终目的地可能有一个或多个初始源。
我们能够编制一份所需初始来源的列表,以遵循用户给出的一组标准。这些来源可能(但不一定)属于同一个图表。
目标: 鉴于此初始来源列表,我需要能够确定哪些初始来源对应于哪些最终目的地。这些来源和目的地必须按图表分组,不得重复。换句话说:
- 将每个节点与其唯一的图形相关联。
- 确定属于每个图的初始来源。
- 确定属于每个图表的最终目的地。
示例:如果我的初始来源列表是 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
显然,由于我们要访问每个节点的所有子节点和所有父节点,因此我们将对之前已经见过的节点进行大量访问,因此会产生一些额外的开销。
【问题讨论】:
-
你能提供更多细节吗? “最终目的地”是什么意思?图形是否以某种方式定向,导致它们最终都指向某个节点?如果图表没有相互连接,那么来源是什么?我很乐意提供帮助,但我不确定我是否理解您的要求。
-
当然,只是尽量简洁。怎么样?