数据结构第六章学习小结
(1)图(GRAPH)的定义:是一种非线性数据结构,由有穷、非空的点集V(G)和边集E(G)组成。当G中的每条边有方向时,称G为有向图,有向边(用一对尖括号<a,b>)又称为弧,起始顶点被称为弧尾,终止顶点被称为弧头,每条边无方向时(用一对括号表示(a,b)和(b,a)一样),被称为无向图。
(2)图的存储方式:
邻接矩阵
邻接矩阵表示方法的优缺点:
a.优点
便于判断两个顶点之间是否有边;便于计算各个顶点的度,对于有向图,第i行元素之和就是顶点i的出度,第i列元素之和就是顶点i的入度。
b.缺点
不便于删除和增加顶点;空间复杂度高。
邻接表
邻接表表示法的优缺点:
a.便于增加和删除结点;便于统计边的数目;空间效率高。
b.不便于判断顶点之间是否有边;不便于计算有向图各个顶点的度。
(3)最小生成树:
当使用一个连通网罗来构造生成树时,可以得到一个带权的生成树,把生成树各边的权值总和作为生成树的权,具有最小权值的生成树构成连通网络的最小生成树,构造最小生成树的两种常用算法:Prim算法和Kruskal算法;
最小生成树的MST性质:假设G=(V,G)是一个连通网络,U是V的一个真子集,若存在顶点u属于U和顶点v属于V-U的边(u,v)是一条具有最小权值的边,则必存在G的一颗最小生成树包括这条边(u,v)
(4)图的遍历:
DFS:深度优先搜索:
从图中某一顶点出发,访问后标记visit[i]为1,然后依次搜索第i个结点的领接点j,再依次搜索j结点的每个领接点,直到所有结点都被遍历
BFS:广度优先搜索
先被访问的结点,其领接点也先被访问,具有先进先出的特性,我们使用队列来保存已经访问过的结点,以确定被访问过结点的顶点领接点访问次序。
(5):生成树与最小生成树
树是一个无回路存在的连通图,而一个连通图G的生成树是指:一个包含了G的所有顶点的树。对于一个有n个顶点的连通图G,其生成树包含了n-1条边,从而生成树是G的一个极小连通的子图。使用DFS遍历搜索得到的树为DFS树,使用BFS遍历搜索得到的树为BFS树。
因为搜索算法选取的起始顶点不同,所以一个连通图的生成树不是唯一的,它取决于遍历方法和起始顶点的选择。
对于带权值的连通图,我们可以得到一个带权的生成树,我们将该生成树的各边的权值作为生成树的权,具有最小权值的生成树构成了连通网络的最小生成树
常用的最小生成树的算法有Prim算法和Krusal算法
普里姆算法(加点法)
利用辅助数组closedge记录从U到V - U具有最小权值的边
利用普里姆算法画出最小生成树的一些体会:
①从顶点出发,在顶点与其邻接点中找到权值最小的边,并找出邻接点
②继续找出该邻接点与其邻接点权值最小的边,每次选择最小边的时候,可能存在多条权值相同的边可以选,则任选其一即可
③找到最小边后还要比较上一个邻接点与其下一个邻接点之间是否存在权值更小的边,再继续向下执行
④直到所有的点都被访问且为连通图时结束
克鲁斯卡尔算法(加边法)
利用克鲁斯卡尔算法画出最小生成树的一些体会:
①找出所有边中权值最小的边,若该边依附的顶点落在不同连通分量上,则此边可用,否则舍弃掉
②重复操作1,直到所有顶点都在一个连通分量上