抽象数据类型

抽象数据类型是描述数据结构的一种理论工具。在介绍抽象数据类型之前我们先介绍一
下数据类型的基本概念。
数据类型(data type)是一组性质相同的数据元素的集合以及加在这个集合上的一组操
作。例如Java 语言中就有许多不同的数据类型,包括数值型的数据类型、字符串、布尔型
等数据类型。以Java 中的int 型为例,int 型的数据元素的集合是[-2147483648,2147483647]
间的整数,定义在其上的操作有加、减、乘、除四则运算,还有模运算等。
定义数据类型的作用一个是隐藏计算机硬件及其特性和差别,使硬件对于用户而言是透
明的,即用户可以不关心数据类型是怎么实现的而可以使用它。定义数据类型的另一个作用
是,用户能够使用数据类型定义的操作,方便的实现问题的求解。例如,用户可以使用Java
定义在int 型的加法操作完成两个整数的加法运算,而不用关心两个整数的加法在计算机中
到底是如何实现的。这样不但加快了用户解决问题的速度,也使得用户可以在更高的层面上
考虑问题。
与机器语言、汇编语言相比,高级语言的出现大大地简便了程序设计。但是要将解答问
题的步骤从非形式的自然语言表达到形式化的高级语言表达,仍然是一个复杂的过程,仍然
要做很多繁杂琐碎的事情,因而仍然需要抽象。
对于一个明确的问题,要解答这个问题,总是先选用该问题的一个数据模型。接着,弄清
该问题所选用的数据模型在已知条件下的初始状态和要求的结果状态,以及隐含着的两个状
态之间的关系。然后探索从数据模型的已知初始状态出发到达要求的结果状态所必需的运算
步骤。
我们在探索运算步骤时,首先应该考虑顶层的运算步骤,然后再考虑底层的运算步骤。
所谓顶层的运算步骤是指定义在数据模型级上的运算步骤,或叫宏观运算。它们组成解答问
题步骤的主干部分。其中涉及的数据是数据模型中的一个变量,暂时不关心它的数据结构;
涉及的运算以数据模型中的数据变量作为运算对象,或作为运算结果,或二者兼而为之,简
称为定义在数据模型上的运算。由于暂时不关心变量的数据结构,这些运算都带有抽象性质,
不含运算的细节。所谓底层的运算步骤是指顶层抽象的运算的具体实现。它们依赖于数据模
型的结构,依赖于数据模型结构的具体表示。因此,底层的运算步骤包括两部分:一是数据
模型的具体表示;二是定义在该数据模型上的运算的具体实现。我们可以把它们理解为微观
运算。于是,底层运算是顶层运算的细化,底层运算为顶层运算服务。为了将顶层算法与底
层算法隔开,使二者在设计时不会互相牵制、互相影响,必须对二者的接口进行一次抽象。
让底层只通过这个接口为顶层服务,顶层也只通过这个接口调用底层的运算。这个接口就是
抽象数据类型。
抽象数据类型(abstract data type, 简称ADT)由一种数据模型和在该数据模型上的一
组操作组成。
抽象数据类型包括定义和实现两个方面,其中定义是独立于实现的。抽象数据类型的定
义仅取决于它的逻辑特性,而与其在计算机内部的实现无关,即无论它的内部结构如何变化,
只要它的逻辑特性不变,都不会影响到它的使用。其内部的变化(抽象数据类型实现的变化)
只是可能会对外部在使用它解决问题时的效率上产生影响,因此我们的一个重要任务就是如
何简单、高效地实现抽象数据类型。很明显,对于不同的运算组,为使组中所有运算的效率
都尽可能地高,其相应的数据模型具体表示的选择将是不同的。在这个意义下,数据模型的
具体表示又依赖于数据模型上定义的那些运算。特别是,当不同运算的效率互相制约时,还
必须事先将所有的运算的相应使用频度排序,让所选择的数据模型的具体表示优先保证使用
频度较高的运算有较高的效率。
我们应该看到,抽象数据类型的概念并不是全新的概念。抽象数据类型和数据类型在实
质上是一个概念,只不过是对数据类型的进一步抽象,不仅限于各种不同的计算机处理器中
已经实现的数据类型,还包括为解决更为复杂的问题而由用户自定义的复杂数据类型。例如
高级语言都有的“整数”类型就是一种抽象数据类型,只不过高级语言中的整型引进实现了,
并且实现的细节可能不同而已。我们没有意识到抽象数据类型的概念已经孕育在基本数据类
型的概念之中,是因为我们已经习惯于在程序设计中使用基本数据类型和相关的运算,没有
进一步深究而已。
抽象数据类型一方面使得使用它的人可以只关心它的逻辑特征,不需要了解它的实现方
式。另一方面可以使我们更容易描述现实世界,使得我们可以在更高的层面上来考虑问题。
例如可以使用树来描述行政区划,使用图来描述通信网络。
根据抽象数据类型的概念,对抽象数据类型进行定义就是约定抽象数据类型的名字,同
时,约定在该类型上定义的一组运算的各个运算的名字,明确各个运算分别要 有多少个参
数,这些参数的含义和顺序,以及运算的功能。一旦定义清楚,人们在使用时就可以像引用
基本数据类型那样,十分简便地引用抽象数据类型;同时,抽象数据类型的实现就有了设计
的依据和目标。抽象数据类型的使用和实现都与抽象数据类型的定义打交道,这样使用与实
现没有直接的联系。因此,只要严格按照定义,抽象数据类型的使用和实现就可以互相独立,
互不影响,实现对它们的隔离,达到抽象的目的。
为此抽象数据类型可以使用一个三元组来表示:
ADT = (D, S, P)
其中D 是数据对象,S 是D 上的关系集,P 是加在D 上的一组操作。
在定义抽象数据类型时,我们使用以下格式:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>

}

扫一扫超人学院微信二维码:

时间: 2024-10-25 19:47:59

抽象数据类型的相关文章

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

数据类型和抽象数据类型

<(^-^)> 我们知道在各种编程语言中都会有数据类型. 一.数据类型 先看看为什么会有不同的数据类型呢?很简单,很多东西不能一概而论,而是需要更精确的划分.计算机计算1+1并不需要多么大的空间,但是计算10000000000+1000000000就得需要有个比较大的空间来放.还有有时候会计算小数,小数的位数不一样,需要的空间也就不一样.数字1和字母a也需要区分啊,于是开发者就想出了“数据类型”这一招,用来描述不同的数据的集合. 我记得最早接触的数据类型就是int了.当初一个int a;就把我

计算机软考笔记之《抽象数据类型(ADT)》

1.引言 1抽象数据类型和数据结构的关系 抽象数据类型(ADT)是一种比数据结构处于更高抽象层的数据类型,ADT使用数据结构来实现. 2数据类型的定义和应用于数据的操作定义是ADT背后的一部分概念,隐藏数据上的操作是如何进行的. 3分类:简单抽象数据类型和复杂抽象数据类型 简单ADT:整数.实数.字符.指针: 复杂ADT:需要建立.不需要详细说明实现过程的泛化操作成为抽象. 抽象概念意味着: ①知道一个数据类型能做什么: ②如何去做是隐藏的. 4定义 抽象数据类型就是与对数据类型有意义的操作封装

抽象数据类型(ADT)入门(一)

抽象数据类型(ADT)入门(一) 1.抽象数据类型(Abstract Data Types,ADT)和ADT的实现 抽象数据类型:一个数据元素集合以及在这些数据上的操作. ADT的一个实现包括存储数据元素的存储结构以及实现基本操作的算法. 在这个数据抽象的思想中,数据类型的定义和它的实现是分开的,这在软件设计中是一个重要的概念.这使得只研究和使用它的结构而不用考虑它的实现细节成为可能.实际上,这通常使用在int.double.char和bool等预定义数据类型上的方法,使用这些数据类型的程序员在

ELF格式解析库之抽象数据类型

抽象?抽谁的象? ELF是一种链接执行格式,它规定了对于一个ELF文件的基本数据类型是什么样的.可是,要解析一个ELF文件,而这个ELF文件或者是32Bits 或者是 64Bits,反正字长是未定的,怎么办?难道我们要定义两套解析的接口,以对应不同的字长的ELF文件吗?如果要这样做,不是不可以,只是那样做为接口的设计增加了太大的负担.这里我们采用"抽象"的方式,将已有的两套基础数据结构封装成一个兼容的数据结构.这样,我们设计解析接口时,可以做到尽量的简化,大大的减轻了工作量. 因此,这

算法(第4版)-1.2.1 使用抽象数据类型

总结:本小节是关于抽象数据类型的综述,包括是什么.为什么.怎么办. 重点: 1. 研究同一个问题的不同算法的主要原因:它们的性能特点不同. 2. API:通过列出所有构造函数和实例方法(及操作)并简要描述它们的功用,说明抽象数据类型的行为. 3. Java中的所有数据类型都会继承toString()方法来返回用String表示的该类型的值.Java会在用+运算符将任意数据类型的值和String值连接时调用该方法. 可以重写toString()方法.必须声明为public String toStr

线性表的抽象数据类型描述

代码如下 1 //抽象数据类型线性表的定义 2 #include <studio.h> 3 /*-------------------初始化线性表-----------------------*/ 4 void InitList(SqList *&L) 5 { 6 L=(SqList*)malloc(sizeof(SqList)); 7 L->length=0; 8 } 9 /*--------------------销毁线性表,释放内存空间-------------------

C++抽象数据类型,如何抽象

C++是个多范式的语言,所以C++难学,所以C++强大,可比起java,C#,用C++来做软件开发,开发周期要长很多. 为什么呢?这是因为C++的自由度高,换句话说自由度越高地语言,开发软件的周期越长,这是有一定道理的 自由度过高就不容易掌控,java和C#它们的库很强大,这在一定程度上就限制了自由度,相当于提供了一套模式,方法,开发人员不需要去为实现这些东西而操心 然而C++程序员却需要为这些费劲心力,这体现在实现细节上. 本文要说的是抽象数据类型,抽象数据类型 ADT 一种重要的数据类型.它

ADT(Abstract Data Type)抽象数据类型

ADT(Abstract Data Type)抽象数据类型 为了便于理解,以复数为例: (1)定义: ADT Complex{ 数据对象:D={e1,e2|e1,e2为实数} 数据关系:S={<e1,e2>|e1是实部,e2是虚部} 基本操作: Creat(&C , x, y) GetReal(C) GetImage(C) Add(c1,c2) Sub(C1,C2) } ADT Complex; (2)表示: typedef struct{ float Realpart; float

算法(第4版)-1.2.4 更多抽象数据类型的实现

总结:本小节列举了更多抽象数据类型的实现,并讨论了维护多个实现的问题. 重点: 1. 本书中反复出现的一个主题就是我们需要理解各种实现对空间和时间的需求以及它们对各种用例的适用性. 2. 本书的一个主要目标就是深入讨论若干种基本抽象数据结构的实现并衡量他们的性能的不同. 3. 编译时出现 -Xlint:deprecation 警告时,可以不用理会,直接运行程序即可.