【发布时间】:2015-05-01 17:37:44
【问题描述】:
在单个数据结构中有效地实现堆栈和队列的最合适方法是什么。元素的数量是无限的。检索和插入都应该在恒定时间内发生。
【问题讨论】:
-
摊销常数时间也可以吗?
-
这不是deque 所做的吗?
标签: algorithm data-structures stack queue
在单个数据结构中有效地实现堆栈和队列的最合适方法是什么。元素的数量是无限的。检索和插入都应该在恒定时间内发生。
【问题讨论】:
标签: algorithm data-structures stack queue
双向链表具有您想要的所有计算复杂性属性,但缓存局部性较差。
允许在头部和尾部追加和删除的ring buffer (array)具有相同的复杂性特征。它使用动态数组并需要重新分配,一旦元素数量超过其容量。
但是,类似于数组列表/向量,在实践中,顺序访问通常比链表更快。在大多数情况下,它会比使用双向链表实现更快且内存效率更高。
这是dequeue 抽象数据结构的可能实现之一,参见例如Java 中的ArrayDeque<E> 实现。
【讨论】:
doubly linked list 可以解决这个问题,所有操作都需要固定时间:
push() 或enqueue() 通过将元素附加到
以恒定时间列出。pop() 在恒定时间内删除最后一个元素dequeue() 通过删除第一个元素,也是在恒定时间内。【讨论】:
双向链表最适合此操作。列表中的每个节点都有两个引用:一个指向它之前的项目,一个指向它之后的项目。主列表对象在列表前面维护对项目的引用,在列表后面维护对项目的引用。
任何时候它插入一个项目,列表:
从列表的前面或后面删除一个项目可以有效地逆转这个过程。
插入到结构的前面或后面总是一个 O(1) 操作。
【讨论】: