图是一种比线性表和树更为复杂的数据结构解读课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《图是一种比线性表和树更为复杂的数据结构解读课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一种 线性 更为 复杂 数据结构 解读 课件
- 资源描述:
-
1、2019年6月30感谢你的观看1第七章 图n图是一种比线性表和树更为复杂的数据结构。在图中,元素间的关系是多对多的,即任何两个元素都有可能存在关系。n图的应用非常广泛,已渗入到诸如语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学的其它分支中(日常生活中的交通图等)。n在离散数学中,图论是专门研究图的性质的数学分支。n在数据结构中对图的讨论主要侧重于图在计算机中的存储方式和有关操作的算法。2019年6月30感谢你的观看2 图的基本内容n7.1 图的定义和术语n7.2 图的存储结构n7.3 图的遍历n7.4 图的连通性问题n7.5 有向无环图及其应用n7.6 最短路径2019年6月30感谢
2、你的观看37.1 图的定义和术语抽象数据类型图的定义:ADT Graph 数据对象 V:V是具有相同特性的数据元素的集合,称为顶点集。数据关系 R:R=VR VR=|v,wV且P(v,w),表示从v到w的弧,谓词 P(v,w)定义了弧的意义或信息 基本操作 P:CreateGraph,DestroyGraph,LocateVex,GetVex,PutVex,FirstAdjVex,NextAdjVex,InsertVex,DeleteVex,InsertArc,DeleteArc,DFSTraverse,BFSTraverse ADT Graph2019年6月30感谢你的观看4图的定义(续)n
3、图中的数据元素称为顶点(vertex),V是顶点的有穷非空集合;VR是V上顶点的序偶或无序对的集合。n若 VR,则 表示从v到w的一条弧(Arc),且称v为弧尾(Tail)或初始点(Initial node),称w为弧头(Head)或终端点(Terminal node),此时的图称为有向图(Digraph)。n若 VR必有 VR,即VR是对称的,则以无序对(v,w)代替两个有序对,表示 v和w之间的一条边(Edge),此时的图称为无向图(Undigraph)。可以说图由非空顶点集和边集所组成。2019年6月30感谢你的观看5 图的示例无向图G1有向图G2图的二元组表示参见教材P1572019年
4、6月30感谢你的观看6图的基本术语n完全图、稠密图、稀疏图n约定:用n表示图中顶点的数目,用e表示边或弧的数目n若无向图中的每两个顶点之间都存在着一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图。n当一个图接近完全图时,称为稠密图。n当一个图含有较少的边或弧(e0)for(i=1;i=num;i+)for(j=1;j=num;j+)adjarry ij=0;/*矩阵初始化*/do 2019年6月30感谢你的观看15 产生无向图邻接矩阵算法续 scanf(“%d,%d”,&v1,&v2);/*输入边*/adjarrayv1v2=1;adjarrayv2v1=1;whil
5、e(v1!=0&v2!=0);else num=0;retrun num;2019年6月30感谢你的观看16 邻接表n邻接表是图的一种链式存储结构。n在邻接表结构中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于该顶点Vi的边,即对于无向图每个结点表示与该顶点相邻接的一个顶点;对于有向图则表示以该顶点为起点的一条边的终点。n一个图的邻接矩阵表示是唯一的,但其邻接表表示是不唯一的。因为在邻接表的每个单链表中,各结点的顺序是任意的。2019年6月30感谢你的观看17无向图、有向图 2019年6月30感谢你的观看18无向图的邻接表 2019年6月30感谢你的观看19 有向图的邻接表20
6、19年6月30感谢你的观看20n邻接表中每个表结点均由两个域组成,其一是邻接点域(adjvex),用以存放与顶点Vi相邻接的顶点在图中的位置;其二是链域(next),用以指向依附于顶点Vi的下一条边所对应的结点。n如果用邻接表存放网络中的信息,则还需要在结点中增加一个存放权值的域。n在每个链表设一表头结点,一般这些表头结点本身以向量的形式存储。邻接表的若干说明2019年6月30感谢你的观看21n对于无向图的邻接表来说,一条边对应两个单链表结点,邻接表结点总数是边数的2倍。n在无向图的邻接表中,各顶点对应的单链表的结点数(不算表头结点)就等于该顶点的度数。n在有向图邻接表中,一条弧对应一个表结点
7、,表结点的数目和弧的数目相同。n在有向图邻接表中,单链表的结点数就等于相应顶点的出度数。n要求有向图中某顶点的入度数,需扫视邻接表的所有单链表,统计与顶点标号相应的结点个数。邻接表的若干说明2019年6月30感谢你的观看22邻接表存储结构定义#define MAXVEX 30 struct edgenode int adjvex;/*邻接点域*/struct edgenode*next;/*链域*/;struct vexnode char data;/*顶点信息*/struct edgenode*link;typedef struct vexnode adjlistMAXVEX;2019年6月
8、30感谢你的观看23生成无向图的邻接表算法void creategraph(adjlist g)int e,i,s,d,n;struct edgenode*p;printf(“请输入结点数(n)和边数(e):n”);scanf(“%d,%d”,&n,&e);for(i=1;i=n;i+)printf(“n请输入第%d个顶点信息:”,i);scanf(“%c”,&gi.data);gi.link=NULL;for(i=1;i=e;i+)2019年6月30感谢你的观看24生成无向图的邻接表算法续 printf(“n请输入第%d条边起点序号,终点序号:”,i);scanf(“%d,%d”,&s,&d
9、);p=(struct edgenode*)malloc(sizeof(edgenode);padjvex=d;/*邻接点序号为d*/pnext=gs.link;gs.link=p;/*将新结点插入顶点Vs边表的头部*/p=(struct edgenode*)malloc(sizeof(edgenode);padjvex=s;/*邻接点序号为s*/pnext=gd.link;gd.link=p;/*将新结点插入顶点Vd边表的头部*/2019年6月30感谢你的观看25十字链表和邻接多重表简介n十字链表是将有向图的邻接表和逆邻接表结合起来得到的一种链表。n邻接多重表是无向图的另一种链式存储结构。在
10、邻接多重表中,每一条边用一个结点表示,它由五个域组成;每一个顶点也用一个结点表示,它由两个域组成。2019年6月30感谢你的观看26 思考题n1.已知如下图所示的有向图,请给出该图的 (1)每个顶点的入/出度;(2)邻接矩阵;(3)邻接表。1562432019年6月30感谢你的观看277.3 图的遍历n从图中某一顶点出发访遍图中其余结点,且使每一个顶点仅被访问一次,这一过程称为图的遍历(Traversing Graph).n图的遍历算法是求解图的连通性、拓扑排序和求关键路径等算法的基础。n为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。n图的遍历有两种:深度优先搜索和
11、广度优先搜索。2019年6月30感谢你的观看28 深度优先搜索(DFS)n类似于树的先根遍历,是树的先根遍历的推广。n首先访问图中某指定起始点Vi,然后由Vi出发访问它的任一相邻接顶点Vj,再从Vj出发访问Vj的任一未访问过的相邻接顶点Vk,再从Vk出发进行类似访问,如此进行下去,直到某顶点已没有未被访问过的相邻接顶点时,则退回一步,退到前一个顶点,找前一个顶点的其它尚未被访问的相邻接顶点。n如有未访问过的相邻接顶点,则访问此顶点后,再从该顶点出发向前进行与前述类似的访问;n如退回一步后,前一顶点也没有未被访问过的相邻接顶点,则再向回退一步进行搜索,重复上述过程,一直到所有顶点均被访问过为止。
12、2019年6月30感谢你的观看29 图的深度优先遍历例子深度优先遍历序列:1 2 4 8 5 3 6 72019年6月30感谢你的观看30n由于图中的路径可能有环路,为了避免重复访问某些顶点,设计图的搜索算法时,可设置一个表示顶点是否被访问过的辅助数组visited,初始时将数组元素置零,一旦某顶点Vi被访问过,则令visitedVi=1,以后此顶点即不再访问。深度优先搜索算法2019年6月30感谢你的观看31 深度优先搜索算法n深度优先搜索是一种递归的过程,可以简单地将其表示成递归的形式,其算法描述如下:DFS(V0)访问V0顶点;visitedV0=1;对所有与V0相邻接的顶点w if(v
13、isitedw=0)DFS(w);2019年6月30感谢你的观看32邻接表表示的图的DFS算法 int visitedMAXVEX;void dfsgraph(adjlist adj,int n)int i;for(i=1;i=n;i+)visitedi=0;/*给visited数组赋初值*/for(i=1;i=n;i+)if(!visitedi)dfs(adj,i);2019年6月30感谢你的观看33邻接表存储结构定义#define MAXVEX 30 struct edgenode int adjvex;/*邻接点域*/struct edgenode*next;/*链域*/;struct
14、vexnode char data;/*顶点信息*/struct edgenode*link;typedef struct vexnode adjlistMAXVEX;2019年6月30感谢你的观看34从Vi出发进行DFS的递归算法void dfs(adjlist adj,int v)struct edgenode*p;visitedv=1;printf(“%d”,v);p=adjvlink;while(p!=NULL)if(visitedpadjvex=0)dfs(adjlist,padjvex);/*从v未访问的邻接点出发进行DFS*/p=pnext;2019年6月30感谢你的观看35 时
15、间复杂性分析n一个有n个顶点、e条边的图,在深度优先搜索图的过程中,找邻接点所需时间为O(e)。n对辅助数组初始化时间为O(n)。n因此,当用邻接表作为图的存储结构时,深度优先搜索图的时间复杂性为O(e+n)。2019年6月30感谢你的观看36 非递归算法n从顶点Vi出发进行深度优先遍历的递归过程也可以写成非递归的形式,此时需借助一个堆栈保存被访问过的结点,以便回溯时查找已被访问结点的未被访问过的邻接点。n设堆栈由一个一维数组构成,数组名为stack,栈顶指针为top,假设此数组足够大,不必考虑溢出的可能。2019年6月30感谢你的观看37非递归算法#define MAXVEX 100void
16、 dfs(adjlist g,int v,int n)/*从顶点v出发进行深度优先遍历*/struct vexnode *stackMAXVEX,*p;int visitedMAXVEX,top=0;for(i=1;i0|p!=NULL)2019年6月30感谢你的观看38非递归算法续 while(p!=NULL)if(visitedp-adjvex=1)p=p-next;else printf(“%d”,p-adjvex);visitedp-adjvex=1;top+;stacktop=p;p=gp-adjvex.link;2019年6月30感谢你的观看39非递归算法续 if(top0)top
17、-;/*退栈,回溯查找已被访问结点的未被访问过的邻接点*/p=stacktop;p=p-next;2019年6月30感谢你的观看40 广度优先搜索(BFS)n图的广度优先搜索(BFS)类似于树的按层次遍历。n广度优先搜索的基本思想是:首先访问图中某指定的起始点Vi并将其标记为已访问过,然后由Vi出发访问与它相邻接的所有顶点Vj、Vk,并均标记为已访问过,然后再按照Vj、Vk的次序,访问每一个顶点的所有未被访问过的邻接顶点,并均标记为已访问过,下一步再从这些顶点出发访问与它们相邻接的尚未被访问的顶点,如此做下去,直到所有的顶点均被访问过为止。2019年6月30感谢你的观看41广度优先搜索(续)n
18、在广度优先搜索中,若对顶点V1的访问先于顶点V2的访问,则对V1邻接顶点的访问也先于V2邻接顶点的访问。就是说广度优先搜索中对邻接点的寻找具有“先进先出”的特性。因此,为了保证访问顶点的这种先后关系,需借助一个队列暂存那些刚访问过的顶点。n设此队列由一个一维数组构成,数组名为Queue,队首指针和队尾指针分别为front和rear。假设数组足够大,不必考虑有溢出的可能性。n广度优先搜索不是递归过程,不能用递归形式。2019年6月30感谢你的观看42 图的广度优先遍历例子广度优先遍历序列:1 2 3 4 5 6 7 82019年6月30感谢你的观看43 图的遍历举例n已知一有向图的邻接表存储结构
19、如下页图所示,分别给出从顶点v1出发进行深度优先和广度优先遍历所得到的顶点序列。2019年6月30感谢你的观看44 一个有向图的邻接表2019年6月30感谢你的观看45例子解答n解:根据有向图的深度优先遍历算法,从顶点v1出发所得到的顶点序列是:v1,v3,v4,v5,v2 根据有向图的广度优先遍历算法,从顶点v1出发所得到的顶点序列是:v1,v3,v2,v4,v52019年6月30感谢你的观看46BFS算法描述BFS(v0)BFS(v0)访问访问v0v0顶点;顶点;visitedv0=1;visitedv0=1;被访问过的顶点入队;被访问过的顶点入队;当队列非空时,进行下面的循环当队列非空时
20、,进行下面的循环 (1 1)被访问过的顶点出队;)被访问过的顶点出队;(2 2)对所有与该顶点相邻接的顶点)对所有与该顶点相邻接的顶点w w if(visitedw=0)if(visitedw=0)(a)(a)访问访问w w顶点;顶点;(b)visitedw=1;(b)visitedw=1;(c)w (c)w入队入队;2019年6月30感谢你的观看47时间复杂性分析n一个有n个顶点、e条边的图,在广度优先搜索图的过程中,每个顶点至多进一次队列,图的搜索过程实质上是通过边来找顶点的过程,找邻接点所需时间为O(e)。n对辅助数组初始化时间为O(n)。n因此,当用邻接表作为图的存储结构时,广度优先搜
21、索图的时间复杂性为O(e+n)。2019年6月30感谢你的观看487.4 图的连通性问题 n无向图的连通分量和生成树n深度优先搜索或广度优先搜索在遍历无向图时,若无向图是连通图,则从图中任一顶点出发,便可访问到图中所有顶点。若无向图是非连通图,则需从多个顶点出发进行搜索,每次调用搜索过程得到的顶点访问序列恰为其各个连通分量中的顶点集。n遍历过程中经过的边的集合和图中所有顶点一起构成连通图的极小连通子图,为连通图的一棵生成树。分别有深度优先生成树和广度优先生成树。2019年6月30感谢你的观看49 生成树的进一步描述n在一个无向连通图G中,如果取它的全部顶点和一部分边构成一个子图G,若边集E(G
展开阅读全文