赞
踩
在上一篇博客中我们详细介绍了深度优先搜索(DFS)详解,但相信大在刷搜索题的时候,都会遇到一个问题,那就是DFS的运行时间太长了,很容易就会TLE,这时候如果想不到更好的算法,那就应该考虑优化,今天这篇文章我们就来仔细聊聊如何优化深搜,使深搜更高效的寻找答案。
在通过搜索解决实际问题的过程中,我们是通过穷举每种情况来寻找合法解,然而在一些情况比较复杂的题目、数据量较强的题目中,由于算法的时间复杂度较高、数据规模过大,从而会导致运行超时甚至程序卡死,因此在对复杂问题的答案进行搜索时,我们应该灵活的针对每种题型设计对应的搜索规则并进行优化,通常通过设置剪枝、排除无效情况、对问题进行适当的转化等手法对搜索算法进行优化,使算法高效的执行并得出我们想要的结果。对算法的剪枝与优化堪称是爆搜算法的精髓,如何合理的设置剪枝优化直接关系能否得到结果,这对我们的解题思维是一个很大的挑战,本板块将对常见的剪枝优化思路、对细节的处理进行归纳总结。
剪枝优化的过程是使算法逼近最优解的过程,而不是使算法远离最优解甚至跳过最优解的过程。剪枝的前提是保证对最优解不丢不漏。
在保证正确性的前提下,我们采取必要的手段使算法跳过一定不含有目标状态/最优解的分支,从而保证算法高效地进行并更迅速的找出
设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少. 但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾. 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的。
如果可以判断以当前状态进行扩展,无论如何都达不到目标状态,此时应立即回溯。
如果之前的搜索路径到达当前状态时,记录的值比当前值更优,说明当前搜索路径不能产生更优的结果,应立即回溯,否则更新答案。
在一些题目中,可以通过对子问题分支进行分析,先解决相对简单的子问题从而使尚未解决的子问题得到简化,通过对搜索顺序的优化可以实现这一点。
对限制条件进行分析,不要额外添加没有意义的搜索规则
在搜索的时候,某些状态会被重复计算,导致了时间的浪费,此时可以把已经计算过的用数组存下来,下一次搜索时,便可以直接返回值,无需再次搜索,这种用空间换时间的优化方法,叫做记忆化搜索。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。