【问题标题】:Create a DAG given leaf nodes给定叶节点创建 DAG
【发布时间】:2015-04-28 17:06:55
【问题描述】:

假设我们有一个带有单个叶节点 leafN 的 DAG。每个节点都是一个包含父节点列表的对象。节点类可以是 class Node(Object, List[Node]

如何从leafN构造DAG?

例如,给定叶节点 leafD 有两个父节点,leafD(Object@123, List(leafC(leafA(null)), leafB(leafA(null)))) 它的 DAG 将是:

    leafA
   /     \
 leafB  leafC
    \    /
    leafD

leafA(leafB(leafD(null)), leafC(leafD(null)))(为了清楚起见,我忽略了来自每个节点的对象。)

简而言之,我们有一个带有父指针的叶节点,它本身也有父指针,最后,在应用算法之后,我们想要一个 root 节点,它带有指向子节点的指针,而子节点还有指向子节点的指针.

代码不是必需的,算法或任何链接就足够了。

【问题讨论】:

  • 你是什么意思“创建”你的意思是创建一个可视化的吗?
  • @amit:不,不是可视化。我想要来自leafD(42, List(leafC(leafA(null)), leafB(leafA(null))))leafA(leafB(leafD(null)), leafC(leafD(null)))。忽略每个节点的整数,这些是简单的部分。

标签: algorithm directed-acyclic-graphs


【解决方案1】:

您需要做的就是将您的节点放入一些数据结构中,以便您轻松找到节点。如果您的节点中的整数值是连续的(或接近它)并且从一个小数字开始,那么您可以使用一个数组并将整数 i 的节点放在数组的位置 i (这使得在节点中包含整数有点多余)。

这一切都在这个网站上得到了很好的解释(但请注意,在他们的实现中,列表是边缘,而不是边缘)http://algs4.cs.princeton.edu/42directed/

【讨论】:

  • 我修改了问题以分散对实际值的关注。在我的情况下,它们是对象而不是整数。
  • “他们的实现列表是边缘,而不是边缘)”......这就是重点,我有父母而不是孩子的名单,并且想要终于反过来了。
  • 其实你的新问题让我很困惑。你想要一个输入父指向节点并输出子指向节点的函数吗?
  • 是的。算法,功能什么的。
【解决方案2】:

这很简单,只要您意识到理论上只有 DAG 中边的方向发生了变化。

您有一个Child ---> Parent 关系,而不是Parent ---> Child 节点关系。

因此,您需要做的就是根据给定的关系构造一个 DAG,假设子节点实际上是父节点,而父节点是子节点。

所以你最终得到了

    leafD
   ↙     ↘
 leafB  leafC
   ↘     ↙
    leafA

现在,您需要做的就是反转 DAG 中的边缘。

这很简单,一种方法是遍历 DAG,获取所有边缘关系,然后将它们一一反转。

另一种方法是使用级别顺序遍历递归地执行此操作。

查看this question,了解有关如何反转 DAG 的更多解决方案。

【讨论】:

  • 哇,很干净。
猜你喜欢
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多