谈搜索算法的剪枝优化(转载)

搜索算法总结 一、最基本的搜索算法:回溯算法回溯算法是所有搜索算法中最为基本的一种算法,其采用了一种“走不通就掉头”思想作为其控制结构。 二、搜索算法分类:bfs与dfsdfs:栈的思想(先进后出)优先兄弟节点。容易超时,多用于求可行解。 bfs:队列的思想(先进先出)优先儿子节点。容易消耗大量内存,多用于求最优解。 总结:搜索算法从最终的算法实现上来看,都可以划分成两个部分——控制结构(扩展节点... 阅读详情
Princetonboy @ 2007-08-09 13:56


原文地址:http://princetonboy.ycool.com/post.2805302.html

 

【摘要】本文讨论了搜索算法中 “ 剪枝 ” 这一常见的优化技巧 . 首先由回溯法解决迷宫问题展开论述 , 介绍了什么是剪枝 ; 而后分析剪枝的三个原则正确、准确、高效 , 并分别就剪枝的两种思路 : 可行性剪枝及最优性剪枝 , 结合例题作进一步的阐述 ; 最后对剪枝优化方法进行了一些总结 .
 
【关键字】搜索、优化、剪枝、时间复杂度
 
引 论
在竞赛中 , 我们有时会碰到一些题目 , 它们既不能通过建立数学模型解决 , 又没有现成算法可以套用 , 或者非遍历所有状况才可以得出正确结果 . 这时 , 我们就必须采用搜索算法来解决问题 .
搜索算法按搜索的方式分有两类 , 一类是深度优先搜索 , 一类是广度优先搜索 . 我们知道 , 深度搜索编程简单 , 程序简洁易懂 , 空间需求也比较低 , 但是这种方法的时间复杂度往往是指数级的 , 倘若不加优化 , 其时间效率简直无法忍受 ; 而广度优先搜索虽然时间复杂度比前者低一些 , 但其庞大的空间需求量又往往让人望而却步 .
         所以 , 对程序进行优化 , 就成为搜索算法编程中最关键的一环 .
本文所要讨论的便是搜索算法中优化程序的一种基本方法 “ 剪枝 ”.
 
什么是剪枝
相信刚开始接触搜索算法的人 , 都做过类似迷宫这样的题目吧 . 我们在 “ 走迷宫 ” 的时候 , 一般回溯法思路是这样的 :
1、  这个方向有路可走 , 我没走过
2、  往这个方向前进
3、  是死胡同 , 往回走 , 回到上一个路口
4、  重复第一步 , 直到找着出口
          这样的思路很好理解 , 编程起来也比较容易 . 但是当迷宫的规模很大时 , 回溯法的缺点便暴露无遗 : 搜索耗时极巨 , 无法忍受 .
          我们可不可以在向某个方向前进时 , 先一步判断出这样走会不会走到死胡同里呢 ? 这样一来 , 搜索的时间不就可以减少了吗?
          答案是 : 可以的 .
          剪枝的概念 , 其实就跟走迷宫避开死胡同差不多 . 若我们把搜索的过程看成是对一棵树的遍历 , 那么剪枝顾名思义 , 就是将树中的一些 “ 死胡同 ”, 不能到达我们需要的解的枝条 “ 剪 ” 掉 , 以减少搜索的时间 .
 搜索算法 , 绝大部分需要用到剪枝 . 然而 , 不是所有的枝条都可以剪掉 , 这就需要通过设计出合理的判断方法 , 以决定某一分支的取舍 . 在设计判断方法的时候 , 需要遵循一定的原则 .
 
剪枝的原则
1、  正确性
        正如上文所述 , 枝条不是爱剪就能剪的 . 如果随便剪枝 , 把带有最优解的那一分支也剪掉了的话 , 剪枝也就失去了意义 . 所以 , 剪枝的前提是一定要保证不丢失正确的结果 .
2、  准确性
         在保证了正确性的基础上 , 我们应该根据具体问题具体分析 , 采用合适的判断手段 , 使不包含最优解的枝条尽可能多的被剪去 , 以达到程序 “ 最优化 ” 的目的 . 可以说 , 剪枝的准确性 , 是衡量一个优化算法好坏的标准 .
3、  高效性
         设计优化程序的根本目的 , 是要减少搜索的次数 , 使程序运行的时间减少 . 但为了使搜索次数尽可能的减少 , 我们又必须花工夫设计出一个准确性较高的优化算法 , 而当算法的准确性升高 , 其判断的次数必定增多 , 从而又导致耗时的增多 , 这便引出了矛盾 . 因此 , 如何在优化与效率之间寻找一个平衡点 , 使得程序的时间复杂度尽可能降低 , 同样是非常重要的 . 倘若一个剪枝的判断效果非常好 , 但是它却需要耗费大量的时间来判断、比较 , 结果整个程序运行起来也跟没有优化过的没什么区别 , 这样就太得不偿失了 .
综上所述 , 我们可以把剪枝优化的主要原则归结为六个字 : 正确、准确、高效 .
 
剪枝算法按照其判断思路可大致分成两类 : 可行性剪枝及最优性剪枝 .
下面分别结合例题对这两种方法进行阐述 .
 
可行性剪枝
        这个方向可不可以走 ? 走下去会不会碰到死胡同 ? 这就是对某一枝条进行可行性剪枝的简要判断过程 .
        我们现在来看这样一道题 .
        问题简述 : 一个规则矩形网络状的城市 , 城市中心坐标为( 0,0 ) . 城市包含 M 个无法通行的路障 (M<=50), 采用如下规则游历城市 : 第一步走 1 格 , 第二步走 2 格 , 依此类推 , 第 N 步走 n 格 (N<=20), 除了第一步有四个方向可走 , 其余各步必须在前一步基础上左转或右转 90 度 , 最后回到出发点( 0,0 ) . 对于给定的 N 、 M, 编程求出所有可行的路径 .
        这道题为 ACM 竞赛中 “ 黄金图形 ” 一题的简化 , 曾在 GDKOI98 中出为 “ 数学家旅游 ” 一题 .
        书中的解答采用了简单的回溯法 , 原因是该题的本身就已经有很强的剪枝判断了 . 那么我们先来分析一下用回溯法解题的思路 :
        用 x,y 两个变量存储当前坐标 , 每一步对 x,y 的值进行修改 , 没有遇到障碍就继续走 , 走完 n 步看看有没有回到( 0,0 ) , 没有的话回溯搜索 , 直到找完所有路径 .
         接着 , 我们来看看这种算法的时间复杂度 .
         一共走 n 步 , 每步要搜索四个方向 , 假设在最坏的情况下 , 没有任何障碍物 , 那么它的时间复杂度应该为 :O(4 n ).
很明显 , 这样的算法效率并不会很高 , 所以我们必须对程序进行剪枝 , 在未走完 n 步之前就提早判断出这样的走法是否可行 .
当走到第 o 步时 , 假设当前坐标为( xo,yo ) , 那么离( 0,0 )的最远距离就应该是 Max(xo, yo), 而剩下的 n-o 步可以走的最远距离则是 (o+1)+(o+2)+……+n . 所以 , 若 (o+1)+(o+2)+……+n <Max(xo,yo) 的话 , 就表示就算现在 “ 回头 ” 也没办法到达出发点了 , 也就是说这条分支即便再搜索下去也找不出解来 , 这时我们已经可以舍弃这一分支而回溯了 .
这样剪枝似乎已经不错了 , 但是 , 它的效果只有当数据较大时 , 才能体现得明显 . 除了上述的优化 , 还有没有其他的方法呢 ?
         我们可以这样想 , 这个城市是规则矩形网络状的 , 东、南、西、北四个方向都是对称的 . 打个比方说 , 与( 1,0 )这个点对称的可以有( -1,0 ) , ( 0,1 ) , ( 0,-1 )这三点 . 那可否设想 , 当从一个方向出发 , 寻找到一个解之后 , 将这个解旋转 90 o 、 180 o 、 270 o , 不就得出其余三个解了么 ? 这样岂不是节省了 3/4 的搜索次数 ?
          由这个设想出发 , 我们可以设计出下面的优化 :
         忽略所有的障碍物 , 第一步固定走方向 a (比如东面) , 在这个基础上搜索路径 , 每找到一条路径都将其余三个 “ 对称路径 ” 一起判断 , 看看有没有经过障碍物 , 若没有则该路径为解之一 .
         通过以上分析 , 我们已经可以编出一个效率较高的搜索程序 . 请看下表 :
       “ 黄金图形 ” 的测试情况(单位 : 秒)
N 值
障碍物数
程序运行时间
普通回溯
剪枝一
剪枝二
综合优化
8
2
<0.01
<0.01
<0.01
<0.01
12
4
0.06
0.05
0.06
<0.01
15
0
0.36
0.22
0.11
0.05
16
8
1.54
0.82
0.16
0.11
18
6
5.66
2.85
0.65
0.33
20
0
10.05
5.17
2.58
1.26
21
50
38.56
14.39
5.11
2.42
24
50
210.2
73.11
42.89
20.93
        测试结果分析 :
1.       普通回溯法 , 在处理比较小的数据时 , 耗时还是比较低的 , 但当规模扩大到一定程度时 , 其时间复杂度呈指数级上升 , 因此竞赛时应尽量避免使用单纯的不加优化的回溯法 .
2.       采用第一种剪枝方法 , 当数据较小时与普通回溯法耗时相当 , 数据规模逐渐增大时 , 与回溯法的耗时差距便逐渐拉开 , 因为剪枝得当 , 搜索次数比不加优化时至少减小了一半 .
3.       用对称性来使时间复杂度减少一个指数级 , 从表中可以明显看出优化后的程序与完全不优化的耗时简直不可同日而语 , 与前一剪枝方法比较 , 按照剪枝原则中准确性原则来判断 , 这种方法比前者要好 .
4.       综合两种剪枝方法 , 准确性得到提高 , 耗时非常少 . 为了明显比较出各种算法的优劣 , 我将 N 值提高到 24, 结果综合优化的程序只需 21 秒便出解 , 耗时为普通回溯法十分之一 .
5.       这两种剪枝 , 以及综合的剪枝方法 , 都遵循了正确性的原则 . 它们之间的差异主要是在准确性与高效性两点上 . 可以说 , 最后一种优化算法综合了前两种 , 既提高了准确性 , 又保证了高效性 , 使得两种剪枝优势互补 , 取得了非常优秀的效果 . 竞赛中搜索程序常常使用不只一种的优化方法 , 所要求达到的就是这种效果 .
 
最优性剪枝
最优性剪枝 , 又称为上下界剪枝 . 我们可以回想一下 , 平时在做一些要求最优解的问题时 , 搜索到一个解 , 是不是把这个解保存起来 , 若下次搜索到的解比这个解更优 , 就又把更优解保存起来 ? 其实这个较优解在算法中被称为 “ 下界 ”, 与此类似还有 “ 上界 ”. 在搜索中 , 如果已判断出这一分支的所有子节点都低于下界 , 或者高于上界 , 我们就可以将它剪枝 .
如何估算出上(下)界呢 ? 我们引入一个概念 “ 估价函数 ”. 最优性剪枝算法的核心 , 就在于设计估价函数上 . 估价函数在不同的题目中被赋予不同的意义 , 比如说当前状态与目标状态相差的步数 , 某一数列的长度等等 , 都可作为估价函数的一部分 .
         我们再来看一道题目 :
         问题简述 : 在一个 N*M 的迷宫矩阵中 , 有 X 个不可逾越的障碍物 , 给定 x0, y0, x1, y1, 求出由 (x0, y0) 到 (x1, y1) 之间的所有路径 .
这一道题看起来非常简单 , 也与上一题有不少相似之处 . 难道我们不能用简单的回溯法来解决它吗 ?
我们来分析一下时间复杂度 . 与上题类似 , 我们同样假设在最坏情况下 , 迷宫中没有任何障碍 , 即是一个坦荡荡的矩形 , 从 (0,0) 到 (n,m) 的话 , 每一步有四个方向可以走 , 时间复杂度将达到 O(4 n *4m)! 假设 n=m=20, 那么搜索次数将达到 2 42 次 !
看来这 “ 枝 ” 是非 “ 剪 ” 不可了 .
最初步的剪枝当然就是将走过的方格置为 “ 障碍 ”, 因为若重复通过同一格 , 最终结果必定不是最优解 .
         其次 , 我们可以将每一次搜索出的路径长度与上界比较(初始下界= ∞ ) , 不断降低上界 , 一旦出现路径长超出上界而仍未到达目标点 , 则放弃该搜索进程 . 因为就算继续搜索下去 , 这一条路径也必然比其他路径长 , 不是最优解 .
要完成规模更大的迷宫 , 仅仅这样剪枝是不够的 . 我们还必须采取其他的方法 , 比如先用动态规划求出一个准确的上界 , 再依据此上界进行搜索等 .
 当然 , 对于迷宫这一类题目 , 搜索算法并不是最好的 . 我们完全可以用标号法填满一个二维矩阵 , 再用简单的回溯法进行输出 . 在这里引用这样的一道题 , 目的是想让读者更好的理解最优化剪枝的思路及其应用 , 起到抛砖引玉的作用 .
“ 迷宫问题 ” 的测试情况(单位 :  秒)
N 值
M 值
障碍物数
程序运行时间
普通回溯
普通定界
动态规划 + 定界
4
4
1
<0.01
<0.01
<0.01
6
6
2
4.12
<0.01
<0.01
8
8
0
Very long
4.07
0.11
10
10
0
Very long
Very long
1.70
12
12
10
Very long
Very long
5.77
14
14
60
Very long
8.95
0.06
          结合本题 , 我们可以得出最优化剪枝算法所应该注意的一些问题 :
1 、与可行性剪枝一样 , 最优性剪枝在保证正确性的同时 , 同样需要注意提高准确性和高效性 , 估价函数的计算极为频繁 , 必须尽量提高其运算效率 , 不要 “ 拣了芝麻 , 掉了西瓜 ”, 寻找准确与高效的平衡点 , 确实重要 .
2 、在使用最优化剪枝时 , 一个好的估价函数往往起到 “ 事半功倍 ” 的效果 . 在搜索之前 , 我们可以采用一些高效率的算法 , 如贪心法、动态规划、标号法等等 , 求出一个较优解 , 作为上(下)界 , 将有解的范围缩小 , 以尽可能的剪去多余的枝条 . 如上表中最后一种算法 , 采用动态规划求出上界 , 再进行搜索 , 效率提高了许多 .
此外 , 不但深度优先搜索可以运用最优性剪枝 , 在广度优先搜索中 , 同样可以采用这种剪枝方法 . 比较典型的算法有 : 分支定界法、 A* 算法 , 博弈树等等 . 不过 , 这些方法一般空间复杂度都比深度优先搜索要大得多 , 如何取舍就要依据不同的题目作出相应的判断了 .
 
总 结
在搜索算法中 , 几乎都需要采用程序优化 , 以减少时间复杂度 . 而本文所论述的 “ 剪枝 ” 算法 , 就是最常见的优化方法之一 .
编优化程序的过程中 , 不论运用的是可行性剪枝还是最优性剪枝 , 都离不开剪枝的三个原则棗正确、准确、高效 , 可以说 , 它们就是剪枝算法的 “ 生命 ”.
然而 , 尽管可以采用众多优化算法使得程序的效率有所提高 , 搜索算法本身的时间复杂度不能从本质上减少是不可改变的事实 , 我们在考虑对一道题采用搜索算法之前 , 不妨先仔细想想 , 有没有其他更好的算法 . 毕竟 , 优化程序也是一项 “ 吃力不讨好 ” 的工作 , 与其耗费大量的时间来优化搜索程序 , 倒不如多想 , 多写 , 尽量以非搜索算法解决问题 .
总之 , 我们在竞赛中应当多动动脑筋 , 从不同角度来思考问题 , 采取合适的算法解决问题 .
 
【参考书目】
1 、齐鑫论文《搜索方法中的剪枝优化》
2 、吴文虎主编《 ACM 国际大学生程序设计竞赛试题与解析(一)》
3、吴文虎、王建德编著《使用算法的分析与程序设计》


 

PX4无人机-Gazebo仿真实现动态目标追踪的视觉控制方案 本文详细介绍了PX4无人机在Gazebo仿真环境中实现动态目标追踪的视觉控制方案。从PX4与Gazebo仿真环境搭建、动态目标追踪核心技术栈、仿真环境深度定制技巧到追踪算法的优化实践,提供了全面的技术指导和常见问题排查方法,帮助开发者高效实现无人机视觉追踪功能。 阅读详情

相关推荐

AXI4接口说明

ACLK:全局AXI接口时钟输入(建议与系统时钟保持一致)ARESET_n:全局AXI接口复位信号,低电平有效。PS:在HBM AXI接口应用中,此复位端口仅应在数据传输开始前使用。若在传输开始后使用,会导致AXI接口与内存控制器失步(out-of-sync)。当开关启用时,IP核会将所有ARESET_n引脚内部连接在一起——因为内存作为一个整体工作。

rhtul的博客 1522

ACM搜索算法总结(总结)

搜索是ACM竞赛中的常见算法,本文的主要内容就是分析它的 特点,以及在实际问题中如何合理的选择搜索方法,提高效率。文章的第一部分首先分析了各种基本的搜索及其各自的特点。第二部分在基本搜索方法的基础上提出 一些更高级的搜索,提高搜索的效率。第三部分将搜索和动态规划结合,高效地解决实际问题,体现搜索的广泛应用性。第四部分总结全文。 文章在分析各种搜索的同时,分析了我们在解题中应该怎样合理利用它...

weixin_30650859的博客 489

EXCEL实现分层自定义比例随机抽样(图+文教程)

EXCEL实现分层自定义比例随机抽样(图+文教程) 单一字段分层自定义比例随机抽样 多字段分层自定义比例随机抽样 单一字段分层自定义比例随机抽样 首先数据源如下,我们想随机抽张三的金额数据10%、李四金额20%、王五5%、哈哈15%、李六10% 首先第一步,添加辅助列,随机数 =RAND() 对数据进行高级排序 升序、降序都可以 添加辅助列...

可乐联盟 2万+

决策树剪枝策略实例分析

预剪枝:是在决策树的生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分即结束树的构建并将当前节点标记为叶结点;后剪枝:是先从训练集生成一棵完整的决策树,然后自底向上地对叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化为性能提升,则将该子树替换为叶结点。泛化性能的提升可以使用交叉验证数据来检查修剪的效果,通过使用交叉验证数据,测试扩展节点...

toplatona 8037

无人机航拍实战:如何用Python代码精准计算目标地理坐标(附完整代码)

本文详细介绍了如何利用Python代码实现无人机航拍图像中目标点的精准地理位置计算。通过解析从像素坐标系到WGS84大地坐标系的完整转换链条,结合相机内参、无人机姿态与地球曲率处理,提供了可直接运行的实战代码,并重点分析了地理位置计算中的常见误差来源与应对策略,助力开发者解决实际项目中的定位漂移问题。

hh234的博客 357

别再只盯着DDR5了!聊聊3D DRAM:它凭什么能解决AI算力的内存墙难题?

本文深入探讨了3D DRAM技术如何突破AI算力的内存墙限制。通过立体堆叠架构,3D DRAM在存储密度、带宽和延迟方面实现显著提升,有效解决AI训练和推理中的内存瓶颈问题。文章还分析了三星、SK海力士等巨头的技术路线图,并指出商业化面临的挑战与机遇。

weixin_42685438的博客 189

算法都是套路系列-搜索技术模板(4)

基础算法模板总结与归纳系列——迭代加深、IDA*、搜索剪枝

云澈的博客 330

基于mediapipe的动作捕捉和人物模型的驱动

我实习做这个的时候,当时也找了很多资料,但很多资料都没有讲透,下面我就总结一下自己结合看代码后的感悟,还有一些我认为很重要的点。

qq_58484580的博客 7707

搜索算法——剪枝

剪枝算法 定义: 在进行搜索算法的过程中,将已知无意义的情况排除的行为叫做剪枝 操作方法: 剪枝比较灵活,需要具体问题具体分析 有些是比较明显的,比如题目中的限制条件,有的则是需要分析得到的 剪枝可以分为 (1)可行性剪枝 (2)最优性剪枝 我们从例题分析: 洛谷P1535 最直接的思路: 直接开始深搜,但要注意以下几点: 限制搜索深度时间为t 可以重复经过一个地方 必须在规定的时间到达终点 但是这样会TLE,所以我们需要剪枝 容易发现,从点(x1,y1)到(x2,y2)最少需要abs(x1-x2)+ab

qq_51957239的博客 2100

【STM32项目】老人健康跌倒检测系统实现(附教程PCB资料)

功能概述 跌倒检测 倾倒告警,人体角度倾斜至阈值触发蜂鸣报警 异常运动,加速度超过正常行动阈值时触发报警 心率监测 实时检测心率数据 血氧监测 实时检测采集血氧 血压测量 血压在线测量 红外体温 非接触体温采集方案 接触式体温采集方案 实时定位 中科微GPSGT-U12双频GPS北斗 GLONASS IRNSS定位系统 NEMA数据解析 可扩展高精度定位方案厘米级 屏幕显示 数据采集显示 告警阈值设置 语音提示 1欢迎使用老人智慧监测系统

洋洋的博客 1万+

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1248

深度搜索剪枝——数的划分

【题目描述】将整数n分成k份,且每份不能为空,问有多少种分法? 【输入格式】两个整数n,m(6<n<=200,2<=m<=6) 【输出格式】输出不同的分法数 【样例输入】7 3 【样例输出】4 对于这种搜索题,关键就在于剪枝:确定搜索的顺序、搜索的上下界,剪枝函数等等 这道题数据比较小,之间判断搜索的上下界就可以解决。因为分法是组合,即没有顺序,为了提高效率,我们人为地规定...

T_T233333333的博客 386

华为OD机试新系统真题【终端设备档位差异统计】

华为OD机试 新系统真题【终端设备档位差异统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【终端设备档位差异统计】多语言题解。

qq_45776114的博客 786

搜索(4)dfs的剪枝与优化

简单搜索剪枝

weixin_64197656的博客 1084

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深度优先搜索(DFS) 总结(算法+剪枝+优化总结)

深度优先搜索(DFS) 总结(算法+剪枝+优化总结) 本文中会引用部分实例、文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举。如有侵权请联系我更换或删除!对于提供题解思路的各位大佬和作者:非常感谢! 一、前导 定义上的深度优先搜索的思路与树的先序遍历非常相似,是针对图的搜索而提出的一种算法,下面是算法导论上的解释: 在深度优先搜索中,对于最新发现的顶点,如果它还有以此为顶点而未探测到的边,就沿此边继续探测下去,当顶点v的所有边都已被探寻过后,搜索将回溯到发现顶点v有起始点的那些边

HeartFireY的博客 9万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深搜的剪枝技巧

众所周知,搜索是个好东西,他能在很多时候(就是你不会正解打暴力的时候)派上用场。 然而搜索的时间复杂度实在是太高了,大多数都是指数级别的,这让人很是头疼 那么我来总结一下对搜索进行优化的技巧:剪枝 什么是剪枝 我们知道,搜索的进程可以看做遍历一棵搜索树的过程。而所谓的剪枝,就是通过某种判断,避免一些不必要的遍历过程。 形象的来说,就是剪掉搜索树上的一些枝条来达到减少遍历次数,缩短时间复杂...

weixin_30793643的博客 158

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基础算法(五):DFS、BFS与剪枝

在这篇文章中荔枝主要记录DFS和BFS的相关基础知识、怎么去答题以及自己的一些浅薄理解,同样的也会涉及相关的剪枝操作介绍。希望能帮到正在学习的小伙伴哈哈哈哈哈。

荔枝当大佬的博客 3588

几种常见的搜索算法

目录 广度优先搜索(BFS) 深度优先搜索(DFS) 爬山法(Hill Climbing) 最佳优先算法(Best-first search strategy) 回溯法(Backtracking) 分支限界算法(Branch-and-bound Search Algorithm) A*算法 广度优先搜索(BFS) 这个不用我多说了吧…… 深度优先搜索(DFS) 同上...

Effy's coding way 4万+

剪枝

剪枝算法学习 1)微观方法:从问题本身出发,发现剪枝条件 2)宏观方法:从整体出发,发现剪枝条件。 3)注意提高效率。 上下界剪枝问题。 1、简介 在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应...

weixin_30466039的博客 320

搜索与剪枝

半年前在POJ上遇到过一次剪枝的题目,那时觉得剪枝好神秘。。。今天在网上查了半天资料,终于还是摸索到了一点知识,但是相关资料并不多,在我看来,剪枝是技巧,而不是方法,也就是说,可能一点实用的小技巧,让程序可以少判断一点,这就是剪枝,剪枝无处不在, 搜索的进程可以看作是从树根出发,遍历一棵倒置的树—-搜索树的过程。而所谓的剪枝,顾名思义,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是减...

weixin_30416871的博客 340

转载丶用双链表实现搜索的优化

     搜索是一种基本而又有效的方法,当遇到一个没有很好解决方法的题目时候想到的可能还是搜索。搜索就是把可能的出现的方法依照其搜索标准一一列出,找出需要的解。搜索中为避免无效搜索,常采用剪枝优化,提高搜索效率,如果能在扩展结点处把一些不可能搜索到的结点去掉,利用双链表将可行的解链接起来,避免无效的循环,则可以大大的提高搜索的效率。 下面以USACO1.4跳棋的挑战为例,来讲解一下如何使用循环链表来实现搜索的优化。 [题目描述] 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋

1410

Minimax算法及其剪枝优化Alpha-beta

转载自http://blog.codinglabs.org/articles/2048-ai-analysis.html!!!!! 我只截取了算法的部分,没把应用的内容截取下来。真的写的很棒,对于算法的学习一目了然。以下是主要内容: Minimax    下面先介绍不带剪枝的Minimax。首先本文将通过一个简单的例子说明Minimax算法的思路和决策方式。 问题

咸鱼的小站 8192

优雅的暴力——搜索算法小结

优雅的暴力 主要想总结一下搜索神奇的优化办法。 第一梯队:\(meet\) \(in\) \(the\) \(middle\) 双搜 对于一些问题,从终点到起点和从起点到终点都是可逆的话,考虑meet in the middle。 可以将\(2^n​\)搜索化为\(2^{\frac{n}{2}}​\) 就可以接受了。 对于一些求方案数的问题,可以从起点搜到中间,再用数据结构存起来,再从终点搜到起点...

weixin_30828379的博客 236

【算法•日更•第四期】深度优先搜索中的剪枝优化(一)

▎前置技能:搜索   既然要学深搜的剪枝优化技巧,那么就先得会深搜了吧,不会的同志戳这里。 ▎前言   请想象一下,如果将搜索算法的流程图像化,那么,你会先想到什么呢?   最贴近的当然是树啦,搜索的流程正是不断试探,如果不行就回溯,就像树一样在每一个节点上试探,到了叶子结点就返回,直到找到正确答案/最优解。如图所示:      可是,这么多的枝条,正确解可只有一条。     ...

weixin_30699443的博客 86

并行博弈树搜索算法-第1篇 什么是博弈树搜索算法

博弈树的搜索是人工智能领域一个重要的研究课题.许多完全信息的二人零和博弈问题都可以用博弈树搜索算法解决。 那么什么是二人零和博弈问题呢? 有一系列的博弈问题拥有以下性质[1]: 有两个对抗者:对抗者1和对抗者2. 两个对抗者交替移动.在博弈的每一个位置,对于正在移动的参与者,都存在有限个可能的移动. 游戏是决定性的,即游戏中不存在随机性. 游戏是完全信息的,即在任意时刻,博弈双方知道所处状态的所有信息.例如国际象棋是完全信息的,因为博弈双方知道所有的棋子所处位置,而两人玩的扑克牌游戏则是非完

Gerlen_X的博客 1227
上一篇: poj1363----栈
下一篇: 电脑小技巧
monkey7777
博客等级 码龄15年 55粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值