要快速检查有向非循环图的某个节点在另一个节点之前,之后还是与之平行,需要什么索引信息?

时间:2018-12-23 01:58:38

标签: graph-theory directed-acyclic-graphs topological-sort

我试图找到一种快速的方法来检查有向无环图的两个节点的相对顺序。一个节点可以在另一个节点之前,之后或与之平行。这是一个示例:

DAG illustration: A->B, A->C, A->D, B->F, C->E, D->H, E->G, E->H, F->I, G->I, H->I, H->J, I->K, J->K

节点H在A,C,D和E之后,但与B,F和G平行,并且在I,J和K之前。

我想找到一种方法,通过在构建图时建立一个索引(或几个索引),以最少的图遍历来进行这种节点比较。理想情况下,每次添加节点或边线时,只需设置其索引,而无需更新其周围的其他值。我不确定是否有可能,但感觉有可能吗?

我最初的方法做得不太好。这是我尝试构造不同图形的最初思考过程的4个步骤的说明:

1: A->B | (A=1;B=128). 2: A->C, C->B | (A=1;B;128;C=64). 3: A->C, A->D, C->B, D->B | (A=1;B=128;C=64;D=64). 4: A->C, A->D, C->E, D->B, E->B | (A=1;B=128;C=64;D=64,2;E=96).

  1. 我为端点B分配了一个高值(128)作为索引。
  2. 将边缘一分为二,我将中途值64分配给C。在任何两点之间仍然保持比较。
  3. 我再次并行连接A和B。它也是64的一半,并且比较仍然有效:D等于(平行)于C。
  4. 我拆分了CB链接,使新节点E的值为96。现在情况变得很奇怪了。由于E(96)大于D(64),因此比较不再有效,但需要并行。我尝试返回到步骤3,并向D添加第二个值2,以指示其处于打开状态。现在,如果我将D与E进行比较,那么我首先要检查分支值是否相等(默认分支值为1)。

此后,方法崩溃。我给B什么分支值?如果我将一条边从D添加到E,会发生什么?也许我需要继续添加很多分支值,但是似乎这种方法可能导致每个索引增长到图形本身的大小。我想尽可能地保持其内存效率,尽管我可以做一些时间/空间折衷,并进行一些局部的图形遍历,如果这样做是值得的。

有人知道这个问题的解决方案吗,或者我可以用来进一步研究的一些搜索词?谢谢!

编辑:看来我正在寻找拓扑顺序。尽管它不会告诉我两个节点是否并行,但现在可能足够了。我的新问题是,添加新的节点和边时,如何有效地更新拓扑排序数据?

0 个答案:

没有答案