Clojure集合背后的数据结构是什么?

时间:2013-04-29 02:59:18

标签: data-structures clojure immutability

我最近听了Rich Hickey's interview on Software Engineering Radio。在访谈期间,Rich提到Clojure的藏品是作为树木实施的。我希望用另一种语言实现持久化数据结构,并希望了解如何实现集合和Clojure的其他持久性数据结构。

在以下场景中,每个点的树会是什么样子?

  1. 创建集{1 2 3}

  2. 创建{1 2 3}{4}

  3. 的联合
  4. 创建{1 2 3 4}{1}

  5. 的差异

    我想了解这三个集合如何生成({1 2 3}{1 2 3 4}{2 3 4})共享结构,以及如何处理“删除”。

    我还想知道节点可能拥有的最大分支数。 Rich在访谈中提到树木很浅,所以分支因子可能大于2。

4 个答案:

答案 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实现的。