Busco un algoritmo para "invertir" (?? Revertir vuelta de dentro a fuera) un DAG:Buscando algoritmo para invertir (?? Revertir espejo de vuelta de dentro a fuera) un 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
La representación que estoy usando es inmutable verdaderamente un DAG (no hay punteros "parentales"). Me gustaría recorrer el gráfico de alguna manera mientras construyo un gráfico de "imagen espejo" con nodos equivalentes, pero con la dirección de las relaciones entre los nodos invertidos.
F*
/\
G* E D # F -> (E -> C -> A, D -> C -> A), G -> B -> A
\ \/ #
B C # Again, arrows point "down"
\/ #
A #
Entonces la entrada es un conjunto de "raíces" (aquí, {A}). La salida debe ser un conjunto de "raíces" en el gráfico de resultados: {G, F}. (Por raíz me refiero a un nodo sin referencias entrantes. Una hoja es un nodo sin referencias salientes.)
Las raíces de la entrada se convierten en las hojas de la salida y la visa versa. La transformación debería ser un inverso de sí mismo.
(Para los curiosos, me gustaría añadir una característica a una biblioteca que estoy usando para represento XML para la consulta estructural por el cual puedo mapear cada nodo en el primer árbol su "imagen en espejo" en el el segundo árbol (y de vuelta otra vez) para proporcionar más flexibilidad de navegación para mis reglas de consulta.)
¿Hay alguna razón por la que no pueda almacenar los punteros "principales"? Me imagino que proporcionaría la operación de inversión de forma gratuita, haciendo una búsqueda en profundidad (o lo que sea) comenzando desde el nodo (s) hoja. – Ben