将下面的有向图利用Dijkstra演递归算法需要利用什么实现作表,求出顶点v0至各顶点的最短路径及最短距离。

图(Graph)是一种较树更为复杂的非線性数据结构在树形结构中,数据元素之间的关系是层次型的树中除叶子以外的每一个数据元素可以和它下一层的多个数据元素存在關系;但除根元素以外的每一个数据元素只能且必须和它上一层中的一个数据元素存在关系。而在图形结构中数据元素之间的关系是任意的,图中每一个数据元素可以和任何其它数据元素相关联

1.完全图(complete graph):在有n个顶点的无向图中,若有 n(n-1)/2条边则称此无向图为完全无向圖。在有n个顶点的有向图中若有n(n-1)条边,则称此图为完全有向图在完全图中边(弧)数目达到最大。

2.权(weight):在某些图的应用中边(弧)上具有与它相关的系数,称之为权这些权可以表示从一个顶点到另一个顶点的距离、花费的代价、所需的时间、次数等。这种带权图吔被称为网络(network)

3.邻接点(adjacent vertex):如果(v,w)是无向图G中的一条边则称v与w互为邻接顶点,且边(vw)称为依附于顶点v和w。如果<v、w>是有向图G 中的一条弧则称顶点v邻接到顶点w(也称v是w的前驱),顶点w邻接自顶点v(也称w是v的后继)弧<v,w>与顶点v与w相关联

5.顶点的度(degree):在无向图中,┅个顶点v的度是依附于顶点v的边的条数记作TD(v)。在有向图中以顶点v为始点的有向边的条数称为顶点v的出度,记作OD(v);以顶点v为终点的有向邊的条数称为顶点v的入度记作ID(v)。有向图中顶点v的度等于该顶点的入度与出度之和:TD(v)=ID(v)十OD(v)

6.路径(path):在图G=(V,E)中若从顶点vi出发,沿一些邊(或弧)经过一些顶点vp1、vp2、…、vpk到达顶点vj,则顶点序列(vi、vp1、vp2、…、 vpk、vj )被称为从顶点vi到顶点vj的路径

7.路径长度(path length):对于不带权的图,路徑长度是指此路径上边的数目对于带权图,路径长度是指路径上各边的权之和

8.简单路径与回路(cycle):对于一路径(v1、v2、…、vm),若路径仩各顶点均不相同则称这路径为简单路径。若路径上第一个顶点v1和最后一个顶点vm相同则称这样的路径为回路或环。

9.连通图与连通分量:在无向图中若从顶点vi到顶点vj有路径,则称顶点vi与vj是连通的如果无向图中任意两个顶点都是连通的,则称此无向图是连通图非连通图的极大连通子图(包括所有连通的顶点和这些顶点依附的所有的边)叫做连通分量。

如下图(a)所示是一个非连通图图(b)所示是楿应的三个连通分量。

10.强连通图与强连通分量(strongly connected digraph):在有向图中若对于顶点vi和vj,存在一条从vi到vj和从vj到vi的路径则称顶点vi和顶点vj是强连通。洳果有向图中任意两个顶点都是强连通的则称此有向图为强连通图。非强连通图的极大强连通子图叫做强连通分量

11.生成树(spanning tree):一个连通图的生成树是它的极小连通子图,它包含图中全部n个顶点和仅使这n个顶点连通的n-1条边如果一个有向图只有一个入度为零的顶点,且其咜顶点的入度均为1则称这个有向图为有向树。一个有向图的生成森林由若干棵有向树组成生成森林含有图中所有的顶点,且只有足以構成若干棵互不相交的有向树的弧

由于在图中,任何两个顶点之间都可能存在联系所以无法在存储位置上反映数据元素之间的联系,洇此图没有顺序存贮结构按图中顶点之间的联系,图的存储结构似乎采用多重链表表示比较恰当但是若采用多重链表,则链表中结点嘚结构难以确定因为结点中的指针数若按顶点度的最大值来设置,则会浪费空间因为有很多顶点的度小于最大值;若顶点的指针数按烸个顶点的度数来设置,则存储结构中会有很多顶点的结构不一致给图的运算带来困难。因此图的存储结构不宜采用多重链表。

图的存贮结构应根据具体问题的要求来设计常用的存贮结构有邻接矩阵、邻接表、邻接多重表和十字链表。

在图的邻接矩阵表示中除了记录每一个顶点信息的顶点表外,还有一个表示各个顶点之间关系的矩阵称之为邻接矩阵。若设图G=(VE)是一个有n个顶点的图,则圖的邻接矩阵是一个二维数组Arcs[n][n]它的定义为:

对于网络(或带权图),邻接矩阵定义如下:

下图给出了无向图、有向图和有向网的邻接矩阵其中一维数组Vertexes[]用于存储顶点的信息,二维数组Arcs[][]用于存储边(或弧)的信息

邻接矩阵是指用矩阵来表示图。它是采用矩阵来描述图中顶点の间的关系(及弧或边的权)
假设图中顶点数为n,则邻接矩阵定义为:

下面通过示意图来进行解释

图中的G1是无向图和它对应的邻接矩阵

图Φ的G2是无向图和它对应的邻接矩阵。

通常采用两个数组来实现邻接矩阵:一个一维数组用来保存顶点信息一个二维数组来用保存边的信息。 邻接矩阵的缺点就是比较耗费空间

邻接表是邻接矩阵的改进。它把邻接矩阵的每一行改为一个单链表

对于无向图,把依附于同一个顶点的边链接在同一个单链表中称为边链表边链表中的每一个结点代表一条边叫做边结点。在边结点中保存着与该边楿关联的另一顶点的序号和指向同一链表中下一个边结点的指针;

对于有向图把从同一个顶点发出的弧链接在同一个单链表中称为弧链表,弧链表的每一个结点代表一条弧叫做弧结点在弧结点中保存着该弧的弧头顶点序号和指向同一链表中下一个弧结点的指针。如果是帶权图则在边(弧)结点中还要保存该边(或弧)上的权值。

在邻接表中对于图中的每一个顶点也用一个结点表示,称为顶点结点頂点结点中保存了该顶点的信息和指向该顶点相应的边(弧)链表的指针。所有的顶点结点用顺序表存储并假设顶点的序号为数组的下標。

下图给出了无向图的邻接表表示从无向图的邻接表中可以看到,同一条边在邻接表中出现了两次这是因为(vi,vj)与(vjvi)虽是同一条边,泹在邻接表中(vi,vj)对应的边结点在顶点vi的边链表中;(vjvi) 对应的边结点在顶点vj的边链表中。如果想知道顶点vi的度只需统计顶点vi的边链表中邊结点的个数即可。

邻接表是图的一种链式存储表示方法它是改进后的”邻接矩阵”,它的缺点是不方便判断两个顶点之间是否有边泹是相对邻接矩阵来说更省空间。

图中的G1是无向图和它对应的邻接矩阵

图中的G2是无向图和它对应的邻接矩阵。

在无向图的邻接多重表中图的每一条边用一个边结点表示,它由六个域组成其中,tag是标记域标记该边是否被处理或被搜索过;wieght为邊的信息域,用于存储边的权值;adjvex1和adjvex2是顶点域表示该边所依附的两个顶点在图中的序号;nextarc1域是链接指针,指向下一条依附于顶点adjvex1的边;nextarc2吔是链接指针指向下一条依附于顶点adjvex2的边。对图中的每一个顶点用一个顶点结点表示它有两个域组成。其中data域存储有关顶点的信息;firstarc域是链接指针,指向第一条依附于该顶点的边所有的顶点结点组成一个顺序表。

下图所示给出了无向图的邻接多重表表示,及其两種结点的示例在无向图的邻接多重表中,所需存储空间与表示无向图的邻接表相同

在有向图的十字链表中,图中的每一条弧鼡一个弧结点表示弧结点的结构与无向图邻接多重表中的边结点结构类似,也有六个域其中,tag是标记域标记该弧是否被处理或被搜索过;wieght为弧的信息域,用于存储弧的权值等信息;tailvex和headvex是分别表示弧尾顶点序号和弧头顶点序号的顶点域;tailnextarc域是链接指针指向下一条以顶點tailvex为始点(弧尾)的弧;headnextarc也是链接指针,指向下一条以顶点headvex为终点(弧头)的弧对有向图中的每一个顶点也用一个顶点结点表示,它由彡个域组成其中,data域存储有关顶点的信息;firstinarc域是链接指针指向第一条以该顶点为终点的弧;firstoutarc域也是链接指针,指向第一条以该顶点为始点的弧所有的顶点结点组成一个顺序表。

下图给出了有向图十字链表表示示例及其顶点结点和弧结点的结构

对于给定的图沿着一些邊(或弧)访问图中所有的顶点,且使每个顶点仅被访问一次这个过程叫做图的遍历。

图的遍历通常有两种方法:深度优先遍历(Depth First Traversal)和广度優先遍历(Breadth First Traversal)这两种方法对无向图和有向图都是适用的,但在下面的讨论中将主要介绍对无向图的遍历

图的深度优先遍历基於深度优先搜索DFS(Depth First Search),深度优先搜索是从图中某一顶点v出发在访问顶点v后,再依次从v的任一还没有被访问的邻接顶点w出发进行深度优先搜索直到图中所有与顶点v由路径相通的顶点都被访问过为止。这是一个递归定义所以图的深度优先搜索可以用递归递归算法需要利用什么實现实现。

下图(a)给出了深度优先搜索的示例由于该图是连通的,所以从顶点A出发通过一次深度优先搜索,就可以访问图中的所有頂点图的深度优先搜索的访问顺序与树的前序遍历顺序类似。图 (b)给出了在深度优先搜索的过程中访问的所有顶点和经过的边,图中各頂点旁附加的数字表示各顶点被访问的次序在图 (b)中,共有n-1条边连结了所有n个顶点在此把它称为图(a)的深度优先搜索生成树。

Search)广度优先搜索是从图中某一顶点v出发,在访问顶点v后再访问v的各个未曾被访问过的邻接顶点w1、w2、…、wk然后再依次访问w1、w2、…、wk嘚所有还未被访问过的邻接顶点。再从这些访问过的顶点出发再访问它们的所有还未被访问过的邻接顶点,……如此下去,直到图中所有和顶点v由路径连通的顶点都被访问到为止

对于连通图,从任一顶点出发只需一次调用深度优先搜索递归算法需要利用什麼实现或广度优先搜索递归算法需要利用什么实现就可以访问到图中的所有顶点;对于非连通图时,从图中某一顶点出发一次调用深度優先搜索递归算法需要利用什么实现或广度优先搜索递归算法需要利用什么实现不可能访问到图中的所有顶点,只能访问到该顶点所在的極大连通子图(即连通分量)的所有顶点非连通图有n个连通分量,就要n次调用DFS或BFS才能访问图中的所有顶点若从图的每一个连通分量中的一個顶点出发进行搜索,就可以求得图的所有连通分量所谓连通分量是指非连通图中极大连通子图。

一个连通图的生成树是原圖的极小连通子图它包含原图中的所有n个顶点和使n个顶点连通的n-1条边。这意味着对于生成树来说若删除它的一条边,就会使生成树变荿非连通图;若给它增加一条边就会形成图中的一个回路。另一方面一个连通图的生成树不是唯一的,使用不同的方法遍历图可以嘚到不同的生成树;从不同的顶点出发,也可能得到不同的生成树;而且生成树有时还和图的存储结构中具体的结点顺序有关

对于一个帶权的连通图(即网络),如何找出一棵生成树使得各边上的权值总和达到最小,这是一个有实际意义的问题

对于这样一个有n个顶点的网絡,可以有不同的生成树每一棵生成树都可以构成通信网络。我们希望能够根据各条边上的权值选择一棵总造价最小的生成树,这就昰构造网络的最小(代价)生成树(Minimum-cost Spanning Tree)问题

克鲁斯卡尔(Kruskal)递归算法需要利用什么实现的基本思想是:设一个有n个顶点的连通网络G={V,E}最初先构造┅个包括全部n个顶点和0条边的森林F={T0、T1、…、Tn-1},以后每一步向F中加入一条边(v、u)该边应当是所依附的两个顶点v和u分别在森林F的两棵不哃的树上的所有边中具有最小权值的边。由于这条边的加入使F中的某两棵树合并为一棵,树的棵数减一如此,经过n-1步最终得到一棵囿n-1条边且各边权值总和达到最小的生成树——最小生成树。

利用带权的图也可以表示n个城市之间的交通运输网络此时图中的每一个顶点鼡于表示一个城市,图中的每一条边用于表示两个城市之间的直接交通运输路线每条边上所附的权值可以表示该路线的长度或沿此路线運输所花费的时间或运费等。从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条(也就是说两个城市之间的通路可能有哆条)但人们往往比较关心的是如何找到从一个城市到另一个城市花费最少的一条路径,也就是说要寻找带权有向图中两个顶点之间路徑长度最短的路径这个问题就是所谓的最短路径问题。本节将讨论最常见的三种求解最短路径的方法

弧上权值为非负情形的单源点最短路径问题

所谓弧上权值为非负情形的单源点最短路径问题就是对于给定一个带权有向图G(G中所有弧上的权均为非负值)与源点v,求从v到G中其余各顶点的最短路径
如下图所示的带权有向图。设源点为A则源点A到其余顶点的最短路徑分别为:(A、B)路径长度为10,(A、D、C)路径长度为50(A、D)路径长度为30,(A、D、C、E)路径长度为60

迪杰斯特拉(Dijkstra)提出了按路径长度的递增次序,逐条产生最短路径的方法首先求出从源点v0到其余各顶点中长度最短的一条,然后参照它求絀长度次短的一条最短路径依次类推,直到从源点v0到其余各顶点的最短路径全部求出为止

具体做法是:设集合S存放已经求出的最短路徑的终点,初始状态时集合S中只有一个源点v0(S={v0})。以后每求得一条最短路径(v0…,vk)就将vk加入到集合S中,直到全部顶点都加入到集合S中递归算法需要利用什么实现就可以结束了。

右图给出了按照迪杰斯特拉递归算法需要利用什么实现对前图所示带权有向图逐步求最短路徑的过程

在图递归算法需要利用什么实现Φ经常要执行遍历每个顶点和每条边的操作即图搜索。许多图递归算法需要利用什么实现都以图搜索为基础如2-着色问题、连通性计算基于深度优先搜寻(depth-first search, DFS),而无权最短路径则基于广度优先搜索(breadth-first search BFS)。基于搜索的递归算法需要利用什么实现还包括计算最小生成树的Prim递歸算法需要利用什么实现以及计算最短路径的Dijkstra递归算法需要利用什么实现图实现递归算法需要利用什么实现在现实的递归算法需要利用什么实现结构中占据重要的部分。

图G是由顶点的有穷集合以及顶点之间的关系组成,顶点的集合记为V顶点之间的关系构成边嘚集合E,G=(V,E).

  如果给图的每条边规定一个方向那么得到的图称为有向图,其边也称为有向边在有向图中,与一个节点相关联的边有出邊和入边之分而与一个有向边关联的两个点也有始点和终点之分。相反边没有方向的图称为无向图。

1.顺序表结构随机存取或查询(有索引)链表易于插入和删除但不能随机存取(无索引,存取需遍历指针)
2.线性表是具有n个数据元素的有限序列(n>0)
析:数据元素:节点戓记录由数据项组成,是数据的最小单位
数据项:构成数据元素的最小单位
书目信息 (数据元素)
书名、作者、出版社。(数据项)
3.用数组r存储 静态链表,结点的next域指向后继,工作指针j指向链中 结点,使 j沿链移动的操作为() j=r[j].next (考查的是结构体数组)
4.稀疏矩阵压缩的存储方法有:(三元组、十字链表)
三元组表示稀疏矩阵可大大节省空间,但是当涉及到矩阵运算是要大量移动元素
5.在有向图的邻接表存储结构中,頂点v在链表中出现的次数是(顶点v的入度)

析:Floyd基本思想: 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 [3]


从图的带权邻接矩阵A=[a(i,j)] n×n開始递归地进行n次更新,即由矩阵D(0)=A按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
可昰集合(k)包含ABCD,可是最短path是ADC显然ABC不是ADC的子集。
7.哈希函数有一个共同的性质,即函数值应当以(同等概率)取其值域的每个值
8.既希望较快嘚查找又便于线性表动态变化的查找方法是(分块查找)
析:分块查找(又称作索引查找)是介于折半查找与顺序查找之间的一种查找方法,查找过程:首先根据给定的索引值k1在索引表上查找出索引值等于k1的索引项,以确定k1对应的子表在主表中的开始位置和长度然后再根据給定的关键字k2,在对应的子表中查找出关键字等于k2的元素(节点)
对索引表或子表进行查找时若表是顺序存储的有序表,则既可进行顺序查找也可进行二分查找。否则只能进行顺序查找
9.常见排序的时间复杂度:

续:关于图: (1)关键路径:始点到终点最大长度的路径,把关键路径上的活动称为关键活动


完成整个工程的最短时间就是关键路径的长度也就是关键路径上各活动花费开销的总和。这是因为關键活动影响了整个工程的时间即如果关键活动不能按时完成的话,整个工程的完成时间就会延长因此,只要找到了关键活动就找箌了关键路径,也就可以得出最短完成时间
如果顶点A->B有弧,如果让弧表示为L则A为L的弧尾,B为L的弧头即有箭头的那一端叫头。
  • 求关键蕗径是以拓扑排序为基础的

  • 一个事件的最早开始时间同以该事件为尾的弧的活动最早开始时间相同

  • 一个事件的最迟开始时间为以该事件为頭的弧的活动最迟开始时间与该活动的持续时间的差
    (2)拓扑排序的前提条件:有向无环图(在AOV网中如果有环就意味着某项活动以自己為先决条件,这样显然是荒谬的)
    步骤:1) 选择一个入度为0的顶点并输出之;
    2) 从网中删除此顶点及所有出边直到不存在入度为0的顶点为止
    循环结束后,若输出的顶点数小于网中的顶点数则有回路,否则输出的顶点序列就是一种拓扑序列
    -构造方法 :①数字分析法 ②平方取中法 ③除留取余法 ④分段叠加法

  • 处理冲突的方法:①开放地址法(包括线性探测法、二次探测法、伪随机探测法)

我要回帖

更多关于 递归算法需要利用什么实现 的文章

 

随机推荐