拓扑排序与分组

时间:2010-11-01 21:16:42

标签: java php c++ graph graph-theory

好的,所以在根据输入数据进行拓扑排序时,通常会有多个正确的解决方案,可以对图形进行“处理”,以便所有依赖关系都位于“依赖”它们的节点之前。但是,我正在寻找一个稍微不同的答案:

假设以下数据: a -> bc -> d a必须在b之前,c必须在d之前。{
只有这两个约束,我们有多个候选解决方案:(a b c da c d bc a b d等。但是,我正在寻找创建一种“分组”这些节点的方法,以便在处理组之后,下一组中的所有条目都会依赖它们的依赖关系。对于上面假设的数据,我会寻找像(a, c) (b, d)这样的分组。在每个组中,处理节点的顺序无关紧要(a之前的cb之前的d等,反之亦然)只要组1 <{1}}在处理任何第2组(a, c)之前完成。

唯一额外的问题是每个节点应尽可能在最早的组中。请考虑以下事项:
(b, d)
a -> b -> c
d -> e -> f

x -> y的分组方案在技术上是正确的,因为(a, d) (b, e, x) (c, f, y)x之前,更优化的解决方案是y,因为群组中有(a, d, x) (b, e, y) (c, f) 2意味着x依赖于组1中的某个节点。

关于如何做到这一点的任何想法?


编辑:我想我设法将一些解决方案代码拼凑在一起。感谢所有帮助过的人!

x

2 个答案:

答案 0 :(得分:6)

标记级别值为0的所有根节点。标记级别值为parent + 1的所有子节点。如果正在重新访问节点,即已经分配了一个级别值,请检查先前分配的值是否低于新值。如果是这样,请使用较高的值更新它并将它们传播给后代。

现在,您有多个组,因为有唯一级别标签0 ... K

答案 1 :(得分:-1)

我最近实现了这个算法。我从你展示的方法开始,但它没有扩展到超过2亿个节点的图形。我最终得到的解决方案基于the approach detailed here

您可以将其视为计算每个节点的高度,然后结果是给定高度的每个节点的一组。

考虑图表:

A - &gt; X

B - &gt; X

X - &gt; ÿ

X - &gt; ž

所以期望的输出是(A,B),(X),(Y,Z)

基本方法是找不到任何东西使用它(本例中为A,B)。所有这些都在0高度。

现在从图中删除A和B,找到任何现在没有使用它的东西(在本例中为X)。所以X的高度为1。

从图中删除X,找到任何现在没有使用它的东西(在本例中为Y,Z)。所以Y,Z的高度为2。

您可以通过实现以下事实进行优化:您不需要为所有内容存储双向边缘或实际从图形中删除任何内容,您只需要知道指向节点的事物数量和您知道的节点处于下一个高度。

所以在开始的这个例子中:

  • 0件事使用1
  • 0件事使用2
  • 2件事使用X(1和2)
  • 1件事使用Y,Z(X)

访问节点时,减少它指向的每个节点的数量,如果该数字变为零,则表示该节点处于下一个高度。