当前位置: 首页 > 知识库问答 >
问题:

拓扑排序依赖图中的边方向?

谢裕
2023-03-14

Wikipedia以一种非常直观的方式(IMO)解释了依赖关系图,引用了当a依赖于B时,a=>B会产生边。换句话说,我们可以通过查看其邻接列表中可用的邻居立即找到任何给定节点的直接依赖关系(如果有的话)。

这似乎是实现依赖的一个明智的方法;它允许我们基本上像执行深度优先遍历(图中每个节点的DFS)一样容易地执行拓扑排序。如果节点表示“任务”,那么只有当任务的所有传递依赖项都已执行/访问时,我们才能执行/访问任务。叶节点是第一个被访问的节点,依此类推。

关于拓扑排序的维基百科页面将定义解释为:

计算机科学中,有向图的拓扑排序或拓扑排序是它的顶点的线性排序,因此对于从顶点u到顶点v的每个有向边uv,u在排序中位于v之前。

这与我期望的“依赖关系图”相反。我们刚刚解释了,如果a依赖于B,则存在一个有向边a=>B,并且我们必须在a之前访问/执行B。但是,根据上面解释的图,由于我们在V之前执行/visit任务U,因此,V依赖于U。因此,如果我没有弄错的话,Wiki的topo排序页面所期望的输入图似乎是一个边反转的“依赖图”。页面上的算法证实了这一点;例如,他们的DFS方法将从节点n开始,递归到依赖于n(而不是n的依赖项)的节点,然后将n前置到某个列表的头部,以便它比其依赖项出现得更早。结果与我解释的DFT相同,明确地说,我并不是说任何一页都是错的,它只是演示了几种做某事的方法。

虽然Wiki有依赖关系图的这种定义,但它似乎在拓扑排序页面上使用了它的相反的定义,通过反向依赖关系的递归,并基本上反向输出列表,这确实让人感到奇怪。

我唯一的问题是:是否有一些明显的原因我忽略了,拓扑排序页面上的预期图基本上与“依赖图”DFN相反?我们从n遍历n的依赖项,并通过记录到堆栈之类的东西来有效地反向输出,这感觉很不直观。

更一般地说,拓扑排序页面所期望的图似乎并不是一个好的依赖图。如果我们认为这个图是规范的“依赖关系图”,那么为了找到n的依赖关系,我们必须遍历整个图,询问“这个节点指向n吗?”,这似乎很奇怪。

共有1个答案

扶文光
2023-03-14

拓扑排序产生与偏序一致的总序。

偏序和DAG是一样的。

我们经常根据依赖图对项目进行拓扑排序······

但我们通常使用的偏序是“必先”图,而不是“依赖”图。这是同一张图,但边反转了。

我认为你错过了两件事:

1)图是数据结构的解释。数据结构不是图。在大多数实际情况下,图算法应用于不是字面上或显式地表示图本身的数据结构。在这种情况下,如果有一个从aB的指针,我们排序的DAG就有一个从Ba的边缘。

2)在DAG中颠倒边仅仅意味着颠倒最终的拓扑排序,或者从另一端开始。这并不重要,所以在口语中,很自然地谈论依赖图的拓扑排序,而不是边颠倒的依赖图的拓扑排序。降序排序仍然是排序,逆拓扑排序仍然是拓扑排序。

 类似资料:
  • 为了表明计算机科学家可以把任何东西变成一个图问题,让我们考虑做一批煎饼的问题。 菜谱真的很简单:1个鸡蛋,1杯煎饼粉,1汤匙油 和 3/4 杯牛奶。 要制作煎饼,你必须加热炉子,将所有的成分混合在一起,勺子搅拌。 当开始冒泡,你把它们翻过来,直到他们底部变金黄色。 在你吃煎饼之前,你会想要加热一些糖浆。 Figure 27将该过程示为图。 Figure 27 制作煎饼的困难是知道先做什么。从 Fi

  • 一、拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。 这样说,可能理解起来比较抽象。下面通过简单的例子进行说明! 例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序

  • 如何输出有向无环图的所有可能的拓扑排序?例如,给定一个图形,其中 V 指向 W 和 X,W 指向 Y 和 Z,X 指向 Z: 如何对此图进行拓扑排序以产生所有可能的结果?我能够使用广度优先搜索来获得V,W,X,Y,Z,并使用深度优先搜索来获得V,W,Y,Z,X。但无法输出任何其他种类。

  • 问题内容: 好的,因此在根据输入数据进行拓扑排序时,通常存在多个正确的解决方案,可以根据这些正确的解决方案对图进行“处理”,以便所有依赖项都位于“依赖”它们的节点之前。但是,我正在寻找稍微不同的答案: 假设以下数据: 和(必须先于并且必须先于)。 只有这两个限制,我们有多种候选方案:( ,, 等)。但是,我正在寻找一种将这些节点“分组”的方法,以便在处理完一组后,下一组中的所有条目都将处理其依赖项

  • 我有一个任务类,它在执行前依赖于其他任务。我想将可以并行化的任务分组并排序。我决定它可以首先表示为DAG,并尝试使用JGrapht。首先,我遍历任务的输入列表,以获取所有具有依赖关系的任务,并将它们收集在一个列表中。然后,对于每个任务,我在图中创建一个顶点。 然后使用相同的列表,我试图创建节点之间的边。 然后我试着把任务分组 因此,结果是有序和分组的任务,例如图 结果将是 然而,当也是的前身时,它

  • 拓扑排序主要解决的问题是给一个图的所有节点排序。 一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: (1)每个顶点出现且只出现一次。 (2)若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(