2013-04-29 25 views
16

Gần đây tôi đã nghe Rich Hickey's interview on Software Engineering Radio. Trong cuộc phỏng vấn Rich đã đề cập rằng các bộ sưu tập của Clojure được thực hiện như cây cối. Tôi hy vọng sẽ triển khai các cấu trúc dữ liệu liên tục trong một ngôn ngữ khác và muốn hiểu cách các tập hợp và các cấu trúc dữ liệu liên tục của Clojure được thực hiện.Cấu trúc dữ liệu đằng sau bộ của Clojure là gì?

Cây trông giống như thế nào ở mỗi điểm trong kịch bản sau đây?

  1. Tạo tập {1 2 3}

  2. Tạo sự kết hợp của {1 2 3}{4}

  3. Tạo sự khác biệt của {1 2 3 4}{1}

Tôi muốn hiểu như thế nào ba bộ được tạo ({1 2 3}, {1 2 3 4}{2 3 4}) cấu trúc chia sẻ và cách "xóa" được xử lý.

Tôi cũng muốn biết số lượng chi nhánh tối đa mà nút có thể có. Giàu đề cập trong cuộc phỏng vấn rằng cây cối nông cạn, vì vậy có lẽ hệ số phân nhánh lớn hơn hai.

+3

Hệ số phân nhánh là 32. –

+0

Lưu ý quan trọng: Tôi vừa nghe Rich Hickey _Clojure Data Structures 2_ tại http://www.youtube.com/watch?v=sp2Zv7KFQQ0. Không chắc chắn nơi hoặc khi nào điều này được ghi lại. Bộ sưu tập có triển khai bộ nhớ khác nhau. (mặc định?) vectơ là cây nông. Các bộ sưu tập khác có thể có các triển khai khác. –

+1

Họ làm. Cụ thể: bộ băm, bản đồ băm và véc tơ có 32 con cho mỗi nút; sắp xếp-thiết lập và sắp xếp-bản đồ là cây đỏ-đen và có 2 trẻ em mỗi nút. – Chouser

Trả lời

20

Có thể bạn cần đọc công việc của Phil Bagwell. Nghiên cứu của ông về cấu trúc dữ liệu là cơ sở của Clojure, Haskell và các cấu trúc dữ liệu liên tục của Scala.

có những lời nói này bởi Phil tại Clojure/conj: http://www.youtube.com/watch?v=K2NYwP90bNs

Ngoài ra còn có một số giấy tờ:

Bạn cũng có thể đọc Purely Functional Data Structures bởi Chris Okasaki.Bài đăng trên blog này nói về cuốn sách: http://okasaki.blogspot.com.br/2008/02/ten-years-of-purely-functional-data.html

11

Bạn thực sự nên đọc Clojure Programming, nó bao gồm chi tiết này, bao gồm cả hình ảnh. Tóm lại, các bộ sưu tập là các tìm kiếm đầu tiên về chiều sâu thông qua các cây. Chúng tôi có thể hiển thị các ví dụ của bạn như sau:

(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 

Lưu ý rằng đây chỉ là dấu hiệu, tôi không nói rằng đây chính xác là bố cục Clojure sử dụng nội bộ. Đó là ý chính.

8

Tôi thích bản vẽ và giải thích của SCdF, nhưng nếu bạn đang tìm kiếm chiều sâu hơn, bạn nên đọc loạt bài viết tuyệt vời về cấu trúc dữ liệu của Clojure tại Higher-Order. Nó giải thích chi tiết các bản đồ của Clojure hoạt động như thế nào, và các bộ của Clojure chỉ là một lớp mỏng trên bản đồ của nó: #{:a :b} được thực hiện như một gói xung quanh {:a :a, :b :b}.

Các vấn đề liên quan