抽象数据类型

《C++数据抽象和问题求解(第6版)》第1章数据抽象:墙,本章将介绍一个简单的ADT,并用其演示ADT普遍意义上的优点。本节为大家介绍抽象数据类型。

AD:2013云计算架构师峰会课程资料下载

1.4  抽象数据类型

问题的解决方案通常需要对数据执行操作。这些操作从广义上来讲是下面三种操作之一:

向数据集合中添加数据

从数据集合中删除数据

在数据集合中查询数据

注释:对数据的典型操作

当然,随着应用程序的不同操作的细节也有所不同,但是总的主题是管理数据。然而要意识到,并不是所有的问题都会使用到全部的这些操作。

本书大部分内容都是关于数据抽象的。为了抽象地考虑数据,应该定义一个抽象数据类型,也就是ADT。ADT集合了数据以及针对数据的操作。只要知道其规范,就可以使用ADT的操作,而不必关心操作如何实现或者数据如何存储。

最终,某个人(或许就是您)会使用数据结构实现ADT,数据结构是一种可以用编程语言定义的、用于存储数据的结构。例如,可以在C++字符串数组、对象数组以及数组的数组中存储数据。

注释:ADT并不是数据结构的另一个名称

例如,假定以某种方式存储一组名称,从而可以快速地找到指定名称。"提供快速查找的名称项集合"就是ADT的一个简单描述。为了完整地指明对数据的影响,ADT操作的这一描述必须严密,同时又不能指明如何存储数据以及如何执行操作。例如,ADT操作不应该指明是在连续的内存还是分散的内存中存储数据。当实现ADT的时候,可以选择某种特定的数据结构。

注释:规范指明ADT操作做什么,但是并不指明如何实现

当程序必须执行语言不直接支持的数据操作时,首先必须设计一个ADT,并详细指明ADT操作将做什么(契约)。然后(也只能在此之后)使用数据结构实现这些操作。如果恰当地实现了这些操作,则程序的其余部分就可以假定这些操作按照说明被执行,也就是说契约的条款被执行。然而,程序不应该为了支持这些操作而依赖于特定的技术。

注释:在实现之前要小心地指定ADT的操作

提示:ADT与数据结构

抽象数据类型是一个规范,用于一组值以及对这组值执行的操作。

数据结构是使用编程语言对ADT的实现。

为了让您更好地理解ADT和数据结构的不同,考虑如图1-4所示的冰块供应机。这个机器将水作为输入,根据按下的按钮可以输出凉水、碎冰或者冰块。

注释:ADT和数据结构并不相同

这台机器还有一个灯指示没有冰的情况。水好比数据,chill、crush、cube以及isEmpty(或者noIce)就是操作。在这个设计层次上,供应机可以比作ADT;您并不关心供应机如何执行操作,只知道这台机器可以执行这些操作。如果想要碎冰并且供应机可以提供碎冰,您会真的关心供应机如何完成这个任务吗?这样,当指定了供应机的操作之后,可以为碎冰定义多种用法,而不需要知道供应机如何完成任务,也不需要担心工程细节。

然而,最终必须有人来创建供应机。例如,这台机器究竟如何制造碎冰?可以首先制造冰块,然后用两个钢滚筒将冰块压碎或者用锤子将冰块敲碎,此外还有许多其他技术可以使用。供应机的内部结构对应着ADT的编程语言实现,也就是数据结构。

尽管供应机的拥有者不关心其内部状况,但是仍然希望这台机器的操作尽可能地高效。与此类似,供应机的制造商希望这台机器尽可能地容易制造并且价格低廉。当选择数据结构实现ADT的时候也必须有同样的考虑。即使自己不去实现ADT,而是使用已经被实现的ADT,至少也应该像购买冰块供应机的人那样关心ADT的效率。

注意包围着供应机的钢铁外壁,外壁上仅有的空隙包含了机器的输入(水)和输出(冷水、碎冰或冰块)。因此,机器的内部结构不仅对用户隐藏,而且不可访问。此外,某个操作的机制对其他操作而言也是不可见并且不可访问的。

这样的模块化设计具有许多优点。例如,为了加强crush操作可以对其进行修改,这样做不会影响其他模块。还可以在机器中加入某个操作而不影响原始的3个操作。因此,抽象和信息隐藏都起到了作用。

注释:程序不应该依赖于ADT的实现细节

总而言之,数据抽象在数据结构和访问该数据结构的数据的程序之间建立了一堵ADT操作墙,如图1-5所示。如果位于墙的程序侧,则可以看到一个能够与数据结构通信的接口。也就是说,您请求ADT操作去控制数据结构中的数据,而ADT操作将结果返回给您。

这个过程类似于使用自动贩卖机。您按下按钮与机器通信,并获得返回的一些东西。机器外部的设计说明如何使用它,类似于ADT规范管理其操作。只要根据设计使用自动贩卖机,就可以忽略其内部的技术。只要同意只使用ADT操作访问数据,程序就可以忽略实现ADT的数据结构中的任何改动。

注释:使用ADT就好像使用自动贩卖机

下面的内容讲述一些抽象数据类型,关注其操作规范而不是实现

你可能感兴趣的:(数据结构)