
订阅
0有用+1
- 中文名
- 抽象数据类型
- 外文名
- AbstractDataType
- 简 称
- ADT
- 释 义
- 数学模型及该模型上的一组操作
- 行 业
- 计算机软件
- 研发群体
- 程序员
- 类 别
- 开发工具
介绍
播报编辑
抽象数据类型( ADT,Abstract Data Type)是指一个数学模型以及定义在此数学模型上的一组操作。它通常是对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据操作的集合。 [1]
特征
播报编辑
抽象数据类型的特征主要体现在以下几个方面: [1]
- ①将数据和其行为结合在一起,形成一个不可分割的独立单位;
- ②信息隐藏,即尽可能隐藏数据内部细节,只留有限的对外接口形成一个边界,与外部发生联系。封装的原则使得软件错误能够局部化,大大降低排错的难度,便于软件的维护。 [1]
示例
播报编辑
关联数组用字符串代替数字来索引数组中的元素。可以认为索引字符串是用来寻找元素的关键字。在Perl中,利用在数组名前加前缀百分号(%)来定义一个关联数组。被赋值的值列表由索引字符串对和元素值组成。索引字符串后跟随元素值,元素值后面跟下个索引字符串和元素值,以此类推。 [2]
定义如下: [3]
数据关系:R={<real,image>} [3]
基本操作: [3]
}ADT Complex [3]
容器类是容纳、包含一组对象或对象集的对象。 [4]与一个盒子中放置一套书和一个书包中放入一些铅笔相似的方式,容器类包含一组对象或一个对象集。容器类作为通用对象收集器( generic holder)。C++语言的容器类中可以包含混合的对象。即容器类可以包含组不同类型的对象或一组相同类型的对象。 [4]
当容器类包含不同类型的对象时,称为异类容器类( heterogenous container)当容器类包含相同类型的对象时,称为同类容器类(homogenous container)。容器类的名称源于它的功能,如果我们使用容器类来存储对象或从容器类中检索对象,我们可以由此知道应该对存储在容器类中的对象或与容器类相关联的对象作哪些操作输入一些数据到计算机或输出一些数据到与计算机连接的设备是最通常的操作,除此之外,设计程序时最常进行的操作包括:查询、排序、添加、检索、存储数据。 [4]
实际上,命令计算机执行这些数据控制操作被认为计算机程序设计定义固有的内容。C++语言的容器类用于帮助创建这些基本的操作对数据的排序、查询、添加、删除、存储以及其他的一些操作通常需要预先定义特定的数据类型和数据结构。在非面向对象的程序设计语言中,例如C语言、Fortran语言、Pascal语言和Cobol语言,计算机程序分为数据类型、数据结构以及按照这些数据结构完成的操作和算法。 [4]
由于双端队列允许在两端进行插入删除工作,因此需要建立两个指针,分别指向双端队列中两端的元素。允许在一端进行插入和删除,另一端只允许插入的双端队列称为输出受限双端队列;允许在一端进行插入和删除,而另一端只允许删除的双端队列称为输入受限双端队列。 [5]
列表是一个特别灵活的结构,因为它可以根据要求而增长和收缩而且其中任何位置都可被访问,可以插入和删去元素。几个列表可以连接在一起以形成更大的列表,也可以把一个列表分开成若干个子列表。在诸如信息查寻,程序设计翻译及模拟等应用中都会使用列表,在一些存储管理技术中也广泛地使用列表处理。从数学上说,列表就是一个给定类型的零个或多个元素的序列。 [6]
即多重映像容器,与一般映像map不同的是,多重映像multimap中允许出现相同的键值。多重映像容器中,没重载下标运算符“[ ]”本容器的成员函数“iterator find ( const Key& key) ;",返回的是容器中第1个键值为key的iterator(游标值)--注意该容器允许出现相同键值。其他成员函数与一般映像map相类似。 [7]
优先队列( Priority Queue)是一种抽象数据类型( Abstract Data Type),可以把它看成种容器,里面有一些元素,这些元素称为队列的结点(Node)。优先队列的结点至少要包含一种性质:有序性,也就是说任意两个结点可以比较大小。为了具体起见,我们假设这些结点中都包含一个键值(Key),结点的大小通过比较它们的键值而定。优先队列并不是按照入队的顺序简单地执行先进先出( First in first out ),而是按照一定的优先级(键值的大小)调用。优先队列最早出现在操作系统中,实现对任务或进程的调度。 [8]
优先队列在信息学竞赛中十分常见,在统计问题、最值问题、模拟问题和贪心问题等类型的题目中都有着广泛的应用。优先队列有三种基本操作:插入结点( Insert )、取最小结点( Get Min )和删除最小结点( Delete min )。优先队列有着多种具体实现方法,不同实现方法的三种基本操作的时间复杂度也有很大的区别。比如,采用一维数组或线性链表实现,插入结点的时间复杂度只需要O(1),但取最小结点和删除最小结点的时间复杂度为O(n);采用二叉排序树实现,三种基本操作的时间复杂度都为O(log2n),但二又排序树可能退化成线性表。 [8]
队列( Queue)是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表。只允许插入的一端称为队尾rea,只允许删除的一端称为队头front)°。事实上,在队列中,这两种操作已经不再称为“插入”和“删除”,而是称为“入队”和“出队”。 [9]
队列是一种先进先出( First-In First-Out,FIFO)的结构,具有很强的顺序特征。队列会记录下零散无序的数据进入队列的顺序,并且在出队的时候保持这个顺序,以方便程序算对其进行利用。 [9]
堆栈的行为特征:假设一个栈S中的元素为an,an-1,,,, ,a1,则称a1为栈底元素,an为栈顶元素。栈中的元素按a,a2,,,, ,an-1,an的次序进栈。在任何时候,出栈的元素都是栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出表,简称LIFO表。 [3]
ADT String
基本操作: [10]
ADT Tree {
b.除root以外,D中其余结点存在m(m≥0)个不相交的划分,每个划分都是一棵树,是根的子树。
(3)树的基本操作。 [11]
} ADT Tree [11]
表示方法
播报编辑
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
其中基本操作的定义格式为: [9]
基本操作名(参数表)
操作结果:<操作结果描述> [9]
接口和实现的分离
播报编辑
在抽象数据类型和数据结构之间,有一个实现上的微妙差别。例如,列表的抽象数据类型可以数组为基础、或者使用链表来实现。列表即是一种具良好运算(加入元素、移除元素等等)定义的抽象数据类型。链表是以指针为基础的数据结构,且可用来创建一个列表。链表常用于列表的抽象数据类型。 [9]
从实现中分离出接口,并不表示用户不该知道实现的方法,而是用户不能依赖于实现细节。例如,一个抽象数据类型可以用脚本语言创建,或其它可以被反编译的语言(如C语言)。即使用户可发现实现的方法,只要所有客户端程序遵循该接口,且改变实现方式时不会产生影响,那就仍是抽象数据类型。 [9]
抽象数据结构
播报编辑
内置抽象数据类型
播报编辑
