深搜原理

深搜,顾名思义,是深入其中、直取结果的一种搜索方法。
  如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他绝不后退一步!因此,他的姐姐广搜总是嘲笑他,说他是个一根筋、不撞南墙不回头的家伙。
  深搜很讨厌他姐姐的嘲笑,但又不想跟自己的亲姐姐闹矛盾,于是他决定给姐姐讲述自己旅途中的经历,来改善姐姐对他的看法。他成功了,而且只讲了一次。从那以后他姐姐不仅再没有嘲笑过他,而且连看他的眼神都充满了赞赏。他以为是自己路上的各种英勇征服了姐姐,但他不知道,其实另有原因……
  深搜是这样跟姐姐讲的:关于旅行呢,我并不把目的地的风光放在第一位,而是更注重于沿路的风景,所以我不会去追求最短路,而是把所有能通向终点的路都走一遍。可是我并不知道往哪走能到达目的地,于是我只能每到一个地方,就向当地的人请教各个方向的道路情况。为了避免重复向别人问同一个方向,我就给自己规定1 :先问北,如果有路,那就往北走,到达下一个地方的时候就在执行此规定,如果往北不通,我就再问西,其次是南、东,要是这四个方向都不通或者抵达了终点,那我回到上一个地方,继续探索其他没去过的方向。我还要求自己要记住2 那些帮过他的人,但是那些给我帮倒忙的、让我白费力气的人,要忘记3他们。有了这些规定之后,我就可以大胆的往前走了,既不用担心到不了不目的地,也不用担心重复走以前的路。哈哈哈……

深搜优缺点

  • 优点
    1、能找出所有解决方案
    2、优先搜索一棵子树,然后是另一棵,所以和广搜对比,有着内存需要相对较少的优点
  • 缺点
    1、要多次遍历,搜索所有可能路径,标识做了之后还要取消。
    2、在深度很大的情况下效率不高

深搜模板

void DFS() //N代表目前DFS的深度
{if(找到解) //进行相应的操作{…return;}for(inti=0;i<4;i++) //枚举四个方向{DFS(N+1); //进入下层递归}
}

广搜原理

广搜,顾名思义,是多管齐下、广撒网的一种搜索方法
  如果广搜是一个人,那么她一定很贪心,而且喜新厌旧!她从一点出发去旅游,先把与起点相邻的地方全部游览一遍,然后再把与她刚游览过的景点相邻的景点全都游览一边……一直这样,直至所有的景点都游览一遍。
  广搜属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。类似树的按层遍历,其过程为:首先访问初始点Vi,并将其标记为已访问过,接着访问Vi的所有未被访问过可到达的邻接点Vi1、Vi2…Vit,并均标记为已访问过,然后再按照Vi1、Vi2…Vit 的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依此类推,直到图中所有和初始点Vi有路径相通的顶点都被访问过为止。

广搜优缺点

  • 优点
    1、对于解决最短或最少问题特别有效,而且寻找深度小
    2、每个结点只访问一遍,结点总是以最短路径被访问,所以第二次路径确定不会比第一次短
  • 缺点
    1、内存耗费量大(需要开大量的数组单元用来存储状态)

广搜模板

void BFS()
{   … …//初始化起点入队 while(!q.empty()) //判断队是否为空{   … …//获取队首元素if(... …){… …}//判断是否是终点for(int i=0;i<4;i++)//四个方向{ k.x=p.x+dir[i][0];k.y=p.y+dir[i][1];//向各个方向走一步if(judge())//判断能不能走{… …//各种处理 vis[k.x][k.y]=1; //标记  q.push(k); //入队}}}
}

广搜打印路径:虽然它有多个后继结点,但前驱节点只有一个。所以可以逆向打印路径,即从终点出发找通向起点的路径


  1. 遍历四个方向 ↩︎

  2. 标记,标识已经走过的结点 ↩︎

  3. 取消标记 ↩︎

深搜和广搜的原理及优缺点相关推荐

  1. Go 分布式学习利器(15) -- Go 实现 深搜和广搜

    强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...

  2. 深搜和广搜(初学者)

    搜索入门 最近对搜索有了一点浅显的了解,想跟大家分享分享. 说起来我也是初学者,恰巧有些自己的理解,想起来自己开始学习搜索的情况,真是一把鼻子一把泪啊.所以想把我领悟的过程,看到的一些基础的我觉得好的 ...

  3. [数据结构] 迷宫问题(栈和队列,深搜和广搜)

    代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...

  4. 深搜DFS\广搜BFS 图初步入门

    首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题. 深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断 ...

  5. 搜索算法-深搜与广搜

    1.深搜与回溯法 *本文主要是供自己复习,或者做笔记总结使用,专业性有待考量,如果遇到不对的地方还请指出来. 什么是回溯法?枚举每一个填空的选项,然后判断这个选项是否合法.如果合法则继续填写下一个选项 ...

  6. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  7. 深搜+回溯+广搜小结

    深搜 按照一定的顺序和规则,一直往深处走,直到走不通再返回,换一种路径重复上述步骤. 深搜一般可以找到问题的所有答案,但问题规模较大时,解集树的深度就会比较大并且比较宽,时间复杂度就会较高.与广搜相比 ...

  8. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  9. 深搜及广搜的实际应用

    这一周通过对搜索题目的大量练习,对于搜索也是有了一定的理解,首先对于深搜来说,有几种题型: 一.有一部分题目指示的很明确,也是基本的深搜类型,比如连通块类型,是显式的深搜 P1596 [USACO10 ...

最新文章

  1. DataFrame的copy的用法
  2. PHP实现定时任务的几种方法
  3. Azure Redis 系列之 Azure Redis 虚拟网络部署
  4. 深入理解JVM—性能调优
  5. pixhawk软件架构
  6. 选择排序、插入排序、冒泡排序、希尔排序算法的总结 - 复杂度、实现和稳定性
  7. lavarel php区别,laravel中{{}}和{!! !!}的区别详解
  8. sublime3运行python_sublime中按ctrl+B调用python3运行
  9. python3----练习题(弹幕跟随)
  10. 2021“数维杯”国际大学生数学建模竞赛B题思路
  11. oracle添加两个约束,Oracle添加表约束的2种方法
  12. java移库数据同步,洗车管理系统会员管理+门店店务同步管理
  13. Linux中LANG,LC_ALL,local详解
  14. 初次尝试CE修改器修改小游戏
  15. 计算机字体管理软件,字体管理软件有哪些?字体管理软件推荐
  16. GitHub怎么搜索项目
  17. 18:(基于对抗的学习)Learning a Self-Expressive Network for Subspace Clustering
  18. 【数据挖掘实验】利用朴素贝叶斯方法对百万搜狐新闻文本数据进行分类
  19. c语言自定义创建文件,c语言自定义文件名?
  20. 鸿蒙系统的软件怎么下载,怎么下载鸿蒙系统?

热门文章

  1. python由大到小排序_Python选择从小到大的排序,python
  2. ANOMALY: use of REX.w is meaningless (default operand size is 64)问题处理
  3. PIL:处理图像的好模块
  4. 微信小程序苹果机型底部兼容
  5. 如何参与linux 内核开发
  6. 1051366-32-5,Balixafortide (POL6326),肽类 CXC chemokine receptor 4 (CXCR4) 的拮抗剂
  7. wsappx把电脑卡爆了解决办法
  8. LCD Keypad Shield
  9. paddlepaddle测试安装_学习之路(1)PaddlePaddle的安装
  10. ConcurrentHashMap 是如何保证线程安全的,你知道么?