【问题标题】:What is ADT? (Abstract Data Type)什么是 ADT? (抽象数据类型)
【发布时间】:2012-05-03 06:28:56
【问题描述】:

我目前正在研究抽象数据类型 (ADT),但我根本不了解这个概念。有人可以向我解释这实际上是什么吗?还有什么是collection、bag和List ADT?简单来说?

【问题讨论】:

标签: language-agnostic terminology abstract-data-type


【解决方案1】:

Abstract Data Type(ADT) 是一种数据类型,其中只定义了行为而不是实现。

与 ADT 相对的是具体数据类型 (CDT),其中包含 ADT 的实现。

示例:
Array, List, Map, Queue, Set, Stack, Table, Tree, and Vector 是 ADT。这些 ADT 中的每一个都有许多实现,即 CDT。容器是上述所有 ADT 的高级 ADT。

现实生活中的例子:
book 是抽象的(电话簿是一种实现)

【讨论】:

  • 书籍示例加 1
  • 谢谢你的例子:)
  • 太棒了。你用本书的例子把它钉牢了。
  • 所以基本上是一个界面?
  • 接口是抽象的
【解决方案2】:

Abstact data type 维基百科的文章有很多话要说。

在计算机科学中,抽象数据类型 (ADT) 是具有相似行为的某一类数据结构的数学模型;或者对于具有相似语义的一种或多种编程语言的某些数据类型。抽象数据类型是间接定义的,仅由可能对其执行的操作以及对这些操作的效果(以及可能的成本)的数学约束来定义。

稍微具体一点,可以以Java的List接口为例。该接口根本没有明确定义任何行为,因为没有具体的List 类。该接口只定义了一组其他类(例如ArrayListLinkedList)必须实现的方法才能被视为List

集合是另一种抽象数据类型。对于 Java 的Collection 接口,它甚至比List 更抽象,因为

List 接口在iteratoraddremoveequalshashCode 方法的合约上添加了超出Collection 接口中指定的附加规定。

也称为multiset

在数学中,多重集(或袋子)的概念是集合概念的概括,其中允许成员多次出现。例如,有一个唯一集合包含元素 a 和 b 而没有其他元素,但是有许多具有此属性的多重集,例如包含 a 的两个副本和 b 的一个副本的多重集或包含三个副本的多重集a 和 b。

在 Java 中,Bag 是一个集合,它实现了一个非常简单的接口。您只需要能够将项目添加到包中,检查其大小并迭代其中包含的项目。请参阅 Bag.java 以获取示例实现(来自 Sedgewick & Wayne 的 Algorithms 4th edition)。

【讨论】:

    【解决方案3】:

    真正抽象的数据类型描述了其实例的属性,而无需承诺它们的表示或特定操作。例如,抽象(数学)类型 Integer 是离散的、无限的、线性排序的实例集。具体类型为实例提供特定的表示并实现一组特定的操作。

    【讨论】:

    • 好吧,添加整数类是为了帮助程序员处理泛型类,并且在 java 的集合框架中,我们需要指定我们想要创建包装器的集合类型/ADT 类有很大帮助。
    【解决方案4】:

    其实抽象数据类型是:

    • 逻辑上定义数据类型的概念或理论模型
    • 指定数据集和可对该数据执行的操作集
    • 没有提及将如何实施操作
    • “作为一个想法存在,但没有一个物理想法”

    例如,让我们看看一些抽象数据类型的规范,

    1. 列表抽象数据类型:initialize()、get()、insert()、remove()等
    2. 堆栈抽象数据类型:push()、pop()、peek()、isEmpty()、isNull() 等
    3. 队列抽象数据类型:enqueue()、dequeue()、size()、peek()等

    【讨论】:

      【解决方案5】:

      抽象数据类型 (ADT) 的表示法

      抽象数据类型可以定义为一个数学模型 在其上定义的操作集合。一个简单的例子是集合 整数以及联合、交集定义的操作 在片场。

      ADT 是原始数据类型(整数、字符 等),它们封装了一种数据类型,即定义 类型和对该类型的所有操作都本地化到一个部分 的程序。它们被视为外部的原始数据类型 ADT 及其操作的定义部分。

      ADT 的实现是将以下语句转换为 定义变量的声明的编程语言 属于那个ADT,加上每个用那种语言的程序 ADT 的操作。 ADT 的实现选择了一个 表示ADT的数据结构。

      指定数据类型的逻辑属性的有用工具是 抽象数据类型。从根本上说,数据类型是一个集合 值和对这些值的一组操作。那个收藏和 这些操作形成了一个可以实现的数学结构 使用特定的硬件和软件数据结构。术语 “抽象数据类型”是指定义数据类型的基本数学概念。

      在将抽象数据类型定义为数学概念时,我们不是 关注空间或时间效率。这些是实施 问题。事实上,ADT的定义并不关心 实现细节。甚至可能无法实施 特定硬件上的特定 ADT 或使用 特定的软件系统。例如,我们已经看到一个 ADT 整数并非普遍可实现。

      为了说明 ADT 的概念和我的规范方法, 考虑对应于数学的 ADT RATIONAL 有理数的概念。有理数是可以 表示为两个整数的商。上的操作 我们定义的有理数是有理数的创建 从两个整数,加法,乘法和相等性测试。 以下是该ADT的初始规范。

                        /* Value defination */
      
      abstract typedef <integer, integer> RATIONAL;
      condition RATIONAL [1]!=0;
      
                       /*Operator defination*/
      
      abstract RATIONAL makerational (a,b)
      int a,b;
      preconditon b!=0;
      postcondition makerational [0] =a;
                    makerational [1] =b;
      abstract RATIONAL add [a,b]
      RATIONAL a,b;
      postcondition add[1] = = a[1] * b[1]
                    add[0] = a[0]*b[1]+b[0]*a[1]
      abstract RATIONAL mult [a, b]
      RATIONAL a,b;
      postcondition mult[0] = = a[0]*b[a]
                    mult[1] = = a[1]*b[1]
      abstract equal (a,b)
      RATIONAL a,b;
      postcondition equal = = |a[0] * b[1] = = b[0] * a[1];
      

      一个ADT由两部分组成:-

      1) 值定义

      2) 操作定义

      1) 值定义:-

      值定义定义了 ADT 的值集合和 由两部分组成:

      1) 定义条款

      2) 条件条款

      例如,ADT RATIONAL 的值定义指出 RATIONAL 值由两个整数组成,其中第二个整数 不等于 0。

      关键字abstract typedef引入了一个值定义和 关键字条件用于指定新的任何条件 定义的数据类型。在此定义中,条件指定 分母可能不为 0。定义子句是必需的,但 可能并非每个 ADT 都需要条件。

      2) 运算符定义:-

      每个运算符都被定义为一个包含三个部分的抽象连接。

      1)标题

      2)可选的前提条件

      3)可选的后置条件

      例如,ADT RATIONAL 的运算符定义包括 创造(制造)、加法(add)和 乘法 (mult) 以及相等性测试 (equal)。让我们 首先考虑乘法的规范,因为它是 最简单的。它包含标题和后置条件,但没有 前置条件。

      abstract RATIONAL mult [a,b]
      RATIONAL a,b;
      postcondition mult[0] = a[0]*b[0]
                    mult[1] = a[1]*b[1]
      

      这个定义的表头是前两行,刚好 就像一个 C 函数头。关键字abstract表示它是 不是 C 函数,而是 ADT 运算符定义。

      后置条件指定操作的作用。在一个 后置条件,使用函数的名称(在本例中为 mult) 来表示操作的结果。因此,mult [0] 表示 结果的分子和 mult 1 表示结果的分母 结果。也就是说,它指定了什么条件在 执行操作。在此示例中,后置条件指定 有理乘法结果的分子等于 两个输入的分子与分母的整数乘积 等于两个分母的整数乘积。

      列表

      在计算机科学中,列表或序列是一种抽象数据类型, 表示可数个有序值,其中相同的值 可能发生不止一次。列表的一个实例是一台计算机 表示有限序列的数学概念;这 (可能)列表的无限模拟是流。列表是基本的 容器的示例,因为它们包含其他值。如果相同的值 出现多次,每次出现都被认为是一个不同的项目

      名称列表也用于几个具体的数据结构 可用于实现抽象列表,尤其是链表。

      列表的图像

      包是对象的集合,您可以在其中不断添加对象 袋子,但一旦添加到袋子中,您就无法将它们移除。所以用一个 bag数据结构,可以收集所有对象,然后迭代 通过他们。当你用 Java 编程时,你会正常打包。

      包的图片

      收藏

      Java 意义上的集合是指任何实现 采集界面。一般意义上的集合只是一个组 对象。

      收藏图片

      【讨论】:

        【解决方案6】:

        Brilliant 的 wiki 上给出的最简单的解释之一:

        抽象数据类型,通常缩写为 ADT,是一种 根据使用方式和数据结构对数据结构进行分类 他们提供的行为。他们没有指定数据结构如何 必须在内存中实现或布局,但只需提供一个 最小的预期界面和行为集。例如,一个堆栈 是一种抽象数据类型,它指定一个线性数据结构 LIFO(后进先出)行为。堆栈通常实现 使用数组或链表,但不必要的复杂 使用二叉搜索树的实现仍然是有效的 执行。需要明确的是,说堆栈是不正确的 数组或反之亦然。数组可以用作堆栈。同样,一个 堆栈可以使用数组来实现。

        由于抽象数据类型没有指定实现,这意味着 谈论给定的时间复杂度也是不正确的 抽象数据类型。关联数组可能有也可能没有 O(1) 平均搜索时间。由 a 实现的关联数组 哈希表确实有 O(1) 平均搜索时间。

        ADT 示例:List - 可以使用 Array 和 LinkedList、Queue、Deque、Stack、Associative array、Set 来实现。

        https://brilliant.org/wiki/abstract-data-types/?subtopic=types-and-data-structures&chapter=abstract-data-types

        【讨论】:

          【解决方案7】:

          ADT 是一组完全独立于任何特定实现的数据值和相关操作。 ADT 的优势在于实现对用户隐藏。仅声明接口。这意味着 ADT 有多种方式

          【讨论】:

            【解决方案8】:

            抽象数据类型是一个数学模块,包括具有各种运算的数据。实现细节是隐藏的,这就是它被称为抽象的原因。抽象允许您通过关注数据和操作的逻辑属性来组织任务的复杂性。

            【讨论】:

            • 你把正确的知识放在了糟糕的格式中。 ADT 绝对不需要在创建时有实现细节。我们可以根据我们的用例定义它们的操作。简而言之,从实现细节或定义操作中利用我们。
            【解决方案9】:

            在编程语言中,类型是一些数据和相关的操作。 ADT 是用户定义的数据聚合和对这些数据的操作,其特点是封装,数据和操作在单个句法单元中表示或声明在列表中,以及信息隐藏,只有相关操作对 ADT 的用户可见,即 ADT 接口,与编程语言中的普通数据类型相同。这是一种抽象,因为数据的内部表示和操作的实现与 ADT 用户无关。

            【讨论】:

              【解决方案10】:

              在定义抽象数据类型之前,让我们考虑不同的 系统定义的数据类型的视图。我们都知道默认情况下所有 原始数据类型(int、float 等)支持基本操作,例如 作为加法和减法。系统提供实现 对于原始数据类型。对于用户定义的数据类型,我们还 需要定义操作。这些操作的实现可以 当我们想要实际使用它们时完成。这意味着一般来说, 用户定义的数据类型与它们的操作一起定义。

              为了简化解决问题的过程,我们结合数据 结构及其操作,我们称之为“抽象数据 类型”。(ADT)。

              常用的ADT'S包括:链表、栈、队列、二叉树、 字典、不相交集(联合和查找)、哈希表和许多 其他人。

              ADT 包含两种类型:

              1.数据声明。

              2。操作声明。

              【讨论】:

                【解决方案11】:

                简单抽象数据类型不过是一组操作,一组数据用于在机器中有效地存储一些其他数据。 不需要任何特定的类型声明。 它只需要 ADT 的实现。

                【讨论】:

                  【解决方案12】:

                  为了解决问题,我们将数据结构与其操作相结合。 ADT 由两部分组成:

                  1. 数据声明。
                  2. 操作声明。

                  常用的 ADT 是链表、堆栈、队列、优先级队列、树等。在定义 ADT 时,我们不需要担心实现细节。只有当我们想要使用它们时,它们才会出现。

                  【讨论】:

                    【解决方案13】:

                    抽象数据类型类似于用户定义的数据类型,我们可以在不知道数据类型内部有什么以及如何对它们执行操作的情况下对其执行功能。由于信息未公开,因此其抽象化。例如。列表、数组、堆栈、队列。在 Stack 上,我们可以执行 Push、Pop 等功能,但我们不确定它是如何在幕后实现的。

                    【讨论】:

                      【解决方案14】:

                      ADT 是一组对象和操作,在 ADT 的定义中没有任何地方提到如何实现这组操作。使用集合的程序员只需要知道如何以某种预先确定的方式实例化和访问数据,而不用关心集合实现的细节。换句话说,从用户的角度来看,集合是一种抽象,因此,在计算机科学中,一些集合被称为抽象数据类型 (ADT)。用户只关心学习它的界面,或者它执行的一组操作...more

                      【讨论】:

                        【解决方案15】:

                        简而言之:抽象数据类型是数据和对该数据进行操作的集合。这些操作既向程序的其余部分描述数据,又允许程序的其余部分更改数据。 “抽象数据类型”中的“数据”一词使用松散。 ADT 可能是一个图形窗口,其中包含影响它的所有操作、文件和文件操作、保险费率表及其上的操作,或其他东西。

                        从代码完成 2 本书

                        【讨论】:

                          【解决方案16】:

                          抽象数据类型是值的集合以及对这些值的任何类型的操作。例如,由于 String 不是原始数据类型,我们可以将其包含在抽象数据类型中。

                          【讨论】:

                            【解决方案17】:

                            ADT 是一种数据类型,其中数据的收集和操作对该数据起作用。它更注重概念而不是实施。 由您决定使用哪种语言使其在地球上可见 例子: 堆栈是 ADT,而数组不是 Stack 是 ADT,因为我们可以用多种语言来实现它, Python c c++ java 等等,而 Array 是内置数据类型

                            【讨论】:

                              【解决方案18】:

                              抽象数据类型,有时缩写为 ADT,是对我们如何查看数据和允许的操作的逻辑描述,而不考虑它们将如何实现。这意味着我们只关心数据代表什么,而不关心它最终将如何构建。

                              https://runestone.academy/runestone/books/published/pythonds/Introduction/WhyStudyDataStructuresandAbstractDataTypes.html

                              【讨论】:

                                【解决方案19】:

                                抽象只给你信息(服务信息)而不是实现。 例如:当您从 ATM 机取款时,您只知道一件事,即将您的 ATM 卡放到机器上,单击取款选项,输入金额,如果有钱,您的钱就出来了。 这只是您对 ATM 机的了解。但是你知道你是怎么收钱的吗?背后是什么业务逻辑?哪个数据库被调用?正在调用哪个位置的哪个服务器?不,您只知道服务信息,即您可以提款。这是一个抽象。

                                同样,ADT 为您提供数据类型的概览:它们是/可以存储什么以及您可以对这些数据类型执行哪些操作。但它没有提供如何实现它。这是 ADT。它只定义数据类型的逻辑形式。

                                另一个类比是: 在汽车或自行车上,您只知道当您踩下刹车时,您的车辆将停止。但是你知道踩刹车时自行车是怎么停下来的吗???不,意味着实现细节被隐藏了。您只知道踩下时刹车的作用,但不知道它是如何作用的。

                                【讨论】:

                                  【解决方案20】:

                                  术语数据类型是特定变量可以保存的数据类型 - 它可以是整数、字符、浮点数或任何范围的简单数据存储表示。但是,当我们构建面向对象的系统时,我们会使用其他数据类型,称为抽象数据类型,它表示更现实的实体。

                                  例如:我们可能对表示“银行帐户”数据类型感兴趣,它描述了程序中如何处理所有银行帐户。抽象是为了降低复杂性,忽略不必要的细节。

                                  【讨论】:

                                  • 这并没有解释数据类型的抽象部分。
                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2018-02-19
                                  • 2017-12-12
                                  • 2012-12-07
                                  • 2018-02-11
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多