【数据结构】图

图结构可以分为有向图和无向图,常见地表示方法有数组表示法、邻接表、十字链表和邻接多重表,遍历地方式有两种,一种是深度优先遍历,另一种是广度优先比遍历。

1.1 什么是图
  • 每个数据元素称为顶点,在有向图中,从V1到V3称为一条,V3到V1是另一条弧,V1称为弧尾,V3称为弧头。在无向图中,从V 1到V3称为一条
  • 有n个顶点,1/2n(n-1)条边地无向图称为完全图,有n(n-1)条弧地有向图称为有向完全图,有很少条边或图称为稀疏图,反之称为稠密图
  • 在G2无向图中,类似V3与V1、V2和V4之间有边的互称为邻接点与顶点相关联的边数称为顶点的
  • 在G1有向图中,顶点的度是顶点的出度和入度之和,以顶点为头的弧的数目称为入度,为尾的弧的数目称为出度
  • 从一个顶点到另一个顶点的顶点序列称为路径,在有向图中,路径是有方向的,路径上边或弧的数目称为路径的长度,如果一条路径中的起始顶点和结束顶点相同,那么称这个路径为或者回路,不出现重复顶点的路径称为简单路径
  • 无向图中,如果一个顶点到另一个顶点有路径,那么它们就是连通的,如果图中的任意两个顶点都是连通的,那么这个图就是连通图。无向图中的极大连通子图称为连通分量
  • 如果是有向图中的任意一对顶点都有路径,那么这个就是强连通图,相应的它的极大连通子图就称为强连通图分量
  • 一个连通图的一个极小连通子图,它包含所有顶点,但足以构成一棵树的n-1条边,加一条边必定会形成,这个就称为生成树
1.2 图的表示

表示图的方法通常有四种:
1、数组表示法;
2、邻接表;
3、十字链表;
4、邻接多重表。
邻接表是图的一种链式存储结构,十字链表是有向图的另一种链式存储结构,邻接多重表是无向图的另一种链式存储结构。

1.3 邻接表的表示与实现

邻接表有两种节点,一种是头节点,另一种是表节点。头结点中存储一个顶点的数据和指向链表中第一个结点,表结点中存储当前顶点在图中的位置和指向下一条边或弧的结点,表头结点用链式或顺序结构方法存储。
在这里插入图片描述
如下所示就是对上图G2无向图的邻接表表示:
在这里插入图片描述

1.4 图的遍历

通常图的遍历有两种:神难度优先搜索和广度优先搜索。

  • 深度优先搜索
    即树的先根遍历的推广。基本思想是

从图G的某个顶点v0出发,然后选择一个与v0相邻且没有被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且没有被访问的顶点vj进行访问,依次继续。如果当前被访问的顶点的所有邻接顶点都已经被访问,则退回到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。

  • 广度优先搜索
    即树的按层次遍历的推广,其基本思想是:

首先访问初始点vi,并将其标记为已被访问过,接着访问vi的所有未被访问过的临界点vi1,vi2,……,vin的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,以此类推,直到图中所有和初始点vi有路径相通的顶点都被访问过为止。

若一个拓扑结构如下:
在这里插入图片描述
深度优先搜索遍历顺序为
0 > 1 > 3 > 7 > 4 > 2 > 5 > 6
广度优先搜索遍历顺序为
0 > 1 > 2 > 3 > 4 > 5 > 6 > 7

1.5 最小生成树

一个有n个节点的连通图的生成树是原图的极小连通图,且包含原图中的所有n个节点,并且有保持图连通的最少的边。最小生成树可以用kruskal算法或prim算法求出。最小生成树其实是最小权重生成树的简称。

  • 最小生成树性质:设G=(V,E)是一个连通网络,U是顶点集V的一个非空真子集。若(u,v)是G中一条“一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。
  • 求MST的一般算法可描述为:针对图G,从空树T开始,往集合T中逐条选择并加入n-1条安全边(u,v),最终生成一棵含n-1条边的MST。
    当一条边(u,v)加入T时,必须保证T∪{(u,v)}仍是MST的子集,我们将这样的边称为T的安全边。
1.6 拓扑排序

简单地说,拓扑排序就是在有向图中,想访问一个顶点需要先访问它的所有前驱顶点,执行步骤为:
1、在有向图中选一个没有前驱的顶点输出;
2、从图中删除该顶点和所有以它为尾的弧;
3、重复上述步骤直到所有顶点都输出或者图中不存在无前驱的顶点为止,后者则说明图中有环。

1.7 最短路径问题

最短路径问题是图论研究中的一个经典算法,旨在寻找图(由节点和路径组成的)中两节点之间的最短路径。
Dijkstra算法就是典型的最短路径由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,知道扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
其采用的是贪心法的算法策略,大概过程是先创建两个表,OPEN和CLOSE表。OPEN表保存所有已生成而未考察的节点,CLOSE表记录已访问过的节点,然后

1、访问路网中距离起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查;
2、从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中;
3、遍历考察这个点的子节点,求出这些子节点距起始点的距离值,放子节点到OPEN表中;
4、重复第2、3步,知道OPEN表为空或找到目标点。

发布了89 篇原创文章 · 获赞 15 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章