「回溯算法」专题 1:在树形问题中使用深度优先遍历


「回溯算法」专题 1:在树形问题中使用深度优先遍历

回溯法是解决很多算法问题的常见思想,甚至可以说是传统人工智能的基础方法。其本质依然是使用递归的方法在树形空间中寻找解。在这一章,我们来具体看一下将递归这种技术使用在非二叉树的结构中,从而认识回溯这一基础算法思想。

在解决二叉树的问题的中我们已经看到了递归算法的威力和有趣之处,也体会到了使用递归算法的痛点。当然,递归算法也绝不仅仅只是适用于二叉树问题的解决。从这一节开始,我们会在更多、更广义的问题上,使用递归算法。

递归算法还能够解决的一个典型问题,是具有树形结构的问题,当我们发现一个问题与一个更小的问题之间存在递归关系的时候,此时,递归关系呈现出来的就是一个树形结构。

为此,我们从一个比较简单的问题入手,介绍什么是树形问题。

回溯算法

  • 回溯搜索算法就是在树形图上的深度优先遍历;
  • 正因为「深度优先遍历」有「回退」的过程,才需要「状态重置」或者称「撤销选择」,这就是「回溯」的意思。

理解回溯算法的第一步是画出树形图

参考的练习题在第 1 部分。

难点 1

理解「回溯」,倒不如把「回溯」理解成「深度优先遍历」,「回溯」只是现象,本质是 DFS

  • 回溯算法本质上是遍历的算法,全程使用一份状态变量去搜索状态空间里的所有状态,是节约空间的;
  • 深度优先遍历呈现「一条道走到底,不撞南墙」不回头的特点。

难点 2

「深度优先遍历」与「广度优先遍历」的联系与差别:

  • 回溯算法本质上是遍历的算法,全程使用一份状态变量去搜索状态空间里的所有状态,是节约空间的;
  • 深度优先遍历呈现「一条道走到底,不撞南墙」不回头的特点。

回溯法是解决很多算法问题的常见思想,甚至可以说是传统人工智能的基础方法。其本质依然是使用递归的方法在树形空间中寻找解。在这一章,我们来具体看一下将递归这种技术使用在非二叉树的结构中,从而认识回溯这一基础算法思想。

在解决二叉树的问题的中我们已经看到了递归算法的威力和有趣之处,也体会到了使用递归算法的痛点。当然,递归算法也绝不仅仅只是适用于二叉树问题的解决。从这一节开始,我们会在更多、更广义的问题上,使用递归算法。

递归算法还能够解决的一个典型问题,是具有树形结构的问题,当我们发现一个问题与一个更小的问题之间存在递归关系的时候,此时,递归关系呈现出来的就是一个树形结构。

为此,我们从一个比较简单的问题入手,介绍什么是树形问题。


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「回溯算法」专题 2:从「全排列」问题开始认识「回溯算法」 「回溯算法」专题 2:从「全排列」问题开始认识「回溯算法」
「回溯算法」专题 2:从「全排列」问题开始认识「回溯算法」体会回溯的方法在求解排列问题中的应用,掌握使用数组记录每次走过的路的技巧,体会在这样的过程中状态重置的意义。 首先画出这个问题的树形结构。 所有符合条件的结点在这棵递归树的叶子结
下一篇 
「力扣」第 1080 题:根到叶路径上的不足节点 「力扣」第 1080 题:根到叶路径上的不足节点
「力扣」第 1080 题:根到叶路径上的不足节点题解地址:分治法、后序遍历(Python 代码、Java 代码)。 说明:文本首发在力扣的题解版块,更新也会在第 1 时间在上面的网站中更新,这篇文章只是上面的文章的一个快照,您可以点击上面的
  目录