首页 > 其他分享 >广/深度优先搜索与回溯法

广/深度优先搜索与回溯法

时间:2022-11-10 10:35:40浏览次数:35  
标签:优先 遍历 回溯 搜索 深度 节点

深度优先搜索:在搜索到一个新的节点时,立即对该节点进行遍历;因此需用先入后出的栈,也可以通过与栈等价的递归来实现。深度优先搜索也可以用来检测环路:记录每个遍历过的节点的父节点,若一个节点被再次遍 历且父节点不同,则说明有环。我们也可以用之后会讲到的拓扑排序判断是否有环路,若最后存 在入度不为零的点,则说明有环。 有时我们可能会需要对已经搜索过的节点进行标记,以防止在遍历时重复搜索某个节点,这 种做法叫做状态记录或记忆化(memoization)。

 

 栈方法:

 

 递归写法:

 

 2.

 

 

 

 

 

 回溯法:回溯法(backtracking)是优先搜索的一种特殊情况,又称为试探法,常用于需要记录节点状态的深度优先搜索。通常来说,排列、组合、选择类问题使用回溯法比较方便。 顾名思义,回溯法的核心是回溯。在搜索到某一节点的时候,如果我们发现目前的节点(及其子节点)并不是需求目标时,我们回退到原来的节点继续搜索,并且把在目前节点修改的状态还原。这样的好处是我们可以始终只对图的总状态进行修改,而非每次遍历时新建一个图来储存状态。在具体的写法上,它与普通的深度优先搜索一样,都有 [修改当前节点状态]→[递归子节 点] 的步骤,只是多了回溯的步骤,变成了 [修改当前节点状态]→[递归子节点]→[回改当前节点 状态]。如果还是不明白,可以记住两个小诀窍,一是按引用传状态,二是所有的状态修改在递归完成后回改。 回溯法修改一般有两种情况,一种是修改最后一位输出,比如排列组合;一种是修改访问标记,比如矩阵里搜字符串。

全排列问题

 八皇后问题

 

 

 

 

 

 

 

 

 广度优先搜索:广度优先搜索(breadth-first search,BFS)不同与深度优先搜索,它是一层层进行遍历的,因此需要用先入先出的队列而非先入后出的栈进行遍历。由于是按层次进行遍历,广度优先搜索时按照“广”的方向进行遍历的,也常常用来处理最短路径等问题。 考虑如下一颗简单的树。我们从 1 号节点开始遍历,假如遍历顺序是从左子节点到右子节点, 那么按照优先向着“广”的方向前进的策略,队列顶端的元素变化过程为 [1]->[2->3]->[4],其中 方括号代表每一层的元素。这里要注意,深度优先搜索和广度优先搜索都可以处理可达性问题,即从一个节点开始是否能达到另一个节点。因为深度优先搜索可以利用递归快速实现,很多人会习惯使用深度优先搜索刷此类题目。实际软件工程中,笔者很少见到递归的写法,因为一方面难以理解,另一方面可能产生栈溢出的情况;而用栈实现的深度优先搜索和用队列实现的广度优先搜索在写法上并没有太大差异,因此使用哪一种搜索方式需要根据实际的功能需求来判断。

 

 

 

 

 

标签:优先,遍历,回溯,搜索,深度,节点
From: https://www.cnblogs.com/LCAB/p/16874444.html

相关文章

  • PHPcms全站搜索查询模糊查询文章内容
    2022-11-10路径:phpcms/modules/search/index.php(具体内容根据自己详细代码进行针对修改)1<?php2defined('IN_PHPCMS')orexit('Nopermissionresources.')......
  • 【Python爬虫案例】用python爬哔哩哔哩搜索结果
    一、爬取目标大家好,我是@马哥python说,一名10年程序猿。今天分享一期爬虫的案例,用python爬哔哩哔哩的搜索结果,也就是这个页面:爬取字段,包含:页码,视频标题,视频作者,......
  • POJ-1417(带权并查集+01背包+回溯)
    TrueLiars题目描述:Peter有一个王国。在这个王国里,一共有2种人,即诚实人和撒谎人。诚实人永远说真话,撒谎人永远说假话。可惜的是,Peter只记得诚实人的数量和撒谎人的数量......
  • idea plugins搜索不出来
    1、点击File->Setting打开设置,出现如下界面 2、点击右侧设置按钮选择HTTPProxySettings... 3、选中Auto-delectproxysettings然后选中Automaticproxyco......
  • 华为&思科设备默认的路由协议优先级
    华为&思科设备默认的路由协议优先级华为设备默认路由协议优先级在华为的设备中,路由器分别定义了外部优先级和内部优先级。外部优先级是指用户可以手工为各路由协议配......
  • 广度优先搜索(BFS)
    基本原理广度优先搜索在搜索树中又叫按层次遍历。对于搜索树而言,广度优先搜索的思路可以描述为:依次访问根结点的每一个子结点(第二层结点),再通过这些结点访问第三层结点…......
  • BFS广度优先搜索例题分析
    洛谷P1162填涂颜色题目描述由数字\(0\)组成的方阵中,有一任意形状闭合圈,闭合圈由数字\(1\)构成,围圈时只走上下左右\(4\)个方向。现要求把闭合圈内的所有空间都填写......
  • DFS深度优先搜索例题分析
    洛谷P1596LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个\(N\timesM(1\timesN\times100,1\leqM\leq100)\)的网格图......
  • elementUI 搜索条件、table、页脚封装
    一共分成了两个组件:组件一:搜索条件=>SearchParams.vue组件二:el-table和el-pagination=>TablePagintion考虑到业务的使用场景没用做过多的封装。(1)组件一:搜索条件代......
  • 第四十一章 构建数据库应用程序 - 带有CSP Search标签的CSP搜索页面
    第四十一章构建数据库应用程序-带有<CSP:Search>标签的CSP搜索页面search标记创建一个通用搜索页面,可以将其与绑定表单一起使用以执行查找操作。应用程序用户可以从......