Graph 这种类型的图是什么?我可以使用什么算法来遍历它?

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的结果。结果也可以是最终产品,如本例

我有一个“节点”网络,每个节点产生“结果”。每个节点和结果都有一个唯一的名称/id。结果用作每个节点的输入和输出。当一个节点的所有输入结果都可用时,可以执行该节点。当节点完成执行时,其输出结果将可用

例如:

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网上的可达性分析是一个成熟的问题,文献中已有相关算法。也许维基百科的文章会给你一些开始的想法。

太棒了!这正是我所希望的答案。非常感谢米凯拉:)太棒了!这正是我所希望的答案。非常感谢米凯拉:)