Bir otomata algoritması için işlevsel bir dilde hızlı bir Union-Find veri yapısına ihtiyacım var. Veri yapısının doğruluğunu resmi olarak kanıtlamak gerektiğinden, basit bir yapıyı tercih ederim.İşlevsel bir dilde denklik sınıfları ve sendika/bulma
Yapmaya çalıştığım şey, bir S
w.r.t. setindeki öğelerin denklik sınıflarını hesaplamaktır. bir ilişki R ⊆ S × S
. Sonunda çıkmak istediğim, S
öğesinin herhangi bir elemanını R
-eşitlik sınıfının bir (kanonik) temsilcisine eşleyen bazı f: S → S
işlevidir. "Kanonik", demek istediğim, hangi temsilcisinin, bir denklik sınıfının tüm öğeleri için aynı olduğu sürece, yani, f x = f y ⟺ (x,y) ∈ R
'un beklemesini istiyorum.
Bunun için en iyi veri yapısı ve algoritması işlevsel bir dilde ne olurdu? Gerçekten "normal" fonksiyonel kodlara, yani hiçbir mutabilite/durum trafo monadına ihtiyacım olduğunu eklemeliyim.
DÜZENLEME: Bu temsilcisi ilk olan denklik sınıfının temsilci için S
herhangi bir unsur eşleştiren bir harita oluşturur
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]
: Bu arada, bu algoritma ile geldi S
üzerinden yineleme ile ulaşılan öğe. Sanırım bu aslında doğrusal zamana sahip (harita operasyonları sabitse). Yine de, diğer çözümlerle hala ilgileniyorum çünkü pratikte bunun ne kadar verimli olduğunu bilmiyorum.
(benim ilişkisi içten bir "S → (S Seti) seçeneğinde", üzerinde dolayısıyla yineleme olarak temsil edilir. {T | (s, t) ∈ R} - Bu o yapı üzerinde ucuz bir operasyondur)
Bu yardım nasıldı? http://hackage.haskell.org/packages/archive/equivalence/0.2.3/doc/html/Data-Equivalence-Monad.html ve http://hackage.haskell.org/packages/archive/equivalence/0.2. 2/doc/html/Data-Equivalence-STT.html –
Doğru okuduğumda, bunların tümü IO veya state trafo monadlarını kullanır, yani dahili veri yapılarını dahili olarak kullanırlar. Bu muhtemelen sonunda yapmak istediğim türden bir şey olsa da, şu andaki çerçevem bu sözde-zorunlu kodu desteklemiyor. Ama bağlantı için teşekkürler, bu var olduğunu bilmiyordum ve gelecekte bana yararlı olabilir. Bunu şimdi postamda açıkladım. –