参考来源:http://www.cse.iitd.ac.in/~rjaiswal/2012/csl356/
严蔚敏,李冬梅,吴伟民:数据结构
图是一种比线性表和树更为复杂的数据结构。
图G由两个集合V和E组成,记为,其中V是顶点的有穷集合,E是顶点偶对(边)的有穷集合。
通常代表图G的顶点集合和边集合。若为有向边的集合,则该图为有向图;若为无向边的集合,则该图为无向图。
子图、无向完全图和有向完全图、稠密图与稀疏图、邻接点、度和入度和出度、路径和路径长度、回路或环、连通和连通图和联通分量、强连通图等等。
连通:无向图G中,顶点a到顶点b有路径,则称它们是连通的。
连通图:V中任意两个顶点都是连通的,则G为连通图。
连通分量:无向图中的极大连通子图。
强连通图:有向图G中,V中任意两个顶点都是连通的,则G为强连通图。
六度空间理论、交通运输网络等
时间复杂度也是.
优点:便于判断i j两点间是否有边,根据A[i][j]=0或1判断;便于计算各顶点的度。
缺点:不便于增加或删除顶点;不利于计算边的数目;空间复杂度高。
邻接表是图的一种链式存储结构。邻接表:表头结点表+边表。
表头结点表:以顺序结构存储,便于随机访问任一顶点的边链表。表头结点:数据域+链域。数据域用于存储顶点名称和其他信息,链域用于指向链表中第一个结点。
边表:邻接点域+数据域+链域。
时间复杂度为,空间复杂度为。
优点:便于增加和删除顶点;便于统计边的数目;空间效率高。
缺点:不便于判断两点间是否有边;不便于计算有向图各顶点的度。
十字链表、邻接多重表。
图的遍历算法是求解图的连通性问题、拓扑排序和关键路径等算法的基础。根据路径的搜索路径的方向,通常有:深度优先搜索和广度优先搜索两种遍历图的途径。对无向图、有向图都适用。
DFS遍历类似于树的先序遍历。采用不同数据结构的DFS具体实现:
邻接矩阵表示时查找每个顶点的邻接点的时间复杂度是,n是顶点数;
邻接表表示时查找邻接点的时间复杂度是,e是边数,所以此时用DFS遍历图的时间复杂度为。
DFS
BFS遍历类似于树的按层次遍历。
利用辅助队列进行遍历,每个顶点至多进一次队列(同一层的存在同一队列中)。
应用:
判断是否有环:利用BFS,如果访问到之前访问过的点,则存在环。
是否为二部图:利用BFS进行上色,如果本层与下层存在同色,则不可二划分。
图的几种常见算法。
对于n个顶点的连通网可以生成不同的生成树,每一棵生成树都可以是一个通信网。最合理的通信网应该是代价之和最小的生成树。
构造最小生成树有多种算法,其中多数算法利用了最小生成树的MST性质:
假设是一个连通网,是顶点集中的一个非空子集。若是一条具有最小权值的边,其中,则必存在一棵包含边的最小生成树。
反证法证明。若N中最小生成树T不包括,则T中必存在另一条边,其中,且,间有路径。将加入T,则构成回路,因为权值不大于,所以将删去,得到新的最小生成树,与T为最小生成树的假设矛盾。
Prim算法
时间复杂度为,与图的边数无关,适用于稠密网。
Kruskal算法
采用合适的数据结构,for循环中合并两个不同分量的执行时间可以证明为,因此整个for循环的时间为,使用与稀疏网。
图结构表示实际的交通网络。一位旅客要从A城到B城,他希望选择一条中转次数最少的路线,只需从顶点A做广度优先搜索,一旦遇到B就停止。
某个源点到其余各顶点的最短路径--Dijkstra算法
主循环执行n-1次,每次时间为,所以时间复杂度是。以邻接表为数据结构时,在D中选最小分量的时间不变,时间复杂度仍为。
每对顶点间的最短路径--Floyd算法
两者的时间复杂度皆为。
1.AOV-网
一个无环的有向图称作有向无环图(Directed Acycline Graph),简称DAG图。
DAG与区块链?
用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV-网。在AOV-网中,不应该出现有向环,因为存在环意味这某个活动本身以自己为先决条件。
拓扑排序就是将AOV-网中所有的顶点排成一个线性序列,该序列满足:若在AOV-网有顶点到顶点间有一条路径,则在该线性序列中的顶点在顶点之前。
例如:
2.判断一个图是否存在环
拓扑排序的过程:
算法实现:
利用栈先进后出的性质,将入度为0的顶点依次入栈。栈的性质可以使得输出顶点数少于原有顶点数得以实现。
对于有n个顶点,e条边的有向图而言,求各顶点入度的时间复杂度为,建立0入度顶点栈的时间复杂度为,所以总的时间复杂度为。