【问题标题】:Does ArrayDeque implement the List interface, or Deque? Conflicting information from various sourcesArrayDeque 是实现 List 接口还是 Deque?来自不同来源的相互矛盾的信息
【发布时间】:2017-05-23 19:10:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: data-structures computer-science


【解决方案1】:

基于数组的双端队列的不同实现支持不同的功能,同时使用相同的底层结构。比如在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接口,不同的实现在这方面做出不同的选择。

【讨论】:

    【解决方案2】:

    来自 Java docs

    java.util
    类 ArrayDeque

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

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

    所有实现的接口:
    可序列化、可克隆、可迭代、集合、双端队列、队列

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多