热门标签 | 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

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


推荐阅读
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 智能车间调度研究进展
    本文综述了基于强化学习的智能车间调度策略,探讨了车间调度问题在资源有限条件下的优化方法。通过数学规划、智能算法和强化学习等手段,解决了作业车间、流水车间和加工车间中的静态与动态调度挑战。重点讨论了不同场景下的求解方法及其应用前景。 ... [详细]
  • 深入理解Java中的Collection接口与Collections工具类
    本文详细解析了Java中Collection接口和Collections工具类的区别与联系,帮助开发者更好地理解和使用这两个核心组件。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 堆是一种常见的数据结构,广泛应用于计算机科学领域。它通常表示为一棵完全二叉树,并可通过数组实现。堆的主要特性是每个节点的值与其父节点的值之间存在特定的关系,这使得堆在优先队列和排序算法中非常有用。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 探讨如何通过高效的数据库查询和排序策略,优化基于GPS位置信息的附近用户搜索功能,以应对大规模用户数据场景。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
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社区 版权所有