对于自动机算法,我需要使用函数式语言的快速 Union-Find 数据结构。由于我需要正式证明数据结构的正确性,所以我更喜欢简单的结构。
我想要做的是计算一个集合中元素的等价S
类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} 上的迭代 - 这是对该结构的廉价操作。)