抽象数据类型
抽象数据类型
-----简单来说就是我们实现的类的内部属性都设置为private、final型,内部属性对于用户来说都是不能直接获取和使用的,我们构造一些方法让用户进行相应的操作。强调“作用于数据上的操作”
表示空间R
表示空间
----- 简单来说就是我们内部的实现,我们设计一个类时,内部的属性有什么,属性是如何实现的
例:
我们构造一个有向图类
内部属性有
private Set v; — 内部表示点集
private List edges ; ---- 内部表示边集
class Edge ---- 内部表示边
{
private String source; — 边的起点
private String target; ---- 边的终点
private int weight; ---- 边的权值
}
这些都是我们实现我们的有向图的内部实现
表示独立性
表示独立性
----- 简单来说,就是内部实现与用户互不影响
我们的内部表示是如何实现的与用户无关,例我们实现String类,我们内部存储表示一个字符串,但我们是利用字符数组或是List类来存储表示用户是不知道的。
而且我们的内部是如何实现的不会影响用户的操作,用户的操作也不会影响我们的内部实现
表示不变量RI
简单来说-----就是我们类内部属性需要满足的要求,就是我们对我们类的具体实现限制的条件,只有满足我们的表示不变量条件(RI)的才是我们类的具体实现
例:
我们设计一个边类Edge(表示一条有向边)
Class Edge()
{
//属性
private String souece;//边的起点
private String target;//边的终点
private int weight;//边的权值
}
我们设置只有边的权值大于0的边才能是我们的具体实现
我们的表示不变量就是:
RI: weight >0
checkRep
checkRep
---- 就是我们设置的检查,检查我们的表示不变量是否还满足,如果不满足我们就停止,防止继续进行下去出现更大的错误
抽象空间 A
抽象空间 — 就是用户看到和使用的值
抽象函数 AF
抽象函数
---- 就是内部空间(R)到抽象空间的映射(AF)
例:
我们构造一个有向图类
Class Graph()
{
private Set v;
private List edges ;
}
—> A
v —> 有向图的点集
一个属于v 的字符串(例: “a" ) ---->有向图的一个点
edges --> 有向图的边
一个Edge 具体实现 —> 有向图的一条有限边
AF(v,edges) — > 一个包含v中所有点及包含edges中所有边的有向图
抽象函数AF是一个映射
关键:
一个满足我们的表示不变量的内部空间实现—> 抽象空间的一个值
该映射一定是满射的
我们的AF是将对于满足我们的表示不变量的内部实现映射到我们的抽象空间,所以每个我们用户可以看到和使用的值在我们的内部空间内一定有满足我们表示不变量的内部表示
该映射未必单射
我们的内部实现可能不同,但对应的抽象空间的值是同一个例:
我们内部实现的字符串类:
“aaa” “abc” 我们抽象想要是将所有以相同字母开头的字符串归为同一类,所以即使内部表示不同,但是对应的抽象表示是相同的,所以可能不是单射
而且我们是整个内部空间到抽象空间的映射,但是只有满足我们表示不变量的内部表示才有抽象空间的值与其对应,所以可能内部空间实现在抽象空间无对应值
设计ADT
上面的学习中我们知道
ADT 内容有内部空间R和抽象空间A,表示不变量RI,抽象函数AF
设计一个ADT设计步骤:
A,R ----> RI ----> AF
首先我们要根据抽象空间,用户已知的值来实现我们的内部空间 ,并规定我们的内部实现不变来那个,设置怎样的内部实现才是合法的,然后设置我们的映射关系AF,内部实现是如何映射到我们的抽象空间的