深搜与广搜的核心概念

320 阅读2分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

搜索的核心概念

问题求解树

  • 分析要求解的问题之后,得出的一种思维逻辑层面的树形结构
  • 从状态 1 开始,可以衍生的到状态 2,状态 3 ...,且每一个状态都可能会衍生出新的状态,最终形成一棵树的结构

举例:走迷宫问题

  • 求在下列表格中,🐮 从初始位置走到 🌟 位置的路径,其中 X 表示该位置禁止通行
0123
0🐮
1X
2X
3X🌟
  • 分析该问题,可以设定 🐮 所在的位置坐标,为「 问题求解树 」中的每个状态,状态和状态之间的关系,可以用有向边来表示,因此得出该问题的「 部分问题求解树 」如下:

什么是深搜和广搜

  • 其实就是对「 问题求解树 」中节点按照不同的方式进行遍历,详情见下面

什么是搜索剪枝和优化

  • 可以理解为排除某些不符合要求的 「 问题求解树 」中子树的遍历过程的行为

什么是设计搜索算法的核心关键点

  • 就是如何设计「 问题搜索树 」中节点所表示的状态

深度优先搜索 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)
  • 以广搜处理状态节点的流程,可以知道它更适合处理最优化问题的求解
    • 假设上述问题是,求 🐮 最少走多少步到达 🌟
    • 那么按照广搜的方式进行求解,当前层的所有节点中包含 🌟 时,最优解就出来了

代码演示