Ich habe einen Rekord ein Diagramm als Sätze von Knoten und Kanten beschreiben:Union findet in einer Graphenstruktur
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) -- ?
}
Da ich nicht immer Kanten entfernen werde, möchte ich die angeschlossenen Komponenten verfolgen eine Vereinigung mit -Findung der Struktur (die ich beim Hinzufügen einer Kante leicht aktualisieren könnte), weil ich die verbundenen Komponenten überlagern möchte, also wäre es nützlich, sie auch als eine Menge von Mengen zu behalten. Und natürlich möchte ich die Komponente für einen Knoten bekommen.
Ich fand die equivalence Bibliothek, die ich wählte, weil ich nicht sehen kann, wie ich Sets mit union-find und persistent-equivalence erstellen würde, muss den Wertebereich kennen.
Jetzt kann ich Beziehungen erstellen, und gibt den Satz der Sätze mit:
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"]]
Aber: mit fromList
sehr naiv ist, sollte es möglich sein, alle Äquivalenzklassen von der internen Datenstruktur direkt zu erhalten.
Und noch wichtiger: Wie kann ich die Äquivalenzrelation in meiner Datenstruktur speichern?
Danke für die Papiere! Vergessen zu erwähnen in meiner Frage: Ich kenne die Größe des Graphen nicht im Voraus, weshalb [persistente Äquivalenz] (http://hackage.haskell.org/package/persistent-equivalence-0.3) nicht ist geeignet entweder, weil es die Reichweite auf der Konstruktion kennen muss ... – pascal