好的,所以在根据输入数据进行拓扑排序时,通常会有多个正确的解决方案,可以对图形进行“处理”,以便所有依赖关系都位于“依赖”它们的节点之前。但是,我正在寻找一个稍微不同的答案:
假设以下数据:
a -> b
和c -> d
a
必须在b
之前,c
必须在d
之前。{
只有这两个约束,我们有多个候选解决方案:(a b c d
,a c d b
,c a b d
等。但是,我正在寻找创建一种“分组”这些节点的方法,以便在处理组之后,下一组中的所有条目都会依赖它们的依赖关系。对于上面假设的数据,我会寻找像(a, c) (b, d)
这样的分组。在每个组中,处理节点的顺序无关紧要(a
之前的c
或b
之前的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
答案 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。
您可以通过实现以下事实进行优化:您不需要为所有内容存储双向边缘或实际从图形中删除任何内容,您只需要知道指向节点的事物数量和您知道的节点处于下一个高度。
所以在开始的这个例子中:
访问节点时,减少它指向的每个节点的数量,如果该数字变为零,则表示该节点处于下一个高度。