Tengo un registro que describe un gráfico como conjuntos de nodos y bordes:Unión-encontrar en una estructura gráfica
data MyGraph a = MyGraph {
nodes :: Set a,
edges :: Set (a,a),
components :: UnionFindM a -- ?
}
emptyGraph = MyGraph{
nodes = empty, edges = empty,
components = emptyUnionFind singleton union --?
}
addEdge g (a,b) = g{
edges = (a,b) `insert` (edges g),
components = (components g) >>= (equate a b) -- ?
}
Ya que no volverá a eliminar los bordes, quiero realizar un seguimiento de los componentes conectados mediante una unión -find structure (que podría actualizar fácilmente cuando agregue un borde), porque quiero mapear sobre los componentes conectados, por lo que sería útil mantenerlos como un conjunto de conjuntos, también. Y, por supuesto, quiero obtener el componente para un nodo.
Encontré la biblioteca equivalence, que elegí porque no puedo ver cómo crearía conjuntos con union-find y persistent-equivalence necesita conocer el rango de valores.
Ahora puedo crear relaciones, y devolver el conjunto de conjuntos usando:
import Control.Monad(liftM)
import Data.Equivalence.Monad
import Data.Set(singleton, union, fromList)
f = runEquivM singleton union $ do
equate "foo" "bar"
equate "bar" "baz"
(liftM fromList) $ mapM classDesc ["foo","bar","baz","one","two"]
>>> f
fromList [fromList ["bar","baz","foo"],fromList ["one"],fromList ["two"]]
Pero: el uso de fromList
es muy ingenua, debería ser posible conseguir todas las clases de equivalencia de la estructura interna de datos directamente.
Y, más importante aún, ¿cómo puedo almacenar la relación de equivalencia en mi estructura de datos?
¡Gracias por los papeles! Olvidé mencionar en mi pregunta: no sé el tamaño del gráfico de antemano, por lo que [la equivalencia persistente] (http://hackage.haskell.org/package/persistent-equivalence-0.3) no es adecuado ya que tiene que saber el rango en la construcción ... – pascal