关于搜索的一些理解

搜索是一种及其基础的算法 掌握其基本内容是必要的  而其衍生的题目也可以十分复杂 光看是不行的 所有每种题目后面我都推荐了一些题目

其实搜索考的是思维  引用黄大佬的说法就是结构简单就思维难  因为基本套路大家都知道

搜索其实是一种相当暴力的思路 枚举所有状态来找出其中符合题目要求的并记录下来  搜索的方法有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  

你可能感兴趣的:(关于搜索的一些理解)