2012-10-26 23 views
6

Tôi muốn có một cấu trúc dữ liệu clojure rằng:Có một thứ như hàng đợi kết hợp không?

  • pops từ phía trước
  • push để phía sau
  • cho phép tôi chỉ số assoc với các giá trị (ví dụ (assoc q 0 1) sẽ thiết lập giá trị của mặt trước để 1)

Có điều gì đó tương tự trong Clojure (không may PersistentQueue không đáp ứng Nr.3), hay tôi nên xây dựng nó trên đầu trang của vector?

+0

Bạn cũng có thể triển khai đối tượng Queue thực sự trong Clojure, và sau đó nó sẽ làm việc với những thứ khác trong Java (và có thể một số vùng đất Clojure) mong đợi một hàng đợi. – Rayne

+0

Nếu bạn luôn luôn thêm vào một đầu và lấy ra một đầu, sau đó bạn có thể giữ nó trong một bản đồ được lập chỉ mục bởi một số. Sau đó, bạn có thể chỉ đơn giản là theo dõi số lượng được giao cho đầu và đuôi và remap chúng khi bạn đi để cập nhật một giá trị với assoc. – Bill

Trả lời

1

Không có cấu trúc dữ liệu trong Clojure chuẩn sẽ đáp ứng các yêu cầu này một cách hiệu quả.

Có một số nói chuyện trên mailing list Clojure-Dev về việc sử dụng RRB cây cho vectơ, đó sẽ là một cấu trúc dữ liệu rất lớn cho việc này:

Không chắc thế nào đến nay mà đã phát triển - nhưng nếu bạn quan tâm đến loại cấu trúc dữ liệu này thì nó chắc chắn đáng xem xét điều này.

0

Bạn có thể sử dụng số sorted-map, nhưng bạn phải tự mình triển khai phần chỉ mục.

Ví dụ: để đẩy giá trị v, bạn có thể tích hợp nó với khóa được tạo bằng cách tăng phím cuối cùng trong bản đồ. Để bật, bạn có thể phân tách khóa đầu tiên trong bản đồ.

1

Nếu bạn không yêu cầu độ bền của cấu trúc dữ liệu, bạn có thể sử dụng java.util.LinkedList trong các chương trình Clojure của mình.

Ví dụ:

;;; Creation 
user> (import 'java.util.LinkedList) 
java.util.LinkedList 
user> (def linked-list (LinkedList. [:a :b :c :d :e])) 
#'user/linked-list 

;;; Pop from the front 
user> (.pop ^LinkedList linked-list) 
:a 
user> linked-list 
#<LinkedList [:b, :c, :d, :e]> 

;;; Push to the rear, but costly 
user> (.addLast ^LinkedList linked-list :x) 
nil 
user> linked-list 
#<LinkedList [:b, :c, :d, :e, :x]> 

;;; Assoc (cf. (assoc linked-list 0 :y) 
user> (.add ^LinkedList linked-list 0 :y) 
nil 
user> linked-list 
#<LinkedList [:y, :b, :c, :d, :x]> 
0

Âm thanh như bạn muốn có một deque như python của deque ngoại trừ bạn có thích đặc tính hiệu suất truy cập được lập chỉ mục của các C++ std::deque<T> có tài liệu hướng dẫn có phần hơn tù.

Tàu Java có triển khai java.util.Deque mà bạn chỉ có thể sử dụng, giống như đề xuất của java tutil của java.util.LinkedList.

Nếu bạn đang triển khai, việc triển khai thực hiện khá đơn giản đối với bộ sưu tập không liên tục và có vẻ hợp lý với tôi ít nhất là thực hiện chống lại "cây băm băm" ban đầu nếu các chi tiết làm phiền bạn.

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