我正在寻找一种算法来“反转”(反转?从里到外?)一个 DAG:
A* # I can't ascii-art the arrows, so just
/ \ # pretend the slashes are all pointing
B C # "down" (south-east or south-west)
/ / \ # e.g.
G E D # A -> (B -> G, C -> (E -> F, D -> F))
\ /
F
我使用的表示是不可变的,真正的 DAG(没有“父”指针)。我想以某种方式遍历图形,同时构建具有等效节点的“镜像”图形,但节点之间的关系方向倒置。
F*
/ \
G* E D # F -> (E -> C -> A, D -> C -> A), G -> B -> A
\ \ / #
B C # Again, arrows point "down"
\ / #
A #
所以输入是一组“根”(这里是{A})。输出应该是结果图中的一组“根”:{G, F}。(根是指没有传入引用的节点。叶子是没有传出引用的节点。)
输入的根变成输出的叶子,反之亦然。变换应该是自身的逆。
(出于好奇,我想向我用来表示 XML 以进行结构查询的库添加一个功能,通过它我可以将第一棵树中的每个节点映射到第二棵树中的“镜像”(然后返回再次)为我的查询规则提供更多的导航灵活性。)