有没有实现纯函数集的算法?
预期的操作将是并集、交集、差值、元素?、空?和相邻。
这些并不是硬性要求,我很乐意学习一种只实现其中一部分的算法。
您可以使用纯函数式映射实现,只需忽略值即可。
请参阅 http://hackage.haskell.org/packages/archive/containers/0.1.0.1/doc/html/Data-IntMap.html(链接到 https://cstheory.stackexchange.com/questions/1539/whats-new-in-purely-functional-data-structures-since-okasaki (。
(旁注:有关功能数据结构的详细信息,请参阅 http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504 (
几乎任何数据结构都存在纯函数式实现。对于集合或映射,您通常使用某种形式的搜索树,例如红/黑树或AVL树。函数数据结构的标准参考是冈崎的书:
http://www.cambridge.org/gb/knowledge/isbn/item1161740/
其中的重要部分可以通过他的论文免费获得:
http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf
@ninjagecko答案的链接很好。我最近关注的是Clojure中使用的持久数据结构,它们是功能性的,不可变的和持久的。
持久哈希映射的实现说明可以在这篇由两部分组成的博客文章中找到:
http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/
http://blog.higher-order.net/2010/08/16/assoc-and-clojures-persistenthashmap-part-ii/
这些是在此参考请求问题中找到的一些想法(请参阅第一个答案,第一个条目(的实现。
从这些结构中产生的集合支持您需要的功能:
http://clojure.org/data_structures#Data 结构集
剩下的就是浏览源代码并尝试绕过它。
这是 OCaml 中纯函数集的实现(它是 OCaml 的标准库(。
有没有实现纯函数集的算法?
您可以使用许多不同的纯函数式数据结构来实现集合操作。有些比其他的具有更好的复杂性。
示例包括:
列表
我们有:
List Difference:
(\) :: Eq a => [a] -> [a] -> [a]
\
函数是列表差异((非关联(。在 xs \ ys
的结果中,ys 的每个元素的第一个出现(如果有的话(已经从 xs 中删除。因此
union :: Eq a => [a] -> [a] -> [a]
联合函数返回两个列表的列表联合。例如
"dog" `union` "cow" == "dogcw"
第一个列表中的重复项和元素将从第二个列表中删除,但如果第一个列表包含重复项,则结果也会如此。这是unionBy的一个特例,它允许程序员提供自己的相等性测试。
intersect :: Eq a => [a] -> [a] -> [a]
相交函数采用两个列表的列表交集。例如
[1,2,3,4] `intersect` [2,4,6,8] == [2,4]
如果第一个列表包含重复项,则结果也会重复项。
不可变集
可以设计更高效的数据结构来提高集合操作的复杂性。例如,Haskell中的标准Data.Set
库将集合实现为大小平衡的二叉树:
- Stephen Adams, "Efficient sets: a balance act", Journal of Functional Programming 3(4(:553-562, October 1993, http://www.swiss.ai.mit.edu/~adams/BB/.
这是这个数据结构:
data Set a = Bin !Size !a !(Set a) !(Set a)
| Tip
type Size = Int
产生以下复杂性:
- 并集、
- 交集、差值:O(n+m(