Data structures ArrayQue实现列表接口还是Deque?来自不同来源的冲突信息

Data structures ArrayQue实现列表接口还是Deque?来自不同来源的冲突信息,data-structures,computer-science,Data Structures,Computer Science,我目前正在网上学习算法课程,我们的教科书是Pat Morin的开放数据结构 他在讨论 ArrayDeque 波泥河镇时,“ ArrayDeque < /COD>数据结构允许两端的高效加和删除。该结构实现了List接口”。然后继续讨论数据结构的C++实现,包括预期的代码>清单>代码>方法:(i) ,设置(i,x),添加(i,x)和删除(i) 我发现作者的处理方式令人困惑,因为我无法想象这个实现如何被视为一个Deque;毕竟,它在任何位置都具有插入/删除功能 另一方面,其他资源表明,ArrayDeq

我目前正在网上学习算法课程,我们的教科书是Pat Morin的开放数据结构

<>他在讨论<代码> ArrayDeque <代码>波泥河镇时,“<代码> ArrayDeque < /COD>数据结构允许两端的高效加和删除。该结构实现了List接口”。然后继续讨论数据结构的C++实现,包括预期的<>代码>清单>代码>方法:<代码>(i) ,
设置(i,x)
添加(i,x)
删除(i)

我发现作者的处理方式令人困惑,因为我无法想象这个实现如何被视为一个
Deque
;毕竟,它在任何位置都具有插入/删除功能

另一方面,其他资源表明,
ArrayDeque
实现了
Deque
接口(“duh,对吧?)。事实上,声称,
ArrayDeque
是基于数组的Deque接口实现。”此外,“与
LinkedList
不同的是,
ArrayDeque
,它没有实现
列表
接口,因此我们从未考虑将其用于位置访问。”这种处理方式对我来说非常有意义,似乎符合我发现的各种文章的共识


Morin的书是错了,还是我遗漏了一些基本的东西?

基于数组的Deque的不同实现支持不同的功能,同时使用相同的底层结构。例如,在Java Collections框架中,只实现Deque接口,不支持按索引的固定时间访问

Morin对ArrayDeque的实现只实现了List接口。但是,用List实现Deque接口是直截了当的:

addFirst(x) { add(0, x); }
removeFirst() { return remove(0); }
addLast(x) { add(size, x); }
removeLast() { return remove(size - 1); }
add
remove
的性能保证意味着这些操作中的每一个都以恒定的时间运行,从而使其成为一种高效的设计

因此,使用基于数组的deque的底层结构,可以实现List和deque接口,不同的实现在这方面做出不同的选择。

来自Java

java.util
类数组定义

*java.lang.Object
**java.util.AbstractCollection
***java.util.ArrayDeque

类型参数:
E-此集合中包含的元素类型

所有实现的接口:
可序列化、可克隆、可移植、集合、数据队列

ArrayDeque实现了Iterable、Collection、Deque和Queue(以及Serializable、Cloneable);因此没有列表,只有Iterable


在Morin的书中,他谈到了编写与Java实现无关的自己的ArrayQue;作者解释说,通过使用这个底层数据结构来实现ArrayQue,您可以实现List接口。(这里的关键点是,他们并不是说所有ArrayQue都将实现List,因为随机访问会破坏结构的整个'que'部分。但是您可以(也不应该))

如果您查看Java API
ArrayQue
是否实现了
Deque
,ArrayQue数据结构支持在两端进行有效的插入和删除,因此将其用作Deque是完全合理的。相比之下,ArrayList只支持在末尾进行有效的插入和删除,因此您可以将其用于堆栈,但是这两种数据结构都支持有效的随机访问和迭代,所以您可以将其中任何一种用作随机访问列表,即使Java没有在其上实现列表ArrayDeque@yurikilochek仅仅因为这个问题提到了Java中存在的东西并不意味着Java是它们唯一存在的地方o关于一般数据结构,而不是任何给定的实现。第一个链接与C++相关。@Dukeling足够公平。