可以实现双端队列(双端队列)以在 O(1) 时间内提供所有这些操作,尽管并非所有实现都这样做。我从来没有使用过 Java 的 ArrayDeque,所以我以为你在开玩笑说它不支持随机访问,但你说得对——作为一个“纯”双端队列,它只允许在末端轻松访问。我明白为什么,但这确实很烦人......
对我来说,实现超快双端队列的理想方法是使用循环缓冲区,特别是因为您只对在前后添加删除感兴趣。我没有立即意识到 Java 中的一个,但我已经在 Objective-C 中编写了一个作为开源框架的一部分。欢迎您按原样使用代码或作为实现您自己的模式的模式。
这是代码和相关文档的WebSVN 门户。真正的内容在CHAbstractCircularBufferCollection.m文件中 — 查找和方法。甚至还定义了一个自定义枚举器(Java 中的“迭代器”)。基本的循环缓冲区逻辑相当简单,并在以下 3 个集中式宏中捕获:appendObject:
prependObject:
#define
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
正如您在该方法中所见,objectAtIndex:
访问双端队列中的第 N 个元素所需要做的就是array[transformIndex(N)]
. 请注意,我tailIndex
总是指向最后一个存储元素之外的一个插槽,因此如果headIndex == tailIndex
,则数组已满,如果大小为 0,则数组为空。
希望有帮助。我很抱歉发布非 Java 代码,但问题作者确实说一般答案是可以接受的。