关于搜索的一些理解
搜索是一种及其基础的算法 掌握其基本内容是必要的 而其衍生的题目也可以十分复杂 光看是不行的 所有每种题目后面我都推荐了一些题目
其实搜索考的是思维 引用黄大佬的说法就是结构简单就思维难 因为基本套路大家都知道
搜索其实是一种相当暴力的思路 枚举所有状态来找出其中符合题目要求的并记录下来 搜索的方法有DFS(深度优先搜索)、BFS(广度优先搜索)、二分搜索、双向搜索、启发式搜索等等
洛谷 P1665、P1019、P1088
DFS的基本过程其实相当于走迷宫时你朝着一个方向走 如果是死路就返回到最近的岔路口选择另一个方向 直到你到达了出口
其缺点是显而易见的 会花费大量的时间 这时就需要一些技巧来降低时间花费 对一定不符合题目的状态提前找出并排除 这就是DFS的剪枝技巧的来源 剪枝顾名思义是剪掉树木的枝条 什么枝条需要减除 在题目中就是不符合要求的 其实这里就开始玄学了 到底什么不符合就要看题目了 难度的区分就从这里开始
我说几个比较基础的剪枝思路 使用数组标记位置 当一个位置你到达时已经被标记过了 那么说明在前面你到达了这里 你又绕回来了 如果是求最短路线的你这条路肯定不行了 不过要注意在有些时候在回来的时候清除标记 标记化转化一下就是记忆化了 每当你到达一个新的地点就把状态提前储存下来 那么下次再到达时就可以直接利用 省下了大笔的时间 这个其实就是DP的一种思路把已知量储存下来并用来推出未知量
洛谷 P1219(经典的八皇后)、P1434、P1118、P1433、P1120
BFS的基本过程与DFS类似 不过它是相当于走迷宫时 每一次将所有可能性都走一步并储存下来 于是它运用了queue队列 这使得它在找最短路线题目及其简单 第一次到达终点肯定是最短的
它的其他技巧与DFS类似就不深入了
洛谷 P1605、P1135、P1443
二分搜索是在一个限定范围类猜测关键值并拿来检测是否符合 如果不符合是多了还是小了来调整下次的猜测值 它的关键是边界与check函数的设置 这时就需要思维了(这需要是在一个单调区间内进行)感谢黄大佬提醒%%%%
洛谷 P1873、P1024、P2440、P3853
双向搜索其实就是从起点与终点一起搜索 在中间汇合 可以降低复杂度
看到最后来个彩蛋 推荐一首轻音乐 Spring