抽象数据类型和数据结构


32

我很难理解这些术语。我在Google上搜索并在Wikipedia上阅读了一些内容,但我仍然不确定。到目前为止,我已经确定:

抽象数据类型是新类型的定义,描述了其属性和操作。

数据结构是ADT的实现。许多ADT可以实现为相同的数据结构。

如果我认为正确的话,数组作为ADT意味着元素的集合以及作为数据结构的方式,即如何将其存储在内存中。堆栈是具有推入,弹出操作的ADT,但是如果我的意思是我在算法中使用了以数组形式实现的堆栈,那么我们可以说一下堆栈数据结构吗?为什么堆不是ADT?它可以实现为树或数组。


3
您首先可能想阅读Array和Stack有什么区别?
chrisaycock


Answers:


24

简而言之,ADT(抽象数据类型)更像是一种逻辑描述,而数据结构则是具体的。

可以将ADT视为数据的图片以及对其进行操作和更改的操作。

数据结构是真实的,具体的东西。它可以在算法中实现和使用。


但我也可以在算法内部实现堆栈和队列(即ADT)。没有?
FedericoCapaldo

Stack和Queue是具有特定计算机科学含义的逻辑表示。但是,使用C#,Java,Go或[命名您的语言]进行Queue的实现将略有不同。队列的概念是ADT,Java队列是数据结构。与C#Stack实现相同。
Berin Loritsch

53

ADT对接口(它的作用)对数据结构对类(它的作用)。

一些例子:

ADT: List
DS:  ArrayList, LinkedList...

ADT: Map
DS:  HashMap, TreeMap...

我想你明白了。


ADT可以说是Data结构的一般类型吗?
Owais Qureshi 2013年

1
这应该是标记的答案。对于外行人来说,这还不算简单。
deppfx

感谢@dagnelies提供简单有效的答案。这应该标记为答案。
萨伦(英国)

1
不知道为什么,但是我希望对这里的措词进行小的重新排列:ADT is to a Data Structure, what an Interface (what it does) is to a Class (how it does it)。例子很明显。
Aditya MP

10

抽象数据类型:ADT可以定义为独立于任何特定实现而精确指定的一组数据值和关联的操作。因此,抽象数据类型是信息的有组织的集合以及用于管理该信息的一组操作。这组操作定义了ADT的接口。只要ADT满足接口的条件,ADT的实现方式就没有关系。由于在ADT中,数据值和运算是以数学精度定义的,而不是作为一种计算机语言的实现而定义的,因此我们可能会推断出运算的效果,与其他抽象数据类型的关系(程序是否实现了数据类型等)。

抽象数据类型(ADT)与具体数据类型之间的基本区别在于,后者允许我们查看具体表示形式,而前者则对我们隐藏了表示形式。ADT可以是纯ADT或可更新ADT。纯ADT是其中所有操作均为纯函数的ADT。这意味着操作没有副作用。特别是,它们不会在此处修改或更新输入参数。他们只是使用这些参数来生成输出,这些输出是ADT(或其他类型)的新值。大多数混凝土类型是纯净的。例如,对整数的任何运算实际上都不会修改整数。相反,所有的操作(如“ +”)都会产生新的输出。

一种可更新的ADT是其中某些操作实际上会更改ADT值的一种。例如,假设我们有一个名为“ pop”的操作,该操作将堆栈作为参数并对其进行了修改。(“就地”,“破坏性”),方法是删除优先级最高的项目。该操作将被认为是不纯的,然后整个ADT也将是不纯的。ADT可以是用户定义的ADT。

我们知道,抽象数据类型是满足以下两个条件的数据类型:

  1. 类型和操作的表示或定义包含在单个语法单元中。

  2. 对于使用该类型的程序单元,该类型的对象的表示是隐藏的,因此,在这些对象上可能进行的直接操作才是类型定义中提供的操作。

用户定义的抽象数据类型应提供:

  1. 类型定义,允许程序单元声明该类型的变量,但隐藏这些变量的表示形式。

  2. 一组用于操作类型对象的操作。

用户定义的抽象数据类型的一个示例是structure。“ C”提供了四种基本类型:int,char,float和double。但是,“ C”还使程序员能够定义自己的类型。结构就是这样一个例子。结构是不同部分的集合,其中每个部分都是某种现有类型。

struct abc

{int x;

float y;

};

上面的结构定义不创建任何变量,而是创建一个新类型。可以用类似于内置类型的变量的方式来创建此类型的变量。

struct abc a;

typedef关键字允许我们为新类型创建新的类型名称。

例如:

typedef struct abc AB;

其中AB是一个新的类型名称,现在可以用来创建新的类型。

AB b;

数据结构:以下是数据结构的特征:

  1. 它包含组件数据项,这些数据项可以是原子数据结构,也可以是其他数据结构(仍然是域)。

  2. 对一个或多个组件项目的一组操作。

  3. 定义有关组件之间如何相互关联以及与整个结构(断言)相关的规则。

数据结构:

数据结构可以是静态的也可以是动态的。静态数据结构具有固定大小。此含义不同于静态修饰符的含义。数组是静态的;一旦定义了可以容纳的元素数量,该数量就不会改变。动态数据结构根据其内容的需要在执行时增长和收缩。动态数据结构是使用链接实现的。

数据结构可以进一步分类为线性数据结构和非线性数据结构。在线性数据结构中,除第一个元素和最后一个元素外,每个组件都有唯一的前任和后继元素,而在非线性数据结构的情况下,则没有这种限制,因为元素可以任何期望的方式排列,这受我们习惯于代表这种类型。


0

首先,数据结构中的术语可能会非常混乱。

ADT就像理论,模型或指南等一样,它告诉数据结构应如何表现,应支持哪种操作等。三种基本的抽象数据类型是容器,字典和优先级队列。例如字典,它告诉我们实现此字典ADT的每个数据结构都必须支持键值对,基于键的搜索,项的插入,查找给定键的后继者和前任者等。

现在,在ADT之上实现此目标的所有其他内容都是数据结构(DS),数据结构是您在问题中实现并在库中找到的真实对象。对于字典,您可以选择通过数组或链接列表来实现。

我认为真正的混乱发生时,有人说出自己的DS如ADT,例如有些人会打电话给他们的上述DS为“词典”,而不是DictImplementation这是完全合法的,它只是造成一些混乱。

参考:Skiena:算法设计手册

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.