数据结构(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]直到队空

 

posted @ 2018-07-28 12:23  带带大璞璞  阅读(582)  评论(0编辑  收藏  举报