别怕 抽象数据类型也没你想象的那么“抽象”

原标题:别怕抽象数据类型也没你想象的那么“抽象”
抽象数据类型英文名叫(AbstractDataType) , 这里有两个关键词 , 一个叫“数据类型” , 一个叫“抽象” , 它们分别是什么意思呢?
别怕 抽象数据类型也没你想象的那么“抽象”
别怕 抽象数据类型也没你想象的那么“抽象”
文章图片
数据类型 , 它包含了两个东西 , 一个是“数据对象集” , 就是我们说的“是什么东西” , 第二个是“数据集合相关联的操作集” 。 这就好比 , 不能单纯讲怎么去处理图书 , 我们是要对这些图书进行操作的 。 这两件事情:图书的摆放 , 对图书的操作 , 是紧密结合在一起的 。
这两个东西在C语言里是独立处理的 , 但是在一些面向对象的语言里边 , 比如C++、Java , 你就会发现 , 它们很好的为数据类型专门设计了一种机制 , 就是一个“类” , 把这个数据集跟它相关的操作集封装在一个类里面 。
那再说什么是抽象呢?
抽象 , 抽象的意思就是“不具体” , 就是说 , 描述数据类型的方法是不依赖于具体的实现的 , 对一个数据类型的描述 , 它跟
存放数据的机器无关跟数据存储的物理结构无关实现操作的算法和编程语言皆无关总体来说 , 我们只描述数据对象集和相关的操作集"是什么" , 我们不关心“它是怎么做到的”这个问题 。
举个例子 , 关于“矩阵”的抽象数据类型的定义 。

别怕 抽象数据类型也没你想象的那么“抽象”
文章图片
图片首先我们要给这个抽象数据类型一个名称叫“矩阵” , 然后我们要描述一下它的数据对象集 , 一个NM的矩阵 , 是由NM个矩阵的元素构成的 , 我们把这个元素描述成一个三元组a,i,j , 其中a是这个矩阵元素的值 , 同时我们还需要知道这个矩阵元素在矩阵里面所处的位置 , 就是它的行号i和列号j , 就这样描述了一个数据的对象集 , 相关联的操作集有很多很多(如下图) 。

别怕 抽象数据类型也没你想象的那么“抽象”
文章图片
我们来看一下 , 为什么这个就叫做“抽象”的表示呢?
首先我们来看 , 在描述数据对象集的时候 , 说a是矩阵元素的值 , 那这个值是float?还是double?还是int?我们在这个抽象数据类型中描述是不关心的 。
相应地 , 当需要对它的元素值进行操作的时候 , 我们返回的也是ElementType,是一个通用的元素类型 , 我在实现这个矩阵相关的所有函数的时候 , 我在头上写一个define,你需要什么 , 我就把它define(定义)成什么样子 。
这样的话 , 你实现的这些函数是跟“你那个矩阵元素到底是哪种类型”是没有关系的 , 哪种类型都是可以运算的 。
这就避免了你对int实现了一遍 , 下一次矩阵变成double类型的 , 结果你又对double……难道重新写一遍吗?当然你说我可以直接用一个replace(替换) , 我把所有的int替换成double 。
另外一个呢 , 像这个矩阵 , 我们只是说这是一个M*N的矩阵 , 至于在程序里面它是怎样一个存法?我们是用二维数组去存它?还是一维数组?还是用链表?这个我们在抽象数据类型定义的时候 , 都是不关心的 。
我不管它是怎么实现的 , 我只是说:我要实现的是一个矩阵 。 再比如说上面图片中的Add()函数 , 如果它们可以相加的话 , 我要返回它们的和 , 那我可没说 , 在我算这个矩阵加法的时候 , 到底是先按行加呢?还是先按列加呢?我到底是用什么语言去实现这个函数呢?统统不管 , 这就是所谓的抽象 。
文章部分素材来源:51CTO