热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

图的遍历(深度优先搜索和广度优先搜索)

图的遍历-----深度优先搜索和广度优先搜索一、图的遍历与树的遍历操作类同,图的遍历操作的定义是,访问途中的每个顶点且每个顶点之北访问一次。图的遍历

图的遍历----->深度优先搜索和广度优先搜索

一、图的遍历
与树的遍历操作类同,图的遍历操作的定义是,访问途中的每个顶点且每个顶点之北访问一次。图的遍历方法有两种:一种是深度优先遍历,另一种是广度优先遍历。图的深度优先遍历类似于树的先根遍历,图的广度优先遍历类同于树的层序遍历。
图的遍历需要考虑的三个问题:
(1)图的特点是没有首尾之分,所以算法的参数要指定访问的第一个顶点。
(2)因为对图的遍历路径有可能构成一个回路,从而造成死循环,所以算法设计要考虑遍历路径可能出现的死循环问题。
(3)一个顶点可能和若干个顶点都是邻接顶点,要使一个顶点的所有邻接顶点按照某种次序都被访问到。
二、连通图的深度优先遍历算法。
图的深度优先遍历算法是遍历时深度优先的算法,即在图的所有邻接顶点中,每次都在访问完当前节点后,首先访问当前顶点的第一个邻接顶点。
深度优先遍历算法可以设计成递归算法。对于连通图,从初始顶点出发一定存在路径和连通图中其它顶带相连,所以对于连通图来说,从初始顶点出发一定可以遍历该图。连通图的深度优先遍历递归算法如下。
(1)访问顶点v并标记顶点v已被访问。
(2)查找顶点v的第一个邻接顶点w.
(3)若顶点v的邻接顶点w存在,则继续执行,否则算法结束。
(4)若顶点w尚未被访问,则深度优先遍历递归访问顶点w.
(5)查找顶点v的w邻接顶点的下一个邻接顶点w,转到步骤(3).

上述递归算法属于回溯算法,当寻找顶点v的邻接顶点w成功时,继续进行;当寻找顶点v的邻接顶点w失败时,回溯到上一次递归调用的地方继续进行。
对于下图:
深度

我们假设上图的A为初始顶点,根据算法的描述
1、从A出发,访问A的邻接顶点,B、E都可被访问到,但本题中,ABCDE是按照顺序存储,所以,先访问B。
2、标记点B,找到B得下一个邻接点D.
3、标记顶点D,找到D点的下一个邻接点C.
4、标记顶点C,从c出发找到C的下一个邻接点B,因为B点已经被访问过,则回退到顶点D.
5.找D的下一个临界点C,C已经被访问过,回退到B。
6 B的下一个邻接点D已被访问过,回退到A.
7、从A出发,找到临界点E,标记E点
8、E没有临界点,算法结束。
深度优先搜索的顶点访问顺序:A->B->D->C->E
三、广度优先遍历
图的广度优先遍历算法是一个分层搜索的过程。广度优先遍历是指,从指定顶点开始,按照到该顶点路径长度有短到长的顺序,依次访问图中的其余顶点。图的广度优先遍历算法也需要一个队列来保存访问过的顶点的顺序,以便按顺序访问这些顶点的邻接顶点。算法如下:
(1)访问初始顶点v并标记顶点v为已访问。
(2)顶点v入队列。
(3)若队列非空,则继续执行,否则算法结束
(4)出队列取得对头顶点u
(5)查找顶点u的第一个邻接顶点w
(6)若顶点u的邻接顶点w不存在,则转到步骤(3),否则循环执行。
(a)若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问。
(b)顶点w入队列
©查找顶点u的w邻接邻接顶点后的下一个邻接顶点w,转到步骤(6).

广度
对上图进行广度优先遍历
将A加入队列,取出A,标记为已访问,将其临界点B、E入队列,【B、E】
取出B,标记B已被访问,将其未访问过的邻接点加入队列,【E、D】
取出E,标记E已被访问,E没有临界点,此时队列非空继续执行【D】
取出D,标记D已被访问,将其未访问过的临界点C加入队列【C】
取出C,标记C已被访问,由于此时C的邻接点B已被访问过,且队列为空,算法结束。
则广度优先搜索的顶点访问顺序:A->B->E->D->C

这次只是跟着算法描述验证了下,代码晚点发出来,这几天有点忙。


推荐阅读
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 拼多多的崛起之路
    随着4G通信技术的发展,互联网产品从PC端转向移动端,图像传输速度更快、更清晰,智能设备的应用提升了用户体验。移动互联网的普及为拼多多的崛起提供了时代背景。 ... [详细]
  • 结城浩(1963年7月出生),日本资深程序员和技术作家,居住在东京武藏野市。他开发了著名的YukiWiki软件,并在杂志上发表了大量程序入门文章和技术翻译作品。结城浩著有30多本关于编程和数学的书籍,其中许多被翻译成英文和韩文。 ... [详细]
  • 基于二次预测的H.264分数像素运动估计算法在这项研究中,提出了一种基于二次预测的H.264分数像素运动估计(ME)算法。这里ÿ ... [详细]
  • 本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ... [详细]
  • 本文介绍了家用计算机和计算器的基本功能和使用方法,通过具体的例子展示了如何利用计算器进行高效的数学计算。文章还探讨了计算工具的发展历史及其未来趋势。 ... [详细]
  • 深入解析国内AEB应用:摄像头和毫米波雷达融合技术的现状与前景
    本文作者程建伟,武汉极目智能技术有限公司CEO,入选武汉市“光谷3551人才计划”。文章详细探讨了国内自动紧急制动(AEB)系统中摄像头与毫米波雷达融合技术的现状及未来前景。通过分析当前技术的应用情况、存在的挑战以及潜在的解决方案,作者指出,随着传感器技术的不断进步和算法优化,AEB系统的性能将大幅提升,为交通安全带来显著改善。 ... [详细]
  • 搜索引擎技术概论(上篇):核心原理与应用分析
    搜索引擎技术概论(上篇)探讨了搜索的基本概念及其核心原理。搜索的本质在于信息检索,即用户通过输入关键词,利用特定的算法从海量数据中快速定位并提供所需信息。本文详细分析了搜索引擎的工作机制及其在实际应用中的表现。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 在《数字图像处理及应用(MATLAB)第4章》中,详细探讨了“逢七必过”游戏规则的实现方法,并结合数字图像处理技术进行了深入分析。本章通过丰富的实例和代码示例,展示了如何利用MATLAB实现这一游戏规则,并介绍了数字图像处理的基本原理和技术应用。内容涵盖了图像增强、滤波、边缘检测等多个方面,为读者提供了全面的技术支持和实践指导。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
journeylis-1998_246
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有