码迷,mamicode.com
首页 > 其他好文 > 详细

[知识点] 3.3 搜索优化

时间:2020-06-16 00:55:38      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:增加   break   str   目录   改变   提高   冗余   情况   动态规划基础   

总目录 > 3 搜索 > 3.3 搜索优化

前言

 

子目录列表

1、

 

3.2 五种改进搜索算法

1、为什么需要优化

在最开始我们就提到,搜索算法适用性很广,在不清楚正确算法,没有思路,或者时间紧迫的情况下,大部分题目都可以进行“暴力搜索”。当然,比起正确的算法,搜索的效率是低下的,OI 赛制中得分往往不会超过 30 分,ICPC 赛制中往往是不可取的。但搜索真的就卑微地拘泥于捡漏吗?也不然。搜索的普适性,同时反映出其过程是无脑而有冗余的,我们可以对其进行一些优化,使其效率提高。

2、剪枝

搜索优化和 3.2 五种改进搜索算法 中提及的改进搜索算法是有区别的。改进的搜索算法本质上是不同的算法,和普通的 DFS / BFS 相比框架已经发生较大的改变;而搜索优化是在原有框架进行的,一般是直接在原搜索代码中增加一些 break 或 continue 型的语句,以跳过一些必然不会得到答案的情况,这种操作俗称为“剪枝”。

剪枝,很好理解的一个词。路边种下的树木随着年轮的生长枝叶逐渐繁多,园林工人会对其一些枝叶进行修剪,或为了调整生长方向使其端庄而立,或为了减少结果量使其果实质量提升,总而言之是通过外力对树木生长的一种“优化”。不剪枝,树木同样能够长大,但随着生长可能出现诸多不够理想的情况;不剪枝,搜索同样能够得到结果,但受到效率低下的影响,得分可能也会不够理想。

那么对于搜索的剪枝有些什么具体的方式呢?一般我们将其分为三种 —— 记忆化搜索,最优性剪枝,可行性剪枝。下面一一进行分析。

 

3、记忆化搜索

大致思路:搜索过程中出现曾经出现过的状态,并且到达该状态之后的搜索过程与到达该状态前的搜索过程无关,即无后效性,可以直接停止搜索,回溯。通过一个记录数组来记录这个状态是否出现,以规避多次计算相同状态而做无用功。

具体请参见 4.1 动态规划基础 / 记忆化搜索

 

4、最优性剪枝

大致思路:搜索过程中当前的解比之前得到的解更差时,可以直接停止搜索并回溯。直接在递归时判断一下当前值与当前最优解的大小关系即可。

 

5、可行性剪枝

大致思路:搜索过程中当前得到的解已经不满足题目要求,可以直接停止搜索并回溯。直接在递归时判断一下当前值与条件范围内下限值即可。

这一类剪枝可以联系迭代加深 DFS 来理解。对于迭代加深 DFS,每次限制搜索深度,相当于每次调整下限值,当前深度超过限制深度即返回,也算是一种可行性剪枝。

[知识点] 3.3 搜索优化

标签:增加   break   str   目录   改变   提高   冗余   情况   动态规划基础   

原文地址:https://www.cnblogs.com/jinkun113/p/13138573.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!