抽象数据类型(ADT)是一种数据类型,仅定义了行为而没有实现方式。
与ADT相对的是具体数据类型(CDT),它包含了ADT的实现。
举例:
Array, List, Map, Queue, Set, Stack, Table, Tree,
和Vector
都是ADT。每个ADT都有许多实现,即CDT。容器是所有ADT中最高级别的。
现实生活中的例子:
书是抽象的(电话簿是一种实现方式)。
维基百科的抽象数据类型文章有很多内容。
在计算机科学中,抽象数据类型(ADT)是某类具有相似行为的数据结构的数学模型;或者是一种或多种编程语言的某些数据类型的数学模型。抽象数据类型仅通过可以对其执行的操作以及对这些操作的效果(可能的成本)的数学约束来间接定义。
稍微具体一点,您可以以Java的List
接口为例。该接口并没有明确定义任何行为,因为没有具体的List
类。该接口仅定义了一组方法,其他类(例如ArrayList
和LinkedList
)必须实现才能被视为List
。
集合是另一种抽象数据类型。在Java的Collection
接口的情况下,它比List
更抽象,因为
List
接口在Collection
接口规定的基础上,对iterator
、add
、remove
、equals
和hashCode
方法的契约提出了额外的规定。
包也被称为multiset。
在Java中,Bag将是一个实现非常简单接口的集合。您只需要能够向包中添加项目,检查其大小并迭代其包含的项目即可。请参见Bag.java以获取示例实现(来自Sedgewick和Wayne的算法第四版)。在数学中,多重集合(或称为“包”)的概念是集合概念的一种推广,其中允许成员出现多次。例如,包含元素 a 和 b 且不含其他元素的唯一集合是存在的,但有很多满足这个条件的多重集合,比如包含两个 a 和一个 b 的多重集合,或者包含三个 a 和三个 b 的多重集合。
/* 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) 操作定义
值定义定义了ADT的值集合,包括两个部分:
1) 定义子句
2) 条件子句
例如,ADT RATIONAL的值定义说明RATIONAL值由两个整数组成,其中第二个整数不等于0。
关键字abstract typedef引入了值定义,关键字condition用于指定新定义的数据类型上的任何条件。在这个定义中,条件规定分母不能为0。定义子句是必需的,但条件对于每个ADT可能并不一定需要。
abstract RATIONAL mult [a,b]
RATIONAL a,b;
postcondition mult[0] = a[0]*b[0]
mult[1] = a[1]*b[1]
列表图片
袋子是一组物体,您可以将物体添加到袋子中,但添加后无法将其删除。因此,使用袋数据结构,您可以收集所有对象,然后遍历它们。在Java编程中通常会使用袋。
一个包的图片
Java中的集合指实现了Collection接口的任何类。通用意义上的集合只是一组对象。
收藏图片
一个真正抽象的数据类型描述它的实例属性,而不承诺它们的表示或特定操作。例如,抽象(数学)类型 Integer 是一组离散的、无限的、线性有序的实例。具体类型为实例提供了具体的表示,并实现了一组特定的操作。
抽象数据类型实际上是:
例如,让我们看一些抽象数据类型的规范:
抽象数据类型是一个包含各种操作的数学模块。实现细节被隐藏,因此它被称为抽象。抽象使您可以通过关注数据和操作的逻辑属性来组织任务的复杂性。
抽象数据类型(ADT)是数据结构的抽象,仅提供数据结构必须遵循的接口。该接口不提供有关如何实现某些内容或使用哪种编程语言的具体细节。