DFS、BFS、迭代深搜、A*、IDA*
进入大学后做的第一项专题。
搜索算法其实在OI经历中我也不是很常用,最多在打暴力的时候用一用,那个时候倒也不计较时间复杂度了反正都不可能AC(笑)
所以这次专题的重点和难点主要还是在后三者,我尽力用能让人听懂的话讲明白吧。
DFS
深度优先搜索,最常见的搜索算法之一。
非常好理解的思路,每次搜索到一个节点就沿着这个节点一直搜索下去,一条路走到死的搜索算法。
时间复杂度……反正我是没怎么见到过不需要优化的裸DFS题(练习模板题除外)。空间复杂度倒是比BFS少不少(该爆栈还是会爆的)。
所以总体来说理解思路就好,反正实现也不算复杂。
BFS
广度优先搜索,和上面的DFS一样是最常见的搜索算法之一。
思路也不算难,就是每次将下一层所有的可能性都拓展完放进队列里然后再开始搜索下一层。
空间复杂度非常惊人,时间复杂度也比DFS好不到哪去。(有DFS过不去换BFS就能过去的搜索题吗?)
总体来说使用BFS的时候纯搜索还是比较少,一般是以BFS为载体来实现一些别的算法(比如SPFA)
理解思路,理解思路。
迭代深搜
迭代加深搜索。在DFS上加一个深度限制。
具体来说,首先设定搜索深度,然后深搜最多搜索这个深度大小(比如是1就最多搜索一层),如果当前深度下没有搜索到答案,就把限制的深度+1再进行搜索,直到搜索到答案位置。
乍听很憨憨的思路,因为每次加深深度都要把前面的再搜一遍,不过在BFS空间不够DFS又太慢的时候有奇效(大概吧,还没做题)。
A*
启发式搜索。
核心思路是估价函数,评估当前节点的价值,然后优先从价值高的节点开始搜索。
因为每次搜索拓展到新的节点的时候都要对当前已有但是还未搜索的节点进行估值排序,而且已经访问过的节点可能在更新价值后也还会再次进入搜索序列,我们这里要使用一个堆来维护节点序列。(之前还在想要怎么维护,是不是用链表……看到别人的讲解才想起要用堆,我也是傻子)。
A*算法的实现好坏全看估价函数写得怎么样,估价函数好算法运行就优秀,写的垃圾……嗯,最烂也就BFS那个复杂度了。
IDA*
A*+迭代深搜的思路。
这里A*的思路是指估价函数,每次对当前的节点进行一次估价,假如判定当前节点继续下去也到不了终点就剪掉这条分支。
和A*算法类似,运行速度全看估价函数写得怎么样,写得好你的IDA*就无敌,写得垃圾……嗯,就当写了个常数优化巨差的迭代深搜吧。
注意一点是,IDA*不是加了迭代深搜思路的A*算法,因为A*它是个BFS拓展,而IDA*是DFS,要说的话整个科技树像是DFS-迭代深搜-IDA*,BFS-A*,这么点的吧。
上篇全是嘴炮,都是空的,下篇的话会有题目题解和代码。
希望能早日AC
咕了,不会写(草)
搜索太难了。