首页 > 编程语言 >算法进阶课之搜索

算法进阶课之搜索

时间:2024-03-29 22:55:32浏览次数:26  
标签:剪枝 进阶 dfs st bfs 算法 搜索 冗余

在y总的算法进阶课里,主要讲了BFS和DFS
虽然y总将二者又细分成了很多类别(bfs下面有flood fill、最短路模型、最小步数模型……)但个人感觉bfs没有必要分这么多种

以下是一些总结:
1、bfs vs dfs:前者可以用来求最短(保证第一次搜到的是最短的)但是需要用很多的空间,而且代码相对复杂一些;而后者有可能存在“爆栈”的风险(函数递归调用的形式本质上就是栈的操作)
因此 dfs更常用 而一些有最短性质的题目则可以考虑bfs

&个人理解:因为搜索算法必须要存储状态 dfs的话要么放在函数的参数里、要么放在全局变量里 而bfs必须放在queue里面(?)感觉很不灵活 e.g.小猫爬山那道题我是怎么也想不出来怎么用bfs来做(可能我tcl)
反正就是觉得bfs一般用在有明显“图”结构的题目中(或者是数字华容道这种方便表示状态的题目) 而dfs就灵活很多!

2、bfs的st数组用法 vs dijkstra算法中的st数组:
st数组的目的是用来优化的 减少冗余情况 bfs中每个点不会第二次入队 因此入队的时候就可以判断&更新st(用st数组阻止冗余情况入队)
而dijkstra并不能保证 他的st数组表示的是该点是否已确定最小值 因此出队更新&判断

3、dfs之剪枝!
这是一个很神奇的方法……
根据y总的讲法,有4种剪枝:
(一)优化搜索顺序(优先枚举子节点少的情况!)
(二)排除等效冗余
(三)可行性剪枝(如果预知不可行那就return)
(四)最优性剪枝(如果预知非最优那就return && 如果最好的方案已经得到了 那就可以不用继续dfs下去了)

看起来好像很复杂 实际上我感觉就是
1、在设计方案的时候就要尽量少走弯路(搜索顺序烂/搜索方案差会增加很多不必要的时间,等效冗余也是)
2、尽可能快速地知道这条路能不能走下去
3、在失败之后得到尽可能多的信息(比如“木棒”那一题 如果小木棍放在首位的时候不行 那这个分支整个就不行)

4、双向搜索!
如果我们知道初状态和末状态分别是啥 那么就可以双向搜 可以减去很多状态空间!(尤其适用于有步数限制的题目)

5、dfs之迭代加深
和4差不多 都是减少状态空间的方法 这个方法适用于答案比较浅但是有些烂分支比较深的情况(而且这个方法可以搜出最小值hh)

标签:剪枝,进阶,dfs,st,bfs,算法,搜索,冗余
From: https://www.cnblogs.com/BladeWaltz/p/18104791

相关文章

  • 多边形边界扩大算法 基于MATLAB
    首先,通过定义多边形的顶点坐标(在paths、paths1和paths2变量中)和外延大小(extra和extra2变量),确定多边形的形状和外延量。对于每个多边形:使用迭代的方式遍历多边形的每个顶点。对于每个顶点,计算与相邻边的单位向量,并根据指定的外延大小计算扩展向量的长度。使用单位向量和......
  • 一文带你搞懂匈牙利算法
    一文带你搞懂匈牙利算法附赠自动驾驶学习资料和量产经验:链接什么是匈牙利算法最近在研究一个比较有意思的应用—车辆追踪算法。传统的车辆追踪算法是基于检测器检出车辆,之后使用卡尔曼滤波和匈牙利算法来进行位置预测与数据级联的。关于卡尔曼滤波,我之前已经写过一篇文章进行......
  • 数学建模智能算法
    模拟退火算法%生成初始解,求目标函数f(x)=x1^2+x2^2+8在x1^2-x2>0;-x1-x2^2+2=0约束下的最小值问题sol_new2=1;%(1)解空间(初始解)sol_new1=2-sol_new2^2;sol_current1=sol_new1;sol_best1=sol_new1;sol_current2=sol_new2;sol_best2=sol_new2;E_c......
  • 遗传算法(matlab)
    %求下列函数的最大值%%f(x)=10*sin(5x)+7*cos(4x)x∈[0,10]%%将x的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。%%将变量域[0,10]离散化为二值域[0,1023],x=0+10*b/1023,其中b是[0,1023]中的一个......
  • 代码随想录算法训练营第6天 | 哈希表
    哈希表理论基础用法:一般哈希表都是用来快速判断一个元素是否出现集合里,哈希法牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找eg:例如要查询一个名字是否在这所学校里,要枚举的话时间复杂度是O(n),但如果使用哈希表的话,只需要O(1)就可......
  • 硬件算法协同优化-嵌入式深度学习3
    嵌入式深度学习-硬件与算法协同优化本系列博客主要以BertMoons《EmbeddedDeepLearning》翻译而成GoetschalckxK,MoonsB,LauwereinsS,AndraudM,VerhelstM(2018)Optimizedhierarchicalcascadedprocessing.IEEEJEmergingSelTopCircuitsSyst.https://doi.o......
  • 代码随想录算法训练营第六十天 | 84.柱状图中最大的矩形
      84.柱状图中最大的矩形 已解答困难 相关标签相关企业 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1:输入:heights=[2,1,5,6,2,3]输出:10......
  • 机器人姿态估计-IMU、互补滤波算法应用+C代码实现
    机器人姿态估计-IMU、互补滤波算法应用附赠自动驾驶学习资料和量产经验:链接机器人的姿态测量对于许多应用至关重要,如导航、运动控制等。在这篇文章中,我们将介绍如何利用MPU6050传感器以及互补滤波和卡尔曼滤波算法来实现自平衡车的姿态测量。我们将从原理出发,逐步介绍互补滤波......
  • 代码随想录算法训练营第二十四天(回溯1)|77. 组合(JAVA)
    文章目录回溯理论基础概念类型回溯模板77.组合解题思路源码回溯理论基础概念回溯是递归的副产品,本质上是一种穷举回溯解决的问题可以抽象为一种树形结构类型回溯主要用来解决以下问题组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定......
  • 代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为
    文章目录669.修剪二叉搜索树解题思路源码108.将有序数组转换为二叉搜索树解题思路源码538.把二叉搜索树转换为累加树解题思路源码669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值......