This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions

View File

@@ -2,7 +2,7 @@
comments: true
---
# 13.1.   回溯算法
# 13.1   回溯算法
「回溯算法 Backtracking Algorithm」是一种通过穷举来解决问题的方法它的核心思想是从一个初始状态出发暴力搜索所有可能的解决方案当遇到正确的解则将其记录直到找到解或者尝试了所有可能的选择都无法找到解为止。
@@ -199,7 +199,7 @@ comments: true
<p align="center"> 图:在前序遍历中搜索节点 </p>
## 13.1.1. &nbsp; 尝试与回退
## 13.1.1 &nbsp; 尝试与回退
**之所以称之为回溯算法,是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略**。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时,它会撤销上一步的选择,退回到之前的状态,并尝试其他可能的选择。
@@ -503,7 +503,7 @@ comments: true
<p align="center"> 图:尝试与回退 </p>
## 13.1.2. &nbsp; 剪枝
## 13.1.2 &nbsp; 剪枝
复杂的回溯问题通常包含一个或多个约束条件,**约束条件通常可用于“剪枝”**。
@@ -801,7 +801,7 @@ comments: true
<p align="center"> 图:根据约束条件剪枝 </p>
## 13.1.3. &nbsp; 框架代码
## 13.1.3 &nbsp; 框架代码
接下来,我们尝试将回溯的“尝试、回退、剪枝”的主体框架提炼出来,提升代码的通用性。
@@ -1663,7 +1663,7 @@ comments: true
相比基于前序遍历的代码实现,基于回溯算法框架的代码实现虽然显得啰嗦,但通用性更好。实际上,**许多回溯问题都可以在该框架下解决**。我们只需根据具体问题来定义 `state` 和 `choices` ,并实现框架中的各个方法即可。
## 13.1.4. &nbsp; 常用术语
## 13.1.4 &nbsp; 常用术语
为了更清晰地分析算法问题,我们总结一下回溯算法中常用术语的含义,并对照例题三给出对应示例。
@@ -1684,7 +1684,7 @@ comments: true
问题、解、状态等概念是通用的,在分治、回溯、动态规划、贪心等算法中都有涉及。
## 13.1.5. &nbsp; 优势与局限性
## 13.1.5 &nbsp; 优势与局限性
回溯算法本质上是一种深度优先搜索算法,它尝试所有可能的解决方案直到找到满足条件的解。这种方法的优势在于它能够找到所有可能的解决方案,而且在合理的剪枝操作下,具有很高的效率。
@@ -1698,7 +1698,7 @@ comments: true
- **剪枝**:避免搜索那些肯定不会产生解的路径,从而节省时间和空间。
- **启发式搜索**:在搜索过程中引入一些策略或者估计值,从而优先搜索最有可能产生有效解的路径。
## 13.1.6. &nbsp; 回溯典型例题
## 13.1.6 &nbsp; 回溯典型例题
回溯算法可用于解决许多搜索问题、约束满足问题和组合优化问题。