首页 > 编程语言 >算法学习--广度优先搜索和深度优先搜索

算法学习--广度优先搜索和深度优先搜索

时间:2022-08-25 19:36:51浏览次数:62  
标签:优先 数组 -- 结点 访问 算法 搜索 邻接 顶点

广度优先搜索BFS

一、相关概念

1.图的遍历: 从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有节点访问一次且仅访问一次

二、算法流程

  • 首先访问起始顶点 v ;
  • 接着由出发依次访问 v 的各个未被访问过的邻接顶点 \(w_1,w_2,...,w_i\) ;
  • 然后以此访问 \(w_1,w_2,...,w_i\) 的所有未被访问过的邻接顶点;
  • 再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点;
  • ......, 以此类推;

方法:队列 + 辅助标记数组(标记节点是否被访问过)

三、算法实现过程图示

  • 初始化数组和队列,0表示为未被访问过

  • 将结点 1 入队,并修改标记数组中对应的0位置的值为1(表示结点1已经被访问过)

  • 将队首元素 1 出队,并将它的所有未被访问的邻接结点(要求辅助标记为0)入队,并修改相应辅助数组下标的值

  • 依次类推......

四、算法实现

五、算法性能分析

  • 空间复杂度: \(O(|V|)\) , 即顶点的数量大小(队列和辅助数组用到的空间大小都是顶点的数量大小)
  • 时间复杂度:取决于找邻接顶点的方法

邻接矩阵法的DFS(BFS)序列唯一,邻接表法的不唯一

深度优先搜索DFS

一、算法流程

  • 首先访问起始顶点 v ;
  • 接着由 v 出发访问 v 的任意一个邻接且未被访问的邻接顶点 \(w_i\);
  • 然后再访问与 \(w_i\) 邻接且未被访问过的任意顶点 \(y_i\);
  • 若 \(w_i\) 没有邻接且未被访问的顶点时,就退回到它的上一层顶点 v ;
  • 重复上诉过程,知道所有的顶点被访问完为止。

方法:栈 + 辅助标记数组

二、算法实现

三、算法性能分析

  • 空间复杂度: \(O(|V|)\) , 即顶点的数量大小(工作栈和辅助数组用到的空间大小都是顶点的数量大小)
  • 时间复杂度: 根据找邻接结点的方式而定

四、如何通过遍历来判断连通性

  • 在无向图当中,在任意结点出发进行一次遍历 (调用一次BFS或者DFS),若能访问全部结点,说明该无向图是连通的;
  • 在无向图中,调用遍历函数(BFS或者DFS) 的次数为连通分量的个数;
  • 针对有向图,上述结论不成立:因为有向图是有方向的,从一个顶点出发不一定能返回来,但是无向图可以。

标签:优先,数组,--,结点,访问,算法,搜索,邻接,顶点
From: https://www.cnblogs.com/lyxLearningNotes/p/16625457.html

相关文章

  • crazy
    Insanity,madness,andcrazinessaretermsthatdescribeaspectrumofindividualandgroupbehaviorsthatarecharacterizedbycertainabnormalmentalorbeha......
  • Hystrix:服务降级
    服务熔断:服务端某个服务超时或者异常,引起熔断,相当于保险丝服务降级:客户端从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,此时在客户端可以......
  • js数组对象的遍历
    //数组循环的方法vararr=[{code:10},{value:100},{name:'大乔'},{age:'18'}];//for----offor(letitemofarr){console.log('for--of',......
  • ElementUI 调整image-viewer滚动时的缩放速度
    FLowUs邀请链接:https://flowus.cn/login?code=AXNU63FlowUs邀请码:AXNU63在node_modules/element-ui中,找打el-image下的image-viewer组件,将其复制出来到项目中,作如......
  • bean实例化三种方式
    实例化bean的方式有三种,如下:1、无参构造方法实例化2、工厂静态方法实例化3、工厂普通方法实例化此处演示的项目结构如下:  方法一:无参构造方法实例化(注意,该类......
  • JSON Schema
    .net项目使用JSONSchema 最近公司要做配置项的改造,要把appsettings.json的内容放到数据库,经过分析还是用json的方式存储最为方便,项目改动性最小,这就牵扯到一个问题......
  • linux系统配置文件或shell脚本批量注释
    1.配置文件批量注释1.1批量注释①进入命令行模式,按ctrl+v进入visualblock模式,键盘上下箭头选中多行,把需要注释的行标记起来②按大写字母I,再输入注释符:#③双......
  • lseek的使用问题
    当使用追加标识符打开一个文件以便读写时:1.能否使用lseek在任意位置开始读2.能否使用lseek更新文件中任一部分的数据1#include<stdio.h>2#include<unistd.h>3#......
  • Cisco Firepower ssl inspection配置
    Step1:生产或导入ssl证书登录FMC在Obeject->PKI->InternalCAs下创建自签名证书,如下图:Step2:下载证书,在终端上部署设置密码,下载证书,如下图:安装证书,选择“当前用户”......
  • idea项目列表名称与项目名称不一致
    天啦噜idea在拷贝项目的时候,改了项目名称,发现项目名称修改了,标题栏还是之前项目的名字; 原因如下:拷贝项目的时候,连同之前项目下的.idea文件也拷贝过来 解决......