ArrayDeque是实现List接口还是Deque?各种来源的信息冲突

时间:2017-05-23 19:10:10

标签: data-structures computer-science

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

在他对ArrayDeque,Morin claims的讨论中,“ArrayDeque数据结构允许在两端进行有效的添加和删除。此结构实现了List接口。 “然后,他继续讨论数据结构的C ++实现,包括预期的List方法:get(i)set(i, x)add(i, x)remove(i)。< / p>

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

另一方面,其他资源表明ArrayDeque实现了Deque接口(“duh,”对吗?)。实际上,this article声称,“ArrayDeque是Deque接口的基于数组的实现。”此外,“与ArrayDeque不同,LinkedList没有实现List接口,因此我们从不考虑将其用于位置访问。”这种处理对我来说很有意义,而且似乎遵循了我发现的各种文章的共识。

莫林的书是错的,还是我错过了一些基本的东西?

2 个答案:

答案 0 :(得分:0)

基于数组的deques的不同实现支持不同的功能,同时使用相同的底层结构。例如,在Java Collections Framework中,ArrayDeque仅实现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); }

addremove的性能保证意味着每个操作都在恒定的时间内运行,使其成为一个高效的双端队列。

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

答案 1 :(得分:0)

来自Java docs

  

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

     

类型参数:
  E - 此集合中保存的元素类型

     

所有已实施的接口:
  可序列化,可克隆,可迭代,收集,Deque,队列

ArrayDeque实现Iterable,Collection,Deque和Queue(以及Serializable,Cloneable);所以没有List,只是Iterable。

在Morin的书中,他正在谈论编写自己的与Java实现无关的ArrayDeque;并且作者解释说,通过使用这个底层数据结构来实现ArrayDeque,你可以实现List接口。 (关键在这里,他们并不是说所有的ArrayDeque都会实现List,因为随机访问有点混淆整个结构的部分。但是你可以(而且不应该))