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 を表現するために使用しているライブラリに機能を追加したいと思います。これにより、最初のツリーの各ノードを 2 番目のツリーの「ミラー イメージ」にマップできます (また、元に戻すことができます)。繰り返します) クエリ ルールのナビゲーションの柔軟性を高めるためです)。