Graph 这种类型的图是什么?我可以使用什么算法来遍历它?
我有一个“节点”网络,每个节点产生“结果”。每个节点和结果都有一个唯一的名称/id。结果用作每个节点的输入和输出。当一个节点的所有输入结果都可用时,可以执行该节点。当节点完成执行时,其输出结果将可用 例如:Graph 这种类型的图是什么?我可以使用什么算法来遍历它?,graph,Graph,我有一个“节点”网络,每个节点产生“结果”。每个节点和结果都有一个唯一的名称/id。结果用作每个节点的输入和输出。当一个节点的所有输入结果都可用时,可以执行该节点。当节点完成执行时,其输出结果将可用 例如: input node output A x x B y,z x,z C q 在上述网络中。节点A没有输入,可以先执行。然后,当结果x变得可用时,可以执行B。当A和B都完成时,C可以执行,因为它取决于A和B的结果。结果也可以是最终产品,如本例
input node output
A x
x B y,z
x,z C q
在上述网络中。节点A没有输入,可以先执行。然后,当结果x变得可用时,可以执行B。当A和B都完成时,C可以执行,因为它取决于A和B的结果。结果也可以是最终产品,如本例中的y,它不用作任何节点的输入
网络可能要复杂得多。每个节点可以产生许多结果,并且可以有许多输入依赖项
我希望能够选择一个结果,比如说“q”,并找出需要执行哪些节点才能到达那里。我想在更大的节点网络中对多个结果执行此操作
我觉得这是一种常见的算法,但我在这方面没有经验。它不像树那样具有层次结构,因为依赖关系可以创建圆。根据我所读到的,我认为它一定是一种森林图
无论如何,它必须是可遍历的。始终至少有一个节点可以首先执行,所有其他节点都应该能够按照某种顺序执行,而不会在两个节点等待对方完成时造成死锁
在代码中描述此网络/其节点的常用方法是什么?这种网络的正式名称是什么?您要查找的名称是“依赖关系图” 用于分解的算法称为“拓扑排序”(参见:) 解决此类依赖关系的最著名工具之一是make 与您的示例对应的Makefile如下所示:
x :
echo node A
y z : x
echo node B
q : x z
echo node C
如您所见,语法与示例表中使用的语法几乎相同。唯一的主要区别是“列”的顺序是颠倒的,而是说“到……我首先需要……”而不是“从……我可以到……”
键入make
可以轻松验证它是否按照您希望的顺序解析节点。这里有一些例子:
make q
* node A
* node B
* node C
make x
* node A
make z
* node A
* node B
(为了使输出更加美观,这是用于上述输出的版本:
x :
@echo " * node A"
y z : x
@echo " * node B"
q : x z
@echo " * node C"
)您要查找的名称是“依赖关系图” 用于分解的算法称为“拓扑排序”(参见:) 解决此类依赖关系的最著名工具之一是make 与您的示例对应的Makefile如下所示:
x :
echo node A
y z : x
echo node B
q : x z
echo node C
如您所见,语法与示例表中使用的语法几乎相同。唯一的主要区别是“列”的顺序是颠倒的,而是说“到……我首先需要……”而不是“从……我可以到……”
键入make
可以轻松验证它是否按照您希望的顺序解析节点。这里有一些例子:
make q
* node A
* node B
* node C
make x
* node A
make z
* node A
* node B
(为了使输出更加美观,这是用于上述输出的版本:
x :
@echo " * node A"
y z : x
@echo " * node B"
q : x z
@echo " * node C"
)除了作为一种图形之外,您想要的语义听起来像是一种带有彩色标记的符号。Petri网上的可达性分析是一个成熟的问题,文献中已有相关算法。也许维基百科的文章会给你一些开始的想法。除了作为一种图形之外,你想要的语义听起来像是一种带有彩色标记的符号。Petri网上的可达性分析是一个成熟的问题,文献中已有相关算法。也许维基百科的文章会给你一些开始的想法。太棒了!这正是我所希望的答案。非常感谢米凯拉:)太棒了!这正是我所希望的答案。非常感谢米凯拉:)