数据结构(java)之图
1. 图的逻辑结构
a) 定义:由一系列节点和描述节点关系的边组成,图是这些元素的集合
b) 术语
i. 顶点集:具有相同特性的数据元素的集合
ii. 边(弧):顶点之间的连线,带箭头的称为弧
iii. 弧头:构成弧的后一个顶点
iv. 弧尾:构成弧的前一个顶点
v. 度:在无向图中,每个顶点的度等于连接这个顶点的边的数量
vi. 出度:在有向图中,指向每个顶点的弧的数量
vii. 出度:在有向图中,从顶点出发的弧的数量
viii. 权:图的边所附带的信息
ix. 有向图:图中任意两顶点构成的偶对是有向的,如果任意两点间都是弧相连称为有向完全图,有n(n-1)条弧
x. 无向图:图中任意两点构成的偶对是无向的,如果任意两点之间都是边相连,称为无向完全图,共有n(n-1)/2条边
2. 图的抽象数据类型
a) 数据元素:具有相同数据类型的元素
b) 数据结构:数据元素之间通过弧形成网络
c) 数据操作:定义在IGraph中
publicinterface IGraph<E> {
int getNumOfVertex(); //获取顶点个数
boolean insertVer(E e); //插入顶点
boolean deleteVer(E e); //删除顶点
int indexOf(E e); //获得顶点位置
E valueOf(intindex); //获取指定位置的顶点
boolean insertEdge(intv1,intv2,intweight); //插入边
boolean deleteEdge(intv1,intv2); //删除边
int getEdge(intv1,intv2); //查找边
String depthFirstSerach(intv); //使用深度优先搜索
String breadFirseSerach(intv); //使用广度优先搜索
int[] dijkstr(intv); //查找源点到其他顶点位置
}
3. 图实现
a) 邻接矩阵:存储结构:用一维数组表示顶点,用二维数组表示边,假设图中顶点个数为n,数组大小为n*n,如果图的边无权值,用0表示两个顶点有边,用1表示两个顶点没边,如果边有权值,用0表示是一个点,用权值表示两个点有边,用无穷表示两个点无边(实际也用0表示)。邻接矩阵用来表示致密图会比较方便,因为当图中的边很少时,会生成一个稀疏矩阵,造成浪费
b) 邻接表:存储结构:是一种顺序存储结构和链式存储结构相结合的存储方法,顺序存储部分用来存储顶点,链式存储部分用来保存边的信息
4. 图的遍历算法
a) 深度优先搜索
i. 算法的思想:从图的某一点x出发,访问任意一个与之相邻且未被访问到的点y,然后访问任意一个与y相邻且未被访问到的点z,…直到所有点都被访问过为止。
ii. 算法的实现
[1] 构造一个栈存放顶点,访问第一个顶点v1,并将v1压入栈
[2] V1出栈,将与v1相连的所有未被访问的点入栈
[3] 重复[2]直到栈空
b) 广度优先搜索算法
i. 算法思想:从图的某一顶点x出发,访问所有与之相邻且未被访问过的顶点y,z,l,m…,再一次访问所有与y,z,l,m…相邻且未被访问过的顶点,直到所有顶点都被访问过为止
ii. 算法的实现
[1] 构造一个队列存放顶点,访问第一个顶点v1,将v1入队
[2] v1出队,将所有与v1相连且为被访问过的点入队
[3] 重复[2]直到队空
1. 图的逻辑结构
a) 定义:由一系列节点和描述节点关系的边组成,图是这些元素的集合
b) 术语
i. 顶点集:具有相同特性的数据元素的集合
ii. 边(弧):顶点之间的连线,带箭头的称为弧
iii. 弧头:构成弧的后一个顶点
iv. 弧尾:构成弧的前一个顶点
v. 度:在无向图中,每个顶点的度等于连接这个顶点的边的数量
vi. 出度:在有向图中,指向每个顶点的弧的数量
vii. 出度:在有向图中,从顶点出发的弧的数量
viii. 权:图的边所附带的信息
ix. 有向图:图中任意两顶点构成的偶对是有向的,如果任意两点间都是弧相连称为有向完全图,有n(n-1)条弧
x. 无向图:图中任意两点构成的偶对是无向的,如果任意两点之间都是边相连,称为无向完全图,共有n(n-1)/2条边
2. 图的抽象数据类型
a) 数据元素:具有相同数据类型的元素
b) 数据结构:数据元素之间通过弧形成网络
c) 数据操作:定义在IGraph中
publicinterface IGraph<E> {
int getNumOfVertex();//获取顶点个数
boolean insertVer(E e); //插入顶点
boolean deleteVer(E e); //删除顶点
int indexOf(E e);//获得顶点位置
E valueOf(intindex);//获取指定位置的顶点
boolean insertEdge(intv1,intv2,intweight); //插入边
boolean deleteEdge(intv1,intv2); //删除边
int getEdge(intv1,intv2); //查找边
String depthFirstSerach(intv); //使用深度优先搜索
String breadFirseSerach(intv); //使用广度优先搜索
int[] dijkstr(intv);//查找源点到其他顶点位置
}
3. 图实现
a) 邻接矩阵:存储结构:用一维数组表示顶点,用二维数组表示边,假设图中顶点个数为n,数组大小为n*n,如果图的边无权值,用0表示两个顶点有边,用1表示两个顶点没边,如果边有权值,用0表示是一个点,用权值表示两个点有边,用无穷表示两个点无边(实际也用0表示)。邻接矩阵用来表示致密图会比较方便,因为当图中的边很少时,会生成一个稀疏矩阵,造成浪费
b) 邻接表:存储结构:是一种顺序存储结构和链式存储结构相结合的存储方法,顺序存储部分用来存储顶点,链式存储部分用来保存边的信息
4. 图的遍历算法
a) 深度优先搜索
i. 算法的思想:从图的某一点x出发,访问任意一个与之相邻且未被访问到的点y,然后访问任意一个与y相邻且未被访问到的点z,…直到所有点都被访问过为止。
ii. 算法的实现
[1] 构造一个栈存放顶点,访问第一个顶点v1,并将v1压入栈
[2] V1出栈,将与v1相连的所有未被访问的点入栈
[3] 重复[2]直到栈空
b) 广度优先搜索算法
i. 算法思想:从图的某一顶点x出发,访问所有与之相邻且未被访问过的顶点y,z,l,m…,再一次访问所有与y,z,l,m…相邻且未被访问过的顶点,直到所有顶点都被访问过为止
ii. 算法的实现
[1] 构造一个队列存放顶点,访问第一个顶点v1,将v1入队
[2] v1出队,将所有与v1相连且为被访问过的点入队
[3] 重复[2]直到队空