Java Web 应用程序中的有向无环图遍历
Directed Acyclic Graph Traversal in Java Web Application
所以我正在构建一个 Web 应用程序,您可以在其中构建一个有向图,其中一个节点将代表一些操作,而边将代表这些操作之间的数据流。因此对于边 {u,v} , u 必须在 v 之前 运行 。 Click this link to see a sample graph
START节点表示初始值,除输出外的其他节点按指定操作。输出节点将输出它作为输入接收的值。
我应该使用哪种算法方法来处理这样的图形?
这是拓扑排序的一个完美例子。通过遍历按照顺序要求创建集合的最常见算法是 Kahn's Algorithm。伪代码可以在下面看到,维基百科中的信息 link 应该足以让你入门。
L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
remove a node n from S
add n to tail of L
for each node m with an edge e from n to m do
remove edge e from the graph
if m has no other incoming edges then
insert m into S
if graph has edges then
return error (graph has at least one cycle)
else
return L (a topologically sorted order)
请注意 "starting node" 将通过在图中正确表示传入边来强制执行。它将是 S
中唯一开始的节点。如果您需要任何其他信息,请在评论中告诉我。
所以我正在构建一个 Web 应用程序,您可以在其中构建一个有向图,其中一个节点将代表一些操作,而边将代表这些操作之间的数据流。因此对于边 {u,v} , u 必须在 v 之前 运行 。 Click this link to see a sample graph
START节点表示初始值,除输出外的其他节点按指定操作。输出节点将输出它作为输入接收的值。
我应该使用哪种算法方法来处理这样的图形?
这是拓扑排序的一个完美例子。通过遍历按照顺序要求创建集合的最常见算法是 Kahn's Algorithm。伪代码可以在下面看到,维基百科中的信息 link 应该足以让你入门。
L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
remove a node n from S
add n to tail of L
for each node m with an edge e from n to m do
remove edge e from the graph
if m has no other incoming edges then
insert m into S
if graph has edges then
return error (graph has at least one cycle)
else
return L (a topologically sorted order)
请注意 "starting node" 将通过在图中正确表示传入边来强制执行。它将是 S
中唯一开始的节点。如果您需要任何其他信息,请在评论中告诉我。