【发布时间】:2013-03-28 20:39:37
【问题描述】:
对于自动机算法,我需要函数式语言中的快速 Union-Find 数据结构。由于需要形式化证明数据结构的正确性,所以我更喜欢简单的结构。
我要做的是计算集合S w.r.t 中元素的等价类。关系R ⊆ S × S。我最终想要得到的是一些函数f: S → S,它将S 的任何元素映射到其R-equivalence 类的(规范)代表。通过“规范”,我的意思是我不在乎它是哪个代表,只要它对于一个等价类的所有元素都是相同的,即我希望 f x = f y ⟺ (x,y) ∈ R 保持不变。
函数式语言中最好的数据结构和算法是什么?我应该补充一点,我真的需要“正常”的功能代码,即没有可变性/状态转换器单子。
编辑:与此同时,我想出了这个算法:
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]
这将创建一个映射,将S 的任何元素映射到其等价类的代表,其中代表是通过S 的迭代到达的第一个元素。我认为这实际上具有线性时间(如果地图操作是恒定的)。但是,我仍然对其他解决方案感兴趣,因为我不知道这在实践中的效率如何。
(我的关系在内部表示为“S → (S Set) option”,因此在 {t | (s,t) ∈ R} 上的迭代 - 这是对该结构的廉价操作。)
【问题讨论】:
-
如果我没看错的话,所有这些都使用 IO 或状态转换器单子,这意味着它们在内部使用可变数据结构。虽然这可能是我最终想做的事情,但我当前的框架不支持这种伪命令式代码。但是感谢您的链接,我不知道这存在并且将来可能对我有用。我现在在我的帖子中澄清了这一点。
标签: algorithm data-structures functional-programming union-find equivalence-classes