Data structures Clojure';s集?
我最近听了。在采访中,Rich提到Clojure的集合是以树的形式实现的。我希望用另一种语言实现持久性数据结构,并希望了解sets和Clojure的其他持久性数据结构是如何实现的 在下面的场景中,树在每个点上都是什么样子Data structures Clojure';s集?,data-structures,clojure,immutability,Data Structures,Clojure,Immutability,我最近听了。在采访中,Rich提到Clojure的集合是以树的形式实现的。我希望用另一种语言实现持久性数据结构,并希望了解sets和Clojure的其他持久性数据结构是如何实现的 在下面的场景中,树在每个点上都是什么样子 创建集合{1 2 3} 创建{1 2 3}和{4} 创建{1 2 3 4}和{1} 我想了解三个集合是如何生成的({1 2 3},{1 2 3 4}和{2 3 4})共享结构,以及如何处理“删除” 我还想知道一个节点可能拥有的最大分支数。Rich在采访中提到,树木很浅,因此可能
{1 2 3}
{1 2 3}
和{4}
{1 2 3 4}
和{1}
{1 2 3}
,{1 2 3 4}
和{2 3 4}
)共享结构,以及如何处理“删除”
我还想知道一个节点可能拥有的最大分支数。Rich在采访中提到,树木很浅,因此可能分枝因子大于2。这里是一个起点:
您可以看到它是根据PersistentHashMap实现的。您应该认真阅读,它非常详细地介绍了这一点,包括图片。简单地说,集合是通过树进行的深度优先搜索。我们可以向您展示如下示例:
(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内部使用的布局。不过这是要点。我喜欢SCdF的图纸和解释,但是如果你想了解更多的深度,你应该阅读关于Clojure数据结构的优秀系列文章。它详细地解释了Clojure的映射是如何工作的,Clojure的集合只是其映射之上的一个薄层:
{:a:b}
被实现为一个环绕{:a:a,:b:b}
您可能需要阅读Phil Bagwell的工作。他对数据结构的研究是Clojure、Haskell和Scala持久数据结构的基础
菲尔在Clojure/Conj的演讲如下:
还有一些文件:
你也可以阅读Chris Okasaki的作品。这篇博文讨论了这本书:分支因子是32。迂腐的注释:我刚刚听了Rich Hickey Clojure在第2节的数据结构。不确定这是在何时何地录制的。集合具有不同的存储实现。(默认?)向量是浅树。其他集合可能有其他实现,它们有。具体来说:哈希集、哈希映射和向量每个节点有32个子节点;排序集和排序映射是红黑树,每个节点有2个子节点。