Für einen Automatenalgorithmus benötige ich eine schnelle Union-Find-Datenstruktur in einer funktionalen Sprache. Da ich die Korrektheit der Datenstruktur formal nachweisen muss, würde ich eine einfache Struktur bevorzugen.Äquivalenzklassen und Vereinigung/Finden in einer funktionalen Sprache
Was ich versuche zu tun, ist die Äquivalenzklassen der Elemente in einer Menge S
w.r.t zu berechnen. eine Beziehung R ⊆ S × S
. Was ich am Ende herausbekommen möchte, ist eine Funktion f: S → S
, die jedes Element von S
einem (kanonischen) Vertreter seiner R
-Äquivalenzklasse zuordnet. Mit "kanonisch" meine ich, dass es mir egal ist, welcher Repräsentant es ist, solange es für alle Elemente einer Äquivalenzklasse gleich ist, d. H. Ich möchte f x = f y ⟺ (x,y) ∈ R
halten.
Was wäre die beste Datenstruktur und Algorithmus dafür in einer funktionalen Sprache? Ich sollte hinzufügen, dass ich wirklich "normalen" Funktionscode benötige, d. H. Keine Wandlungs-/Zustandstransformator-Monaden.
EDIT: In der Zwischenzeit habe ich mit diesem Algorithmus kommen:
m := empty map
for each s ∈ S do
if m s = None then
for each t in {t | (s,t) ∈ R}
m := m[t ↦ s]
Diese Karte, die jedes Element von S
ihrer Äquivalenzklasse an den Vertreter abbildet schafft, wo der Vertreter ist der erste Element, das durch die Iteration über S
erreicht wird. Ich denke, das hat tatsächlich lineare Zeit (wenn Kartenoperationen konstant sind). Ich bin jedoch immer noch an anderen Lösungen interessiert, da ich nicht weiß, wie effizient das in der Praxis ist.
(meine Beziehung intern als "S → (S Set) Option" dargestellt wird, damit die Iteration über. {T | (s, t) ∈ R} - das ist ein billiger Betrieb auf dieser Struktur)
könnten diese helfen? http://hackage.haskell.org/packages/archive/equivalence/0.2.3/doc/html/Data-Equivalence-Monad.html und http://hackage.haskell.org/packages/archive/equivalence/0.2. 2/doc/html/Data-Equivalence-STT.html –
Wenn ich richtig lese, verwenden alle diese IO- oder State-Transformer-Monaden, was bedeutet, dass sie intern veränderbare Datenstrukturen verwenden. Während dies wahrscheinlich die Art von Sache ist, die ich am Ende machen möchte, unterstützt mein derzeitiges Framework diese Art von Pseudo-Imperativ-Code nicht. Aber danke für den Link, ich wusste nicht, dass das existiert und es könnte für mich in Zukunft nützlich sein. Das habe ich jetzt in meinem Beitrag geklärt. –