我有一组非树的有向非循环图形,其意义如下:每个图形都有 root ,并且顶点被组织成级别,这样如果 v 1 和 v 2 是顶点,如果 v 1 的等级小于 v 2 的等级,则没有边缘从图中的 v 2 到 v 1 ,尽管 v <可能有很多边缘/ em> 1 到相同或更高级别的顶点。例如,表达式树,函数调用图或线性类层次结构将是这种图的示例。以下是此类图表的示例:
A1
/ \ A1 -> A4, A3
/ \ A3 -> A2, A6, A7
A4 A2--A3 A2 -> A6
| \ / \
A6 \_ A7
有很多图形绘制算法,我无法确定哪种算法最适合这种情况。一些初步研究表明,绘制Hasse图的算法可能是合适的,但似乎这些算法的输出并不适合我试图建模的数据结构类型。还有几种用于建模分层数据的算法,但我不确定哪种算法可以平衡实现的简易性和效率。前一种方法的一个问题是这些图有根,也有方向。如果可能,算法将支持循环图,并最小化数值计算的数量,但这不是必需的。出于这些原因,我宁愿避免使用强制导向算法,如果可能的话,还要避免使用GraphViz算法,例如 dot 。
答案 0 :(得分:1)
如果它只是一棵树,那么我之前看到这个Reingold–Tilford Tree drawing algorithm工作得非常好。
顺便说一下,我觉得让节点A2'上升'到与其祖先相同的水平的决定并没有真正帮助那么多。相反,我会允许节点进一步下降而不是上升。 如下所示,我可以更好地绘制示例。
A1
/ \ A1 -> A4, A3
/ \ A3 -> A2, A6, A7
A4 A3 A2 -> A6
/ | \
A2 | A7
\ |
A6
这样您甚至不需要标记边缘方向。 [我误解了你原来的图表吗?我认为A2和A7之间没有优势吧?]
答案 1 :(得分:1)
这不是一个真正的答案,但是评论太长了。
您的图表与一般有向无环图有何不同?
DAG不必有根,但我认为绘制图形没什么区别。
就级别而言,对于任何DAG,可以定义函数级别(v),使得对于任何边缘v i →v j ,级别(i)≤(j)级。平凡级函数是顶点的拓扑顺序中的顶点索引。另一个是从根到顶点的最长路径的长度。
Reingold-Tilford树绘制算法绘制有序树(即,从顶点边缘排序的树)。您的示例表明您的图形没有排序,实际上您面临的主要问题是找到边缘排序,从而最大限度地减少边缘交叉。所以这可能是您要解决的问题。 (这不是一个容易的问题。)
根据我的经验, dot
实际上与DAG相当不错,尽管它有时需要一些帮助。特别是,如果您知道每个顶点的级别,则可以使用属性“rank =”same“'为每个级别创建一个子图。 (见this example。)