我最近听了Rich Hickey's interview on Software Engineering Radio。在访谈期间,Rich提到Clojure的藏品是作为树木实施的。我希望用另一种语言实现持久化数据结构,并希望了解如何实现集合和Clojure的其他持久性数据结构。
在以下场景中,每个点的树会是什么样子?
创建集{1 2 3}
创建{1 2 3}
和{4}
创建{1 2 3 4}
和{1}
我想了解这三个集合如何生成({1 2 3}
,{1 2 3 4}
和{2 3 4}
)共享结构,以及如何处理“删除”。
我还想知道节点可能拥有的最大分支数。 Rich在访谈中提到树木很浅,所以分支因子可能大于2。
答案 0 :(得分:22)
你可能需要阅读Phil Bagwell的作品。他对数据结构的研究是Clojure,Haskell和Scala持久数据结构的基础。
菲尔在Clojure / Conj上有这样的讲话:http://www.youtube.com/watch?v=K2NYwP90bNs
还有一些论文:
您还可以阅读Chris Okasaki撰写的Purely Functional Data Structures。这篇博文讲述了这本书:http://okasaki.blogspot.com.br/2008/02/ten-years-of-purely-functional-data.html
答案 1 :(得分:11)
你应该真正阅读Clojure Programming,它会非常详细地介绍这一点,包括图片。简而言之,集合是深度优先搜索树木。我们可以这样展示你的例子:
(def x #{1 2 3})
x
|
| \
|\ 3
1 \
2
(def y (conj x 4))
x y
| / \
| \ 4
|\ 3
1 \
2
(def z (difference y #{1}))
x y
| / \
| \ 4
|\ 3
1/\
z- 2
请注意,这些仅仅是指示性的,我并不是说这正是Clojure内部使用的布局。这是要点。
答案 2 :(得分:8)
我喜欢SCdF的图纸和解释,但是如果你想要更深入,你应该阅读关于Clojure数据结构的优秀系列文章Higher-Order。它详细解释了Clojure的地图如何工作,而Clojure的集合只是地图上的一个薄层:#{:a :b}
实现为{:a :a, :b :b}
的包裹。
答案 3 :(得分:0)
这是一个起点:https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentHashSet.java
你可以看到它是用PersistentHashMap实现的。