Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures Clojure';s集?_Data Structures_Clojure_Immutability - Fatal编程技术网

Data structures Clojure';s集?

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在采访中提到,树木很浅,因此可能

我最近听了。在采访中,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在采访中提到,树木很浅,因此可能分枝因子大于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个子节点。