数据结构与算法中的图

数据结构与算法中的图

图的定义与术语

线性结构之间,数据元素之间满足唯一的线性关系。每个数据元素(除第一个和最后一个外)只有一个****直接前趋和直接后继**
在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素,(parenet node)及下一层中的多个元素(孩子节点)相关
(线性结构、树形结构、图形结构)
在图形结构中,节点之间的关系是任意的,图中的任意两个数据元素之间都有可能相关。因此说,图是一种复杂的非线性结构。

图用 G = ( V , E ) G = (V,E) G=(V,E)表示,其中:

  • V V V是顶点(vertex)的集合。
  • E E E是边(edge)的集合。
    根据图中的边是否有方向,可以分为有向图和无向图

无向图

对于一个图,若每条边都是没有方向的。则称该图为无向图
数据结构与算法中的图_第1张图片

有向图

对于一个图,若每条边都是有方向的,则称该图为有向图
数据结构与算法中的图_第2张图片

完全图

任意两个节点都有一条边相相连

稀疏图

很少边或弧的图,其指标为稀疏因子,若稀疏因子小于0.05,可认为是稀疏图。

密集图

有较多边或弧的图。

顶点的度

对于无向图,顶点的度表示以该顶点作为一个端点边的数目,比如上面的无向图,中顶点 V 3 V_3 V3的度 D ( V 3 ) = 3 D(V_3) = 3 D(V3)=3
对于有向图,顶点的度分为入度和出度。某一顶点的度等于其入读和出度之和

入度

入度表示以该顶点为终点的入边的数目

出度

出度以该顶点为起点的出边的数目

子图

在这里插入图片描述
数据结构与算法中的图_第3张图片

路径

数据结构与算法中的图_第4张图片
在这里插入图片描述
换句话说,路径都是从图上的一点出发,到图上另一点的方法
从图上的一点出发,到图上另一点的方法可能不止一个,即可能有多个路径。

回路

回路也称为环,简单来说,回路是指一条路径的终点和起点为同一个顶点。
数据结构与算法中的图_第5张图片
无向图中,如果两个节点之间有平行边,容易让人误看作环

网络

带权重的连通图称为网
数据结构与算法中的图_第6张图片

图的存储结构

相邻矩阵

图的相邻矩阵,或邻接矩阵,表示顶点之间的邻接关系。即有没有边。

有向图的相邻矩阵

数据结构与算法中的图_第7张图片

无向图的相邻矩阵

数据结构与算法中的图_第8张图片

邻接表

对于稀疏图,可以采用邻接表存储法。

  • 边较少,相邻矩阵就会出现大量的零元素
  • 相邻矩阵的零元素就会耗费大量的存储空间和时间。

顶点和边的信息如下:
数据结构与算法中的图_第9张图片

无向图的邻接表示

无向图同一条边,在邻接表中出现两次
数据结构与算法中的图_第10张图片
上面的图用邻接表可以表示:
数据结构与算法中的图_第11张图片

带权图的邻接表表示

数据结构与算法中的图_第12张图片
数据结构与算法中的图_第13张图片

有向图的邻接表(出边表)

数据结构与算法中的图_第14张图片
数据结构与算法中的图_第15张图片

有向图逆邻接表(入边表)

数据结构与算法中的图_第16张图片
数据结构与算法中的图_第17张图片

十字链表

十字链表可以看作是邻接表和逆邻接表的结合
对应于有向图的每一条弧有一个条目:共有5个域:

  • 头 : headvex
  • 尾:tailvex
  • 下一条共尾弧:tailnextarc
  • 下一条共弧: headnextarc
  • 弧权值等info域。

顶点表目有3个域组成:

  • data 域
  • firstinarc 第一条以该顶点为终点的弧
  • firstoutarc 第一条以该顶点为始点的弧
    数据结构与算法中的图_第18张图片
    十字链表有两组链表组成:
  • 行和列的指针序列
    每个结点都包含两个指针:
  • 同一行的后继
  • 同一列的后继
    数据结构与算法中的图_第19张图片

图的遍历

图的遍历是给出一个图 G G G和其中的任意一个顶点 V 0 V0 V0,从 V 0 V0 V0出发系统的访问 G G G中的所有的顶点,每个顶点访问而且只访问一次。

从一个顶点出发,试探性的访问其余顶点,同时必须考虑到下列情况:

  • 从一个顶点出发,可能不能到达所有其他的顶点,如非连通图。
  • 也有可能会陷入死循环,如存在回路的图
    一般情况下,可以为每个顶点保留一个标志位:
  • 算法开始时,所有顶点的标志位置零。
  • 在遍历过程中,当某个顶点被访问时候,其标志位就会被标记为已访问。

深度优先遍历

深度优先搜索(简称DFS) 类似于树的先根次序遍历,尽可能先对纵深方向进行搜索:

** 选取一个未访问的点 v 0 v0 v0 作为源点

  • 访问顶点$ v0$
  • 递归地深搜遍历 $v0 $邻接到的其他顶点
  • 重复上述过程直至从 $v0 $有路径可达的顶点都已被访问过
  • 再选取其他未访问顶点作为源点做深搜,直到图的所有顶点都被访问过

数据结构与算法中的图_第20张图片
深度优先遍历的顺序是:
数据结构与算法中的图_第21张图片

广度优先遍历

*** 广度优先搜搜**,其遍历过程是:

  • 从图中的某个顶点 v0 出发
  • 访问并标记了顶点 v0 之后
  • 一层层横向搜索 v0 的所有邻接点
  • 对这些邻接点一层层横向搜索,直至所有由 v0 有路径可达的顶点都已被访问过
  • 再选取其他未访问顶点作为源点做广搜,直到所有点都被访问过
    数据结构与算法中的图_第22张图片
    广度优先搜索的顺序是:
    数据结构与算法中的图_第23张图片

最短路径

单源最短路径

在这里插入图片描述

迪杰斯特拉算法

数据结构与算法中的图_第24张图片
数据结构与算法中的图_第25张图片
数据结构与算法中的图_第26张图片
数据结构与算法中的图_第27张图片
数据结构与算法中的图_第28张图片
数据结构与算法中的图_第29张图片
算法单源最短路径迭代过程:
数据结构与算法中的图_第30张图片
该算法是贪心法, 不适用于负权值的情况,因为权直当做最小取进来后,不会返回去重新计算,即使不存在负的回路,也可能有在后面出现的负权值,从而导致整体计算错误。

每对结点间的最短路径

Floyd算法对每对结点之间的最短路径。
用邻接矩阵adj来表示带权有向 图

基本思想

数据结构与算法中的图_第31张图片

最小生成树

G G G的生成树是一颗包含所有顶点的树,树上的所有权值总和表示代价,那么在 G G G的所有的生成树中,代价最小的生成树,称为 G G G的最小生成树。

数据结构与算法中的图_第32张图片

总结

不用太在意,慢慢的总结完整后,开始研究图结构及其存储,全部将其搞定都行啦的样子与打算。
不用太在意,其他的学习,要学会用可以用计算机自动计算出来‘
先助攻研读论文在说其他的样子域打算。

你可能感兴趣的:(零样本概览前部分,算法,数据结构)