拓扑排序变量算法

时间:2010-07-22 13:20:37

标签: algorithm graph topological-sort

我有一组数据需要执行拓扑排序,有一些假设和约束,我想知道是否有人知道一个适合的现有的,有效的算法。

  • 已知数据关系形成DAG(因此无需担心周期)。
  • 从A到B的边缘表示A取决于B,因此B必须在拓扑排序中出现在A之前。
  • 图表未必连接;也就是说,对于任何两个节点N和M,可能无法通过跟随边缘从N到M(即使忽略边缘方向)。
  • 数据关系是单独链接的。这意味着当存在从A到B的边缘时,只有A节点包含有关边缘存在的信息。

问题可以表述如下:

  

给定图S中的一组节点G 可能有也可能没有入边,找到子图G'的拓扑排序G中的所有节点都可以从集合S中的任何节点访问(服从边缘方向)。

这会混淆拓扑排序的常用方法,因为它们要求集合S中的节点没有任何传入边缘,这在我的情况下是不正确的。病理案例是:

A --> B --> D
|     ^     ^
|     |     |
\---> C ----/

S = {B, C}。一个合适的排序是D, B, C,但如果正常的拓扑排序算法在B之前考虑C,那么它最终会以C, D, B结束,这是完全错误的。 (请注意,A未出现在生成的排序中,因为它无法从S访问;它是一个示例,其中S中的所有节点都可能有传入边缘< / p>

现在,我必须想象这是一个长期解决的问题,因为当你在一个安装命令中指定多个包时,这基本上就像aptyum这样的程序。但是,当我搜索像“依赖性解析算法”这样的关键短语时,我会得到描述正常拓扑排序的结果,这些结果不能处理这种特殊情况。

我可以想到几种方法来做到这一点,但没有一种方法看起来特别优雅。我想知道是否有人有一些指向适当算法的指针,最好是一个可以在数据上单次传递的算法。

2 个答案:

答案 0 :(得分:3)

我认为你不会找到一个可以通过数据传递来实现这一目标的算法。我将执行广度优先搜索,从S中的节点开始,然后对结果子图进行拓扑排序。

答案 1 :(得分:1)

我认为你可以对整个图进行拓扑排序,然后只选择可以从节点集中到达的节点(你可以从集合中的节点进行一些深度优先搜索,按顺序在排序,如果之前没有访问过,你将进入节点的子树。)