《考研408数据结构》第七章(6.1~6.3图的概念、存储方式、深/广度遍历)复习笔记

一、图的定义

【基本概念】

1、【无向图】、【有向图】、【简单图 和 多重图】

【无向图】
【有向图】
【简单图 和 多重图】

2、【子图】、【生成子图】

只要记住:

  • 【子图】含部分顶点、【生成子图】含全部顶点
  • 然后它两可以没有一些边,但绝对不能有【空边(没有顶点可以指向)】

3、【顶点的度】、【路径】

【顶点的度】
【路径】、【回路】、【路径长度】
  • 一点到另一点的【路径】****起码得有边!!!(想象实际生活:你A岛 到 B岛都没修路,哪来的路径?)
    • 无向图,A点到B点只要有边,A,B、B,A都算路径;
    • 而有向图,路径只能和边的方向一样,<A,B>的路径只有A,B
  • 【回路】就是这条路径【开头=结尾】,也就是【起点绕了一圈回到自己】
  • 【路径长度】和【点到点距离】
    • 【路径长度】顾名思义,起点到终点所经过几条边
    • 【距离】就是取两点【最短路径】,【没有路径】就取【无穷
【连通、连通图、连通分量】
  • 【连通、连通图、连通分量】概念全部对应【无向图】
  • 【强连通、强连通图、强连通分量】概念全部对应【有向图】

  • 1、具体【连通】和【强连通】概念
  • 2、【连通图】和【强连通图】概念
    • 注意【连通图最少边】、【非连通图最多边】计算
    • 【强连通图最少边】计算
  • 3、【连通分量】和【强连通分量】
【生成树】、【生成森林】
  • 【生成树】就是【极小连通图】
  • 其实【生成树 的 边数】就和前面学得【连通图的最少边情况】一样
    • 这样的实际意义就可以理解为:一个城乡修建道路图,有这么多种修路方案,每个修路方案都保证只用修最少的路就能让各个地点连通,在这基础上加上权值的话,就可以选出最优方案了
  • 【生成森林】就是【各个连通分量------>变成生成树】
【边的权、网、带权路径长度】
【几种特殊形态的图】
  • 【完全图】
  • 【稀疏图 和 稠密图】
  • 【树 和 有向树】

二、图的存储方式种类

1、邻接矩阵法(最常考)

  • 1、先了解【无向图】和【有向图】怎么用【邻接矩阵】表示(写法)
    • 注意代码可以看一眼就行,以后要练大题的话再专门学一下就行
  • 2、邻接矩阵【查一个顶点的度】
    • 【无向图】:该顶点的1行或1列的非零元素个数;
    • 【有向图】:【入度】是1列的非零元素;【出度】是1行的非零元素
      • 【时间复杂度】:O(n)O(|V|)
  • 3、邻接矩阵的【空间复杂度】:O(n^2)
  • 4、【带权图(网)】的邻接矩阵表示:就是标上了确切数值,而不只是0、1
  • 5、(不常考)还有一种邻接矩阵是【A[i][j]^n】
    • 【n】就是表示这个邻接矩阵里,记录的【值1】表示【这两点的路径是n】
    • 记录的【值0】表示【这两点的路径不是n】或【这两点没有边】

【记忆特点】

  • 邻接矩阵使用的是【顺序存储】(一维数组、二维数组)
  • 空间复杂度高:O(n^2)
    • 而且【空间跟 "边" 没有关系!!!
    • (注意区分:时间复杂度是O(n)
    • 不适合存储【稀疏图】、适合【稠密图】
      • 大量顶点之间没有边,却还要用【0 或 无穷】来存储,占用空间
  • 而且**【增加 / 删除节点】麻烦**!!!需要修改整个矩阵结构

2、邻接表法(次常考)

  • 1、先了解【无向图】和【有向图】怎么用【邻接表】表示(写法)
    • 注意代码可以看一眼就行,以后要练大题的话再专门学一下就行
    • 另外这个图可以结合《计网第4章:路由算法》的迪杰斯特拉算法,一样的表示
  • 2、邻接表的【空间复杂度】:
    • 无向图:O(|V| + 2|E|)
    • 有向图:O(|V| + |E|)
  • 3、邻接表【查一个顶点的度】
    • 【无向图】:遍历该顶点后的【边链表节点】;
    • 【有向图】:
      • 【出度】是遍历该顶点的【边链表节点】
      • 【入度】是遍历整个【顶点链表】,再把每个节点的【边链表节点】都遍历,找有没有【谁的边节点】是【自己】
  • 4、重要!!!
    • 【邻接表】表示形式不唯一!!!边链表的节点顺序不唯一!!!
    • 【邻接矩阵】表示形式唯一 !!!只有一种形式!!!

【记忆特点】

  • 邻接表使用的是【链式存储】(单链表)
  • 空间复杂度低**】****:无向O(|V| + 2|E|)、有向O(|V| + |E|)**
    • 适合存储【稀疏图】
  • 【出度方便】、【入度麻烦】!!!!

3、十字链表法(不常考,时间紧的可以略看一眼)

【记住】:

  • 1、表示的是【有向图】!!!!!!!!!!!!!!
  • 2、它的每个顶点节点后面的单链表,指的是【顶点的出弧表】!!!
    • 可以发现每个顶点后的【弧链表】每个节点的【头】,都是**【此顶点】**
    • 表示的意思:这就是【这个顶点】的【出度的弧】
    • 比如:V1的编号0 ,他出去的弧有<V1, V2>(0 , 1)、<V1 , V3>(0 , 2)
  • 3、每个顶点的第二格指【该顶点的入弧】
    • 只需要把【弧节点表】的节点里,【第二格】是【该顶点】的全连起来就行
    • 比如:图片里我用颜色标注了,同颜色的都连起来了,连这些节点的编号,都是同一顶点

4、邻接多重表法(不常考,时间紧的可以略看一眼)

【记住】:

  • 1、表示的是【无向图】!!!!!!!!!!!!!!
  • 2、它的每个顶点节点后面的单链表,指的是【连了该顶点的边】!!!
    • 可以发现每个顶点后的【边链表】每个节点的【头】,都是**【此顶点】**
    • 表示的意思:这就是连着【这个顶点】的【边】
    • 比如:V1的编号0 ,他出去的弧有<V1 , V2>(0 , 1)、<V1, V4>(0 , 3)
  • 3、剩下所有节点的【空格】,只要前面编号一样,都连起来
    • 比如:图片里我用颜色标注了,同颜色的都连起来了,连这些节点的编号,都是同一顶点

5、总结(各个存储方式对比)

三、图的操作

理解一下就行,黄色部分记住,大题选择题都会用到

四、图的遍历

1、广度搜索优先(BFS)

带入【树的层序遍历】来理解【图的广度优先搜索】

就是:每次都把一个顶点的邻近的点都遍历一遍,再到下一个顶点

  • 1、具体怎么做?核心就三步:(和树层序遍历一样,要借助队列)
  • 2、【空间复杂度】
  • 3、【时间复杂度】
    • 【邻接矩阵】形式存储的【时间复杂度】
    • 【邻接表】形式存储的【时间复杂度】
  • 4、【广度优先生成树】
    • 要记住【邻接矩阵】和【邻接表】两种存储方式的区别,前面讲过的
  • 5、【广度优先生成森林】
    • 简单看一下,理解就行

【总结】

2、深度搜索优先(DFS)

3、图的遍历、图的流通性

类似树的【先根遍历】

未完待续。。。。

相关推荐
qq_433554548 小时前
C++ 单调栈
数据结构·c++·算法
向前阿、8 小时前
数据结构从基础到实战——排序
c语言·开发语言·数据结构·程序人生·算法
Doro再努力8 小时前
数据结构04:链表的概念及实现单链表
c语言·数据结构
biubiubiu07068 小时前
Ubuntu学习笔记
笔记·学习·ubuntu
2401_841495648 小时前
【语音识别】混合高斯模型
人工智能·python·算法·机器学习·语音识别·gmm·混合高斯模型
码上零乱8 小时前
跟着小码学算法Day19:路径总和
java·数据结构·算法
凉、介9 小时前
ARM 总线技术 —— APB
arm开发·笔记·学习
爱奥尼欧9 小时前
【Linux笔记】网络部分——网络层IP协议
linux·网络·笔记
天选之女wow10 小时前
【代码随想录算法训练营——Day53】图论——110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长
算法·深度优先·图论