【问题标题】:Directed Acyclical Graph Traversal... help?有向无环图遍历...帮助?
【发布时间】:2018-01-10 10:04:12
【问题描述】:

这里有点超出我的深度,需要给朋友打电话。我有一个需要遍历的有向无环图,我第一次跌跌撞撞地进入图论。我最近读了很多关于它的书,但不幸的是我没有时间在学术上弄清楚这一点。有人可以帮我解决一下如何处理这棵树吗?

规则如下:

  • n 个根节点(我称它们为“源”)
  • n个端节点
  • 源节点带有一个数值
  • 下游节点(我称它们为“工作”节点)对传入的值执行各种操作,例如 Add、Mult 等。

从下图中可以看出,节点abc需要在def之前处理。

走这棵树的正确顺序是什么?

【问题讨论】:

    标签: graph traversal directed-acyclic-graphs


    【解决方案1】:

    我会研究 DAG 的线性化,这应该可以通过拓扑排序实现。

    据我所知,线性化基本上按照不变量的顺序进行排序,即对于与任何其他给定节点NodeANodeX 具有出度的所有节点 (Node_X) 都出现在 NodeA 之前。

    这意味着,从您的示例中,节点 a、b 和 d 将首先被处理。第二个节点c。节点 e 和 f,最后。

    http://en.wikipedia.org/wiki/Topological_sorting

    【讨论】:

    • 我目前正在存储一个节点,它是图中每个条目的下游邻居 (guided by this)。我开始认为我需要放弃这个并单独存储边缘。您是否有可能使这些依赖关系比较更容易的存储格式建议?
    • @vfxcode - 如果每个节点都有上游父节点列表可能会有所帮助。
    • 实际上,给定节点的父节点列表,如missingno 所建议的,将有助于检查被迭代的节点是否有任何进一步的传入边。如果没有,您会将其插入列表 S。我指的是 Wikipedia 页面中概述的拓扑排序算法。
    • 我想我最困惑的(对不起)是遍历的方向。由于我正在检查已知输入,我是在上游走、随机检查节点还是下游走?
    • 不太清楚你的意思,但在算法中,你从源节点列表 S(“顶部”)开始。然后在枚举 S 时。在枚举 S 的给定元素 s 时,删除所有边 (s,v),其中 v 是 s 的“子”。如果 v 不再有传入边(您在此处检查高于 v 的级别),则将 v 添加到 S。
    【解决方案2】:

    您需要通过Topological sort 处理节点。排序不一定是唯一的,因此可能有多个可用的订单(这并不重要)。

    链接的维基百科页面应该有具体的算法来帮助你。

    【讨论】:

    • 感谢您的回答,Nadir 的只是稍微复杂一点。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多