是否存在实现纯函数集的算法?
预期的操作是 union ,交集,差异,元素?,空?< / em>和 adjoin 。
这些并不是硬性要求,我很乐意学习一种只实现其子集的算法。
答案 0 :(得分:5)
您可以使用纯功能的地图实现,只需忽略这些值。
请参阅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)
答案 1 :(得分:3)
几乎所有数据结构都存在纯粹的功能实现。在集合或地图的情况下,您通常使用某种形式的搜索树,例如红/黑树或AVL树。功能数据结构的标准参考是Okasaki的书:
http://www.cambridge.org/gb/knowledge/isbn/item1161740/
它的重要部分可以通过他的论文免费获得:
答案 2 :(得分:1)
@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/
这些是this reference request question中的一些想法(参见第一个答案,第一个条目)的实现。
这些结构中出现的集合支持您需要的功能:
http://clojure.org/data_structures#Data Structures-Sets
剩下的就是browse the source code and try to wrap your head around it。
答案 3 :(得分:1)
Here is在OCaml中实现纯功能集(它是OCaml的标准库)。
答案 4 :(得分:1)
是否存在实现纯函数集的算法?
您可以使用许多不同的纯功能数据结构来实现集合操作。有些人比其他人有更好的复杂性。
示例包括:
<强> Lists 强>
我们在哪里:
List Difference:
(\\) :: Eq a => [a] -> [a] -> [a]
\\
函数是列表差异((非关联)。在xs \\ ys
的结果中,ys的每个元素的第一次出现(如果有的话)已从xs中删除。因此
union :: Eq a => [a] -> [a] -> [a]
union函数返回两个列表的列表并集。例如,
"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
库将集合实现为大小平衡的二叉树:
这是什么数据结构:
data Set a = Bin !Size !a !(Set a) !(Set a)
| Tip
type Size = Int
产生复杂性: