搜索
搜索其实就是图的基础上进行一个遍历,从一个结点开始,通过有规则的步骤,不断地把图上的每个点都遍历,直到遍历到满足条件或者遍历完所有店依旧还没找到的情况下退出。主要分为深搜和广搜两个方面。
一、深搜
从树的角度说,就是从根节点开始不断地往深处挖,等挖到最底下的时候再返回,重新选另一个根节点继续往下面挖。
根据这个特性,可以想象出代码的实现是通过不断地递归下一层,找到底再返回来实现的,还有另一种方式就是利用栈这个数据结构,利用栈后进先出的方式,实现深搜的实现。
这种近乎暴力的遍历方式更加适用于求有没有的存在性问题。当要求输出有多少条路存在 或者 全排列 的这种问题用深搜这种方法更好解决。
例题:
这些都是非常基础的深搜题目,不需要优化就可以写出来。
深搜这种方法从顶到底一条路走到黑的情况,如果数据范围非常的大,而且可以选择多个路遍历,可以想象他的时间复杂度是爆炸的(指数级),所以我们需要一些优化。
优化一、通过选取合适的根节点,来改变遍历的步骤,这样说不定可以优化时间。
优化二、记忆化递归,当某个点多次被遍历的时候,重复更新会浪费很多时间。这时候可以再开一个数组记录当前位置的状态,如果已经遍历过了,那么直接遍历下一个点或者返回,这样可以节省很多时间。
优化三、剪枝。剪枝就是通过某些条件判断,减少一些不符合条件的遍历。如果一个结点的选择不满足题目限制的条件,那么他的下一个结点也就没有必要往下遍历了,这个路就是无效的。形象的说,就是减去搜索树中的某些枝条。 例题:落谷 P1433 吃奶酪。
二、广搜
广搜的遍历过程从树的角度说,就是先把树的一层第一个开始,依次遍历同层所有子节点,然后再遍历第一个子节点的第一个结点,直到全部遍历结束或者遇到满足条件的情况。
在头脑中建立树的过程,如果把从该节点出发的所有可以走的结点连起来,那么每条线可以看成循环得每一步。那么就可以求解,遍历到某一个点 所需的最短的步骤数。
根据这个特性,可以想象出代码的实现是通过不断地递归下一层,找到底再返回来实现的,还有另一种方式就是利用队列这个数据结构,利用栈先进先出的方式,遍历到一个结点的时候,把从这个结点可以经过的所有点压入队列中,来模拟树的建立。

浙公网安备 33010602011771号