抽象数据类型

✍ dations ◷ 2025-11-11 18:54:15 #抽象数据类型,类型论,数据结构,数据类型

抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的,通过其上的可执行的操作以及这些操作的效果的数学约束(与可能的代价)。

例如,抽象的堆栈(stack)由3个操作定义:推入push,弹出pop(接受约束:每次弹出返回的是最新被推入且没有被弹出的数据,也就是后进先出),查看堆栈顶端数据peek。当分析使用堆栈算法的效率,所有这3个操作用时相同,无论堆栈中包含多少项数据;并且对每项数据栈使用了常量大小的存储。

抽象数据类型(ADT)是纯粹理论实体,用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。一个ADT可以用特定数据类型或数据结构实现,在许多程序设计语言中有许多种实现方式;或者用形式规范语言描述。ADT常实现为模块(module):模块的接口声明了对应于ADT操作的例程(procedure),有时用注释描述了约束。

在编程语言(或库)和教科书中,常见的几个抽象数据类型如下:

实现于程序时,抽象数据类型只显现出其接口,并将实现加以隐藏。用户只需关心它的接口,而不是如何实现。未来更可以改变实现的方式。(其支持信息隐藏原理,或保护程序免受变化的冲击。)

抽象数据类型的强处在于对用户隐藏了实现细节,仅公开其接口。这表示抽象数据类型可以用各种方法来实现,只要遵循其接口,就不会影响到用户。

在抽象数据类型和数据结构之间,有一个实现上的微妙差别。例如,列表的抽象数据类型可以数组为基础、或者使用链表来实现。列表即是一种具良好运算(加入元素、移除元素等等)定义的抽象数据类型。链表是以指针为基础的数据结构,且可用来创建一个列表。链表常用于列表的抽象数据类型。

同样地,二叉树搜索法的抽象数据结构可以几个方式实现:二叉树、AVL树、红黑树、数组等等。且无须关心其实现,二叉树搜索法总是有相同的运算(插入、移除、查找等等)。

从实现中分离出接口,并不表示用户不该知道实现的方法,而是用户不能依赖于实现细节。例如,一个抽象数据类型可以用脚本语言创建,或其它可以被反编译的语言(如 C语言)。即使用户可发现实现的方法,只要所有客户端程序遵循该接口,且改变实现方式时不会产生影响,那就仍是抽象数据类型。

在面向对象的用语中,抽象数据类型相当于类别;抽象数据类型的实体就相当于对象。某些语言包含了用于宣告抽象数据类型的构造函数。例如,C++ 和 Java 为此提供了类的构造函数。

抽象数据结构即根据所要运算的数据以及其计算复杂性所定义的抽象存储区,而不关心具体的数据结构的实现。

就实现高效率的算法而言,对数据结构的选择相当重要。抽象数据结构的选择,决定了高效率的算法的设计,和估计其计算复杂性。

这个概念与编程语言理论中所使用的抽象数据类型非常接近,大致上抽象数据结构和抽象数据类型的名称,和具体的数据结构的名称一致。

一部分抽象数据类型在程序设计中相当普遍且实用,所以在某些编程语言中,成为原生类型、或加进标准库中。例如,Perl 的数组可以用列表或双端队列之类的抽象数据类型来实现,散列表也可以用 Map 或 Table 来做。C++ 标准库和 Java 库也提供了列表、堆栈、队列、Map、优先权队列和字符串。

有理数(可以 a/b 格式表示的数,且 a 和 b 都是整数)本来是不能在电脑中表示出来。不过可以合理的抽象数据类型来定义,如下。

构造:使用两个整数 a 与 b 创建实体,其中 a 为分子,b 为分母。

运算:加法、减法、乘法、除法、乘幕、比较、约分,转成实数(浮点数)。

要完成整个规格,就要根据数据来定义所有的运算。例如,当两个有理数 a/b 和 c/d 相乘时,相乘的结果就要定义为 ( a c ) / ( b d )。还有输入、输出、先决条件、后置条件,以及对抽象数据类型的各种假定。

堆栈的抽象数据类型接口,以 C 语法编写:

long stack_create(); /* 建立新的堆疊實體 */void stack_push(long stack, void *item); /* 將一個項目堆入堆疊 */void *stack_pop(long stack); /* 從堆疊頂部取得項目 */void stack_delete(long stack); /* 刪除堆疊 */

用法

抽象数据类型可以如下方式使用:

long stack;struct foo *f;stack = stack_create(); /* 建立堆疊 */stack_push(stack, f); /* 將 foo 結構加入堆疊 */f = stack_pop(stack); /* 從堆疊取得頂部的結構 */

各种实现

上述堆栈的抽象数据类型,一开始可以使用数组来实现,然后改用链表,而不会伤到任何用户的代码。有多少方法可以实现抽象数据类型,取决于编程语言。例如,上述示例可使用 C 编写一个结构,以及随同的一组数据结构,可使用数组或链表来存放记录;当构造函数函数返回一个抽象句柄时,就对用户隐藏了真实的实现过程。

相关

  • 罗马尼亚人罗马尼亚人 (罗马尼亚语:români)是主要聚居在南欧巴尔干半岛上的一个民族。总人口在2380万人之间。大部分罗马尼亚人分布在罗马尼亚和摩尔多瓦两国。另外在罗马尼亚邻近的巴尔
  • 堪察加人伊捷尔缅族(俄语:Ительме́ны ,伊捷尔缅语:Ительмень, итэмэн)是俄罗斯堪察加半岛的本土民族。他们的语言伊捷尔缅语与楚科奇语及科里亚克语形成一个语
  • 胡桃核桃(英语:walnut),又称作羌桃、合桃、万岁子,为胡桃科胡桃属(学名Juglans)植物的统称,原产于中亚地带。羽状复叶,花为穗状花序,有树脂,小枝中空,内有片状髓心,雌雄同株。坚果大,肉质的绿
  • 六氢番茄红素六氢番茄红素是一种橙色色素,天然存在于西红柿和其他蔬菜。是类胡萝卜素在形成过程中的一个中间物质,具有很强的活性与抗氧化作用,是第二个类胡萝卜素生物合成的产物。分析表明
  • 泰内雷沙漠泰内雷(Ténéré、或译“特内雷”)是位于非洲撒哈拉南端;介于尼日尔共和国东北方与乍得共和国西方之间的沙漠,所覆盖的面积在40万平方公里以上。所界定的边境范围是北起阿哈加
  • 皮肤肿瘤皮肤癌是一种生长在皮肤上的癌症,它是由异常的细胞发展而来,甚至有可能会侵犯扩散到身体不同部位。由于皮肤癌常常在表皮层中发展,肿瘤常常清晰可见,因此大部分时间,可以在早期发
  • 什穆埃尔·诺厄·艾森施塔特什穆埃尔·诺厄·艾森施塔特(希伯来语:שמואל נח אייזנשטדט‎,英语:Shmuel Noah Eisenstadt,1923年9月10日-2010年9月2日),以色列社会学家。专长在历史社会学、比较
  • 希尔卡尼亚 (古代行省)希尔卡尼亚(希腊语:Ὑρκανία ;古波斯语:����� ;中古波斯语:������ ;阿卡德语:)是一个历史区域,由里海东南部的土地组成,在今天的伊朗。它南至厄尔布尔士山脉,东至克佩特山脉。该地区曾是米底
  • 毛鸿宾毛鸿宾(1806年-1868年),字翊云,号菊隐,山东历城(今属济南市)人,中国清朝官员。鸿宾为道光十八年(1838年)进士,选翰林院庶吉士,散馆后授编修。历迁御史、给事中。咸丰三年(1853年),在尚书孙瑞
  • 西门子Vectron西门子Vectron是由德国轨道车辆制造商西门子交通集团推出的一个可重构及模块化的机车产品组合,用于取代EuroSprinter系列电力机车和Eurorunner系列柴油机车。基于该平台可开