算法
拓扑排序确实是解决问题的好方法;根据您的要求,我不会写出完整的实现。
概述和注释
类型
首先,您可以将requiredInputs
作为类而不是字符串进行编码。这将使比较更加优雅:
class Node1:
requiredInputs = []
class Node2:
requiredInputs = [Node1]
class Node3:
requiredInputs = [Node2]
class Node4:
requiredInputs = [Node3, Node2]
输入和输出数据结构
接下来,你可以将节点放置在两个数组中,一个用于输入,一个用于输出。这可以就地完成(使用单个数组),但很少值得麻烦。
unordered_nodes = [Node4, Node3, Node2, Node1]
ordered_nodes = []
以下是算法概述:
while there are unordered_nodes:
for each node N in unordered_nodes:
if the requiredInputs of N are already in ordered_nodes:
add N to ordered_nodes
remove N from unordered_nodes
break
预期结果
实现后,应该得到:
print ordered_nodes
[<class __main__.Node1 at 0x10a7a8bb0>,
<class __main__.Node2 at 0x10a7a83f8>,
<class __main__.Node3 at 0x10a7a80b8>,
<class __main__.Node4 at 0x10a7a8600>]
优化
有很多方法可以优化或改进拓扑排序。和之前一样,我会给出一些提示而不透露任何实现细节。
- 通过某些属性对输入数组进行预排序
- 使用单个数组就地排序
- 使用不同的数据结构表示节点间的关系
- 在任何迭代中向
ordered_nodes
添加多个节点