我目前正在网上学习算法课,而我们的教科书是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
接口,因此我们从不考虑将其用于位置访问。”这种处理对我来说很有意义,而且似乎遵循了我发现的各种文章的共识。
莫林的书是错的,还是我错过了一些基本的东西?
答案 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); }
add
和remove
的性能保证意味着每个操作都在恒定的时间内运行,使其成为一个高效的双端队列。
因此,使用基于数组的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,因为随机访问有点混淆整个结构的部分。但是你可以(而且不应该))