【发布时间】:2011-03-09 08:45:18
【问题描述】:
在 Clojure 中获取简单、高效的不可变队列数据类型的最佳方法是什么?
它只需要两个操作,通常语义的入队和出队。
我当然考虑过列表和向量,但我知道它们在结尾和开头的修改分别具有相对较差的性能(即 O(n) 或更差) - 所以不适合队列!
理想情况下,我想要一个适当的持久数据结构,其 O(log n) 用于入队和出队操作。
【问题讨论】:
-
为了避免有人写关于如何使用 cons 列表来实现 push/pop 堆栈(就像我几乎所做的那样),不要忘记关于 queues 的问题。 :-)
-
刚刚注意到在最新的 1.2 快照 Clojure Java 源代码中有一个名为 PersistentQueue 的类....可能是我自己问题的答案
-
它从那以后就一直存在(刚刚检查了 1.1,但我认为它比那更旧)。请注意,默认情况下没有提供工厂函数或阅读器语法;使用
clojure.lang.PersistentQueue/EMPTY获取一个空实例。然后conj、pop和peek按他们应该的方式处理队列。参见例如我对这个问题的回答:stackoverflow.com/questions/2760017 一些用c.l.PQ和Java 的LinkedBlockingQueue编写的代码。 -
酷,谢谢米哈尔!我想我一开始错过了它,因为 API 中没有简单的“队列”构造函数。也许我应该提交一个补丁:-)
-
PersistentQueue确实是 Clojure 更严密保护的秘密之一。 ;-) 关于可能的与队列相关的 API 增强功能,请参阅 Clojure Dev 上的此线程:groups.google.com/group/clojure-dev/browse_thread/thread/… 请注意,现在这可能是一个非常低优先级的问题,新数字和所有...
标签: algorithm data-structures clojure queue immutability