Cách tốt nhất để có được loại dữ liệu hàng đợi đơn giản, hiệu quả trong Clojure là gì?Hàng đợi không thể thay đổi trong Clojure
Chỉ cần hai thao tác, enqueue và dequeue với ngữ nghĩa thông thường.
Tôi coi danh sách và vectơ tất nhiên, nhưng tôi hiểu rằng chúng có hiệu suất tương đối kém (tức là O (n) hoặc tệ hơn) để sửa đổi ở cuối và đầu tương ứng - vì vậy không lý tưởng cho hàng đợi!
Lý tưởng nhất là tôi muốn có cấu trúc dữ liệu liên tục thích hợp với O (log n) cho cả hoạt động enqueue và dequeue.
Để lưu một người nào đó viết về cách danh sách khuyết điểm có thể được sử dụng để triển khai ngăn xếp đẩy (như tôi gần như đã làm), đừng quên câu hỏi hỏi về * hàng đợi *. :-) –
Chỉ cần chú ý rằng có một lớp được gọi là PersistentQueue trong nguồn Java mới nhất có thể là câu trả lời cho câu hỏi của tôi – mikera
Nó ở trong đó mãi mãi (chỉ cần kiểm tra với 1,1, nhưng tôi nghĩ nó cũ hơn hơn thế). Lưu ý rằng không có chức năng nhà máy cũng như cú pháp trình đọc cho nó được cung cấp theo mặc định; sử dụng 'clojure.lang.PersistentQueue/EMPTY' để lấy một thể hiện trống. Sau đó, 'conj',' pop' & 'peek' hoạt động giống như hàng đợi. Xem ví dụ câu trả lời của tôi cho câu hỏi này: http://stackoverflow.com/questions/2760017 cho một số mã được viết bằng cả 'c.l.PQ' và' LinkedBlockingQueue' của Java. –