Algorithm 创建DAG表格表示的算法?

Algorithm 创建DAG表格表示的算法?,algorithm,directed-acyclic-graphs,tabular,Algorithm,Directed Acyclic Graphs,Tabular,给定一个DAG,其中每个节点都属于一个类别,如何将该图转换为每个类别都有一列的表?转换不必是可逆的,但应保留有关图形结构的有用信息;并且应该是一种“自然”的转换,从这个意义上说,查看图表和表格的人不应该对任何一行感到惊讶。它也应该是紧凑的,即只有很少的行 例如,给定一个具有边a1->b1,a1->b2,b1->c1,b2->c1的节点a1,b1,b2,c1的图(即菱形图),我希望看到下表: a b c -------- a1 b1 c1 a1 b2 c1 我对这个问题考虑了很多,但是我很难

给定一个DAG,其中每个节点都属于一个类别,如何将该图转换为每个类别都有一列的表?转换不必是可逆的,但应保留有关图形结构的有用信息;并且应该是一种“自然”的转换,从这个意义上说,查看图表和表格的人不应该对任何一行感到惊讶。它也应该是紧凑的,即只有很少的行

例如,给定一个具有边a1->b1,a1->b2,b1->c1,b2->c1的节点a1,b1,b2,c1的图(即菱形图),我希望看到下表:

a  b  c
--------
a1 b1 c1
a1 b2 c1
我对这个问题考虑了很多,但是我很难想出一个算法,在某些图形上给出直观的结果。考虑图A1,B1,C1,边A1-> C1,B1-> C1。我想要生成此表的算法:

a  b  c 
--------
a1 b1 c1
但也许它应该产生这样的结果:

a  b  c 
--------
a1    c1
a1 b1
我正在寻找对这个问题的创造性想法和见解。如果你认为这会有帮助的话,可以随意改变以简化或限制问题

头脑风暴

编辑:

转换应始终生成相同的行集,尽管行的顺序无关紧要


当使用Excel等进行排序和筛选时,表格应表现良好。这意味着不能将多个节点打包到表的单个单元格中-每个单元格中只有一个节点。

如何将一个节点中的所有可访问节点压缩到一个单元格中?例如,您的第一个DAG应如下所示:

a   b        c
---------------
a1  [b1,b2]  
    b1       c1
    b2       c1

你需要的是一个不同的。这是一种对图形顶点进行“排序”的算法,就像
a-->b
edge意味着
a>b
一样。由于图形是DAG,因此其中没有循环,并且此关系是可传递的,因此至少存在一个排序顺序

对于菱形图,存在两种拓扑顺序:

a1 b1 b2 c1
a1 b2 b1 c1
b1
b2
项目没有连接,甚至是间接连接,因此它们可以按任何顺序放置

对图形排序后,就知道了顺序的近似值。我的建议是以一种简单的方式填充表格(每行1个顶点),然后“压缩”表格。执行排序并选择作为输出的序列。从上到下填充表格,将顶点指定给相关列:

a  b  c
--------
a1 
   b2 
   b1
      c1
现在,通过从上到下行走(然后从下到上进行类似的移动)来压缩桌子。在每次迭代中,您都会仔细查看“当前”行(标记为
=>
)和“下一个”行

  • 如果列中当前节点和下一个节点的节点不同,则不对此列执行任何操作:

         from     ---->      to
       X  b  c            X  b  c
       --------           --------
    => X1 .  .           X1 .  .
       X2 .  .        => X2 .  .
    
  • 如果在下一行的列
    X
    中没有顶点(表格单元格为空),而在当前行中有顶点
    X1
    ,则有时应使用当前行中的顶点填充此空单元格。但并非总是这样:你希望你的桌子合乎逻辑,不是吗?因此,当且仅当当前行中的所有顶点都没有边
    b-->X1
    c-->X1
    等时,才复制顶点

         from     --->      to
       X  b  c           X  b  c
       --------          --------
    => X1 b  c           X1 b  c
          b1 c1       => X1 b1 c1
    
  • (编辑:)在第一次(向前)和第二次(向后)传递之后,您将拥有以下表格:

     first       second
    a  b  c     a  b  c 
    --------    --------
    a1          a1 b2 c1     
    a1 b2       a1 b2 c1  
    a1 b1       a1 b1 c1  
    a1 b1 c1    a1 b1 c1
    
    然后,只需删除相等的行即可:

    a  b  c 
    --------
    a1 b2 c1  
    a1 b1 c1  
    

    你应该有一张漂亮的桌子。O(n^2)。

    这听起来像是一张火车系统地图,车站位于区域(a、b、c)内

    您可以生成一个包含一个方向上所有可能路线的表。在这种情况下,“a1,b1,c1”似乎意味着a1->b1,所以如果只有a1->c1,b1->c1,不要这样格式化它

    您可以通过列出从a区开始的最长路线来决定生成一个表, 每个边只使用一次,以较短的剩余路线结束。或者仅当边连接未使用的边或延伸管线时,才允许重复使用这些边


    换句话说,执行深度优先搜索,尝试不重用边(拒绝任何不包含未使用边的路径,并可以选择在端点修剪已使用的边)。

    以下是我最后要做的:

    • 查找从节点发出的所有路径,但不包含边。(对于某些图形来说可能很昂贵,但对于我的图形来说是可行的)
    • 遍历每个路径以收集一行值
    • 压缩行
    压缩行的步骤如下所示

    • 对于每对列x,y
      • 将x的每个值映射到y的可能值
      • 为只有一个不同值y的条目创建另一个映射,将x的值映射到其单个值y
    • 用这些地图填空。填写值时,请检查可填写的相关空格

    这提供了一个非常紧凑的输出,似乎满足了我的所有要求

    这不是我在桌子上想要的。我想,重要的是,表在关系上表现得很好,从某种意义上说,我希望能够对列进行排序,并在Excel中使用例如AutoFielter进行筛选。这种表示方式与该目标不兼容。谢谢你的建议!这是一个有趣的方法。然而,我想知道它是否是确定性的——结果是否取决于您选择的拓扑顺序,至少对于更复杂的DAG是这样的?我不在乎同一组行是否会产生不同的顺序,但如果有一种算法可以产生不同的行,我会很不高兴。我将更新问题以反映这一要求。我尝试使用带有边a1->b1,b1->c1,c1->d1,a1->b2,b2->c2,c2->d1的DAG来执行此操作。我不确定我是否理解第二条规则,所以我没能做到。但关键是这张图的拓扑顺序似乎可以产生不同的结果:a1,b1,c1,b2,c2,d1和a1,b1,b2,c1,c2,d1。你明白我的意思吗?@rattigan,是的,它可以产生不同的结果。您可以执行更具体的压缩来对记录进行排序(例如,为您添加更多边)