【算法设计与分析】图

参考来源:http://www.cse.iitd.ac.in/~rjaiswal/2012/csl356/

                  严蔚敏,李冬梅,吴伟民:数据结构

1.介绍

图是一种比线性表和树更为复杂的数据结构。

1.1 图的定义

图G由两个集合V和E组成,记为G=(V,E),其中V是顶点的有穷集合,E是顶点偶对(边)的有穷集合。

V(G),E(G)通常代表图G的顶点集合和边集合。若E(G)为有向边的集合,则该图为有向图;若E(G)为无向边的集合,则该图为无向图。

【算法设计与分析】图_第1张图片【算法设计与分析】图_第2张图片

1.2  图的基本术语

子图、无向完全图和有向完全图、稠密图与稀疏图、邻接点、度和入度和出度、路径和路径长度、回路或环、连通和连通图和联通分量、强连通图等等。

连通:无向图G中,顶点a到顶点b有路径,则称它们是连通的。

连通图:V中任意两个顶点都是连通的,则G为连通图。

连通分量:无向图中的极大连通子图。

【算法设计与分析】图_第3张图片

强连通图:有向图G中,V中任意两个顶点都是连通的,则G为强连通图。

1.3  图的实例

六度空间理论、交通运输网络等

2  图的数据结构

2.1 邻接矩阵表示

【算法设计与分析】图_第4张图片         【算法设计与分析】图_第5张图片

时间复杂度也是O(n^2).

优点:便于判断i j两点间是否有边,根据A[i][j]=0或1判断;便于计算各顶点的度。

缺点:不便于增加或删除顶点;不利于计算边的数目;空间复杂度高。

2.2 邻接表表示

邻接表是图的一种链式存储结构。邻接表:表头结点表+边表。

表头结点表:以顺序结构存储,便于随机访问任一顶点的边链表。表头结点:数据域+链域。数据域用于存储顶点名称和其他信息,链域用于指向链表中第一个结点。

边表:邻接点域+数据域+链域。

【算法设计与分析】图_第6张图片         【算法设计与分析】图_第7张图片

时间复杂度为O(n+e),空间复杂度为O(n+e)

优点:便于增加和删除顶点;便于统计边的数目;空间效率高。

缺点:不便于判断两点间是否有边;不便于计算有向图各顶点的度。

2.3 其他表示

十字链表、邻接多重表。

3 图的遍历

图的遍历算法是求解图的连通性问题、拓扑排序和关键路径等算法的基础。根据路径的搜索路径的方向,通常有:深度优先搜索和广度优先搜索两种遍历图的途径。对无向图、有向图都适用。

3.1 深度优先搜索(DFS)

DFS遍历类似于树的先序遍历。采用不同数据结构的DFS具体实现:

【算法设计与分析】图_第8张图片

邻接矩阵表示时查找每个顶点的邻接点的时间复杂度是O(n^2),n是顶点数;

邻接表表示时查找邻接点的时间复杂度是O(e),e是边数,所以此时用DFS遍历图的时间复杂度为O(n+e)

DFS

3.2 广度优先搜索(BFS)

BFS遍历类似于树的按层次遍历。

 利用辅助队列进行遍历,每个顶点至多进一次队列(同一层的存在同一队列中)。

应用:

判断是否有环:利用BFS,如果访问到之前访问过的点,则存在环。

是否为二部图:利用BFS进行上色,如果本层与下层存在同色,则不可二划分。

4 图的应用

图的几种常见算法。

4.1 最小生成树

对于n个顶点的连通网可以生成不同的生成树,每一棵生成树都可以是一个通信网。最合理的通信网应该是代价之和最小的生成树。

构造最小生成树有多种算法,其中多数算法利用了最小生成树的MST性质:

假设N(V,E)是一个连通网,U是顶点集V中的一个非空子集。若(u,v)是一条具有最小权值的边,其中u\in U,\quad v\in V-U,则必存在一棵包含边(u,v)的最小生成树。

反证法证明。若N中最小生成树T不包括(u,v),则T中必存在另一条边(u',v'),其中u' \in U,\quad v' \in V-U,且u,u'v,v'间有路径。将(u,v)加入T,则u,u',v,v'构成回路,因为(u,v)权值不大于(u',v'),所以将(u',v')删去,得到新的最小生成树,与T为最小生成树的假设矛盾。

Prim算法

【算法设计与分析】图_第9张图片

时间复杂度为O(n^2),与图的边数无关,适用于稠密网。

Kruskal算法

【算法设计与分析】图_第10张图片

采用合适的数据结构,for循环中合并两个不同分量的执行时间可以证明为O(log_2 e),因此整个for循环的时间为O(elog_2 e),使用与稀疏网。

4.2 最短路径

图结构表示实际的交通网络。一位旅客要从A城到B城,他希望选择一条中转次数最少的路线,只需从顶点A做广度优先搜索,一旦遇到B就停止。

某个源点到其余各顶点的最短路径--Dijkstra算法

【算法设计与分析】图_第11张图片

【算法设计与分析】图_第12张图片

主循环执行n-1次,每次时间为O(n),所以时间复杂度是O(n^2)。以邻接表为数据结构时,在D中选最小分量的时间不变,时间复杂度仍为O(n^2)

每对顶点间的最短路径--Floyd算法

  • 以图中每一顶点为源点调用n次Dijkstra算法
  • Floyd算法

两者的时间复杂度皆为O(n^3)

4.3  拓扑排序

1.AOV-网

一个无环的有向图称作有向无环图(Directed Acycline Graph),简称DAG图。 

DAG与区块链?

用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV-网。在AOV-网中,不应该出现有向环,因为存在环意味这某个活动本身以自己为先决条件。

拓扑排序就是将AOV-网中所有的顶点排成一个线性序列,该序列满足:若在AOV-网有顶点v_i到顶点v_j间有一条路径,则在该线性序列中的顶点v_i在顶点v_j之前。

例如:

【算法设计与分析】图_第13张图片          【算法设计与分析】图_第14张图片

2.判断一个图是否存在环

拓扑排序的过程:

【算法设计与分析】图_第15张图片

算法实现:

【算法设计与分析】图_第16张图片

利用栈先进后出的性质,将入度为0的顶点依次入栈。栈的性质可以使得输出顶点数少于原有顶点数得以实现。

对于有n个顶点,e条边的有向图而言,求各顶点入度的时间复杂度为O(e),建立0入度顶点栈的时间复杂度为O(n),所以总的时间复杂度为O(n+e)

 

 

 

你可能感兴趣的:(算法设计与分析)