What is the data structure behind Clojure's sets?

后端 未结 4 1666
难免孤独
难免孤独 2020-12-12 20:08

I recently listened to Rich Hickey\'s interview on Software Engineering Radio. During the interview Rich mentioned that Clojure\'s collections are implemented as trees. I\'m

相关标签:
4条回答
  • 2020-12-12 20:15

    You probably need to read the work of Phil Bagwell. His research into data structures is the base of Clojure, Haskell and Scala persistent data structures.

    There is this talk by Phil at Clojure/Conj: http://www.youtube.com/watch?v=K2NYwP90bNs

    There are also some papers:

    • Fast Functional Lists, Hash-Lists, Deques and Variable Length Arrays
    • Ideal Hash Trees
    • More from Phil here

    You can also read Purely Functional Data Structures by Chris Okasaki. This blog post talks about the book: http://okasaki.blogspot.com.br/2008/02/ten-years-of-purely-functional-data.html

    0 讨论(0)
  • 2020-12-12 20:21

    I like SCdF's drawings and explanations, but if you're looking for more depth you should read the excellent series of articles on Clojure's data structures at Higher-Order. It explains in detail how Clojure's maps work, and Clojure's sets are just a thin layer on top of its maps: #{:a :b} is implemented as a wrapping around {:a :a, :b :b}.

    0 讨论(0)
  • 2020-12-12 20:21

    Here's a starting point: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentHashSet.java

    You can see it's implemented in terms of PersistentHashMap.

    0 讨论(0)
  • 2020-12-12 20:38

    You should really read Clojure Programming, it covers this in great detail, including pictures. Briefly though, collections are depth first searches through trees. We can show your examples like this:

    (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
    

    Note that these are just indicative, I'm not saying that this is exactly the layout Clojure uses internally. It's the gist though.

    0 讨论(0)
提交回复
热议问题