数据结构——6.3 图的遍历

6.3 图的遍历

一、概念

  1. 图的广度优先遍历

    1. 树的广度优先遍历(层序遍历):不存在"回路",搜索相邻的结点时,不可能搜到已经访问过的结点:

      1. 若树非空,则根节点入队

      2. 若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队

      3. 重复②直到队列为空

    2. 图的广度优先遍历(Breadth-First-Search,BFS):搜索相邻的顶点时,有可能搜到已经访问过的顶点

      1. 找到与一个顶点相邻的所有顶点

      2. 标记哪些顶点被访问过

      3. 需要一个辅助队列

    3. 上述图的广度优先遍历的缺陷:只能遍历连通图,非连通图无法遍历

    4. 改进的BFS算法:

      1. 遍历visited数组,如果该顶点未被访问,则调用BFS

      2. BFS执行完成,回到①,直到所有顶点都被访问过

      3. 结论:对于无向图,调用BFS函数的次数=连通分量数

      4. 空间复杂度:最坏情况,辅助队列大小为 o(V)

    5. 广度优先遍历时间复杂度来源:找点、找边

    6. 邻接矩阵存储的图:

      1. 访问 V个顶点需要O(V)的时间

      2. 查找每个顶点的邻接点都需要O(V)的时间,而总共有V个顶点

      3. 时间复杂度=O(V²)

    7. 邻接表存储的图:

      1. 访问V个顶点需要O(V)的时间

      2. 查找各个顶点的邻接点共需要O(E)的时间

      3. 时间复杂度= O(V+E)

    8. 广度优先生成树

      1. 广度优先生成树由广度优先遍历过程确定。由于邻接表的表示方式不唯一,因此基于邻接表的广度优先生成树也不唯一。
    9. 广度优先生成森林

      1. 对非连通图的广度优先遍历,可得到广度优先生成森林
  2. 图的深度优先遍历DFS

    1. 树的深度优先遍历------其一:树的先根遍历:不存在重复访问问题

    2. 图的深度优先遍历:存在重复访问问题------设置标记数组:栈

    3. 上述DFS存在的问题:无法遍历非连通图

    4. 改进:与BFS改进相似

    5. 复杂度分析

      1. 空间复杂度:来自函数调用栈,最坏情况,递归深度为O(V)

      2. 时间复杂度=访问各结点所需时间+探索各条边所需时间

    6. 邻接矩阵存:时间复杂度:O(V²)

    7. 邻接表存:时间复杂度O(V+E)

    8. 深度优先遍历序列唯一性与生成树个数

      1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一,深度优先生成树也唯一

      2. 同一个图邻接表表示方式不唯一,因此深度优先遍历序列不唯一,深度优先生成树也不唯一

  3. 图的遍历与图的连通性

    1. 对无向图进行BFS/DFS遍历

      1. 调用BFS/DFS函数的次数=连通分量数

      2. 对于连通图,只需调用1次 BFS/DFS

    2. 对有向图进行BFS/DFS遍历

      1. 调用BFS/DFS函数的次数要具体问题具体分析

      2. 若起始顶点到其他各顶点都有路径,则只需调用1次BFS/DFS 函数

      3. 对于强连通图,从任一结点出发都只需调用1次 BFS/DFS

二、理解

  1. 当各边的权值相等时,广度优先算法可以解决单源最短路径问题

  2. 图的广度优先遍历相当于树的层次遍历

  3. 广度优先遍历需要用到队列

  4. 深度优先遍历需要用到栈

  5. 图的深度优先遍历相当于树的先根遍历,广度优先相当于树的层次遍历

  6. 深度优先遍历可以判断图中是否存在环

  7. 使用DFS递归遍历无环有向图,在退出时递归输出相应的顶点,得到逆拓扑有序顶点序列

三、技巧

  1. n个顶点,e条边的图采用邻接表存储,

    1. BFS遍历时

      1. 时间复杂度:O(n+e):顶点表每个点和边表每个边都要遍历一次

      2. 空间复杂度:O(n):每个点都入一次队

    2. DFS遍历时

      1. 时间复杂度:O(n+e):顶点表每个点和边表每个边都要遍历一次

      2. 空间复杂度:O(n):每个点都入一次队

  2. 画图的深度优先生成树、广度优先生成树:

    1. 先根据题目信息把图画出来

    2. 根据深度优先路径或广度优先路径,把不在路径上的边删去,即为生成树

相关推荐
AndrewHZ9 小时前
【复杂网络分析】如何入门Louvain算法?
python·算法·复杂网络·社区发现·community det·louvain算法·图挖掘
AndrewHZ9 小时前
【图像处理基石】如何基于黑白图片恢复出色彩?
图像处理·深度学习·算法·计算机视觉·cv·色彩恢复·deoldify
POLITE39 小时前
Leetcode 3.无重复字符的最长子串 JavaScript (Day 4)
javascript·算法·leetcode
Xの哲學9 小时前
Linux IPC机制深度剖析:从设计哲学到内核实现
linux·服务器·网络·算法·边缘计算
sin_hielo9 小时前
leetcode 756(枚举可填字母)
算法·leetcode
Jeremy爱编码9 小时前
leetcode热题子集
算法·leetcode·职场和发展
点云SLAM9 小时前
boost中graph_traits和adjacency_list 的内存布局以及最小图示例
数据结构·数据库·图论·boost库·最小图·链接矩阵·graph_traints技术
csg11079 小时前
LORA网络的“最后一公里”难题:当信号被重重阻挡,我们有哪些“方法”来增强覆盖?
单片机·嵌入式硬件·物联网·算法
brave and determined9 小时前
传感器学习(day18):智能手机3D结构光:解锁未来的第三只眼
嵌入式硬件·算法·3d·智能手机·tof·嵌入式设计·3d结构光
CoovallyAIHub9 小时前
当小龙虾算法遇上YOLO:如何提升太阳能电池缺陷检测精度?
深度学习·算法·计算机视觉