深度优先搜索(DFS)优化手册

前言

在上一篇博客中我们详细介绍了深度优先搜索(DFS)详解,但相信大在刷搜索题的时候,都会遇到一个问题,那就是DFS的运行时间太长了,很容易就会TLE,这时候如果想不到更好的算法,那就应该考虑优化,今天这篇文章我们就来仔细聊聊如何优化深搜,使深搜更高效的寻找答案。

技巧一.剪枝

1.基本定义


在通过搜索解决实际问题的过程中,我们是通过穷举每种情况来寻找合法解,然而在一些情况比较复杂的题目、数据量较强的题目中,由于算法的时间复杂度较高、数据规模过大,从而会导致运行超时甚至程序卡死,因此在对复杂问题的答案进行搜索时,我们应该灵活的针对每种题型设计对应的搜索规则并进行优化,通常通过设置剪枝、排除无效情况、对问题进行适当的转化等手法对搜索算法进行优化,使算法高效的执行并得出我们想要的结果。

对算法的剪枝与优化堪称是爆搜算法的精髓,如何合理的设置剪枝优化直接关系能否得到结果,这对我们的解题思维是一个很大的挑战,本板块将对常见的剪枝优化思路、对细节的处理进行归纳总结。

2.剪枝的原则

(1).正确性

剪枝优化的过程是使算法逼近最优解的过程,而不是使算法远离最优解甚至跳过最优解的过程。剪枝的前提是保证对最优解不丢不漏。

(2).准确性

在保证正确性的前提下,我们采取必要的手段使算法跳过一定不含有目标状态/最优解的分支,从而保证算法高效地进行并更迅速的找出

(3).高效性

设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少. 但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾. 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的。

3.

(1).可行性剪枝:

如果可以判断以当前状态进行扩展,无论如何都达不到目标状态,此时应立即回溯。

(2).最优性剪枝:

如果之前的搜索路径到达当前状态时,记录的值比当前值更优,说明当前搜索路径不能产生更优的结果,应立即回溯,否则更新答案。

(3).优化搜索顺序:

在一些题目中,可以通过对子问题分支进行分析,先解决相对简单的子问题从而使尚未解决的子问题得到简化,通过对搜索顺序的优化可以实现这一点。

(4).排除冗余信息:

对限制条件进行分析,不要额外添加没有意义的搜索规则

技巧二.记忆化搜索

在搜索的时候,某些状态会被重复计算,导致了时间的浪费,此时可以把已经计算过的用数组存下来,下一次搜索时,便可以直接返回值,无需再次搜索,这种用空间换时间的优化方法,叫做记忆化搜索。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值