“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
搜索的核心概念
问题求解树
- 分析要求解的问题之后,得出的一种思维逻辑层面的树形结构
- 从状态 1 开始,可以衍生的到状态 2,状态 3 ...,且每一个状态都可能会衍生出新的状态,最终形成一棵树的结构
举例:走迷宫问题
- 求在下列表格中,🐮 从初始位置走到 🌟 位置的路径,其中 X 表示该位置禁止通行
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 🐮 | |||
| 1 | X | |||
| 2 | X | |||
| 3 | X | 🌟 |
- 分析该问题,可以设定 🐮 所在的位置坐标,为「 问题求解树 」中的每个状态,状态和状态之间的关系,可以用有向边来表示,因此得出该问题的「 部分问题求解树 」如下:
什么是深搜和广搜
- 其实就是对「 问题求解树 」中节点按照不同的方式进行遍历,详情见下面
什么是搜索剪枝和优化
- 可以理解为排除某些不符合要求的 「 问题求解树 」中子树的遍历过程的行为
什么是设计搜索算法的核心关键点
- 就是如何设计「 问题搜索树 」中节点所表示的状态
深度优先搜索 DFS
- 简单的说,就是在搜索每种状态时,每次尽量往深了去查找状态
- 以上面走迷宫的「 部分问题搜索树 」为例,进行深度优先搜索得到的一种序列结果如下:
-
- (0, 0) -> (0, 1) -> (0, 2) -> (1, 1) -> (1, 0) -> (1, 1) -> (2, 0)
- 深搜本质上与基于递归的树形结构的遍历相似,因此深搜的程序代码通常情况下是以递归的外在形式表现的
广度优先搜索 BFS
- 广搜本质上与树的层序遍历相似,它处理完上一层所有状态后,才会处理下一层的状态
- 以上面走迷宫的「 部分问题搜索树 」为例,进行广度优先搜索得到的一种序列结果如下:
-
- (0, 0) -> (0, 1) -> (1, 0) -> (0, 2) -> (1, 1) -> (1, 1) -> (2, 0)
- 以广搜处理状态节点的流程,可以知道它更适合处理最优化问题的求解
-
- 假设上述问题是,求 🐮 最少走多少步到达 🌟
- 那么按照广搜的方式进行求解,当前层的所有节点中包含 🌟 时,最优解就出来了