【问题标题】:Is Linked List an ADT or is it a Data Structure, or both?链表是 ADT 还是数据结构,或两者兼而有之?
【发布时间】:2011-09-26 05:12:30
【问题描述】:

如果我将抽象数据类型的标准定义用作提供一些功能来管理数据集合的黑盒,则链接列表符合该描述:

提供可用于维护对象列表的函数 add(x) 和 get(i)(以及其他)的容器。

但是当你问这些操作的时间复杂度是多少时,你会意识到这取决于这个容器是如何实现的:

如果你只是在内部维护一个到头节点的链接,上述两个操作将在 O(n) 时间内执行。如果您另外维护到尾节点的链接,您将在两者上获得 O(1) 时间。

所以我的问题是,出于学习目的,您认为链表是 ADT 还是数据结构?

这个问题是在我尝试从 Skiena 的算法设计手册中实现 Stack ADT 时提出的,并且正在阅读它的 put(x) 和 get() 方法的性能如何取决于选择实现的数据结构它。书中说,在这种情况下,选择数组或链表数据结构来实现这个 ADT 并不重要,它们都提供了相似的性能。

但是他们呢?它不取决于该链接列表的实现方式吗?链表本身的实现方式有很多种,那岂不是让它本身就是另一个ADT?

【问题讨论】:

    标签: arrays data-structures linked-list abstract-data-type


    【解决方案1】:

    链表本身不是抽象的,它是具体的。它被认为是一种数据结构。访问链表中数据的时间复杂度取决于您访问的元素以及列表中有多少元素,因为您必须遍历它们才能找到所需的元素。

    http://en.wikipedia.org/wiki/Linked_list

    【讨论】:

    • 链表是一个 ADT。抽象数据类型中的“抽象”不是指它不是具体的事实,而是指它可以在不知道将存储在其中的实际数据是什么的情况下使用(例如,在 C 中,数据将被保留为 void*)
    • 我的错误,将抽象数据类型误认为是抽象类。
    【解决方案2】:

    来自维基百科ADT:In computing, an abstract data type (ADT) is a mathematical model for a certain class of data structures that have similar behavior 所以,链表是一个ADT,每个ADT也是一个数据结构,所以链表是两者。

    编辑:
    但是,请注意,单链表和双链表具有相同的操作和相同的复杂度,因此它们都是链表 ADT,我们不区分它们为ADT 有关。但它们是不同的数据结构!

    【讨论】:

    • 也许我遗漏了一些东西,但是你如何在 O(n) 时间内向后迭代单链表(这在双链表中是可能的)?
    【解决方案3】:

    链表是一个 ADT。

    当您谈论数据结构时,您基本上有 - 堆栈、队列和列表(不要称之为链表)、树等。

    当您询问链表时,它是一个 ADT。抽象数据类型。所以独立它没有价值。但是当你想要实现 List 或 Stack 或 Queue 时,你需要使用 Linked List 或 Array。

    它是抽象的,因为它有多个可以在需要时与它关联的操作,具体取决于实现的类型。

    C 和C++ 标准模板库中的List 实现了双向链表。 Linked List 一直用于 List 的实现,这就是它成为 List 数据结构的同义词的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多