mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-14 08:06:06 +00:00
build
This commit is contained in:
@@ -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. 尝试与回退
|
||||
## 13.1.1 尝试与回退
|
||||
|
||||
**之所以称之为回溯算法,是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略**。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时,它会撤销上一步的选择,退回到之前的状态,并尝试其他可能的选择。
|
||||
|
||||
@@ -503,7 +503,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图:尝试与回退 </p>
|
||||
|
||||
## 13.1.2. 剪枝
|
||||
## 13.1.2 剪枝
|
||||
|
||||
复杂的回溯问题通常包含一个或多个约束条件,**约束条件通常可用于“剪枝”**。
|
||||
|
||||
@@ -801,7 +801,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图:根据约束条件剪枝 </p>
|
||||
|
||||
## 13.1.3. 框架代码
|
||||
## 13.1.3 框架代码
|
||||
|
||||
接下来,我们尝试将回溯的“尝试、回退、剪枝”的主体框架提炼出来,提升代码的通用性。
|
||||
|
||||
@@ -1663,7 +1663,7 @@ comments: true
|
||||
|
||||
相比基于前序遍历的代码实现,基于回溯算法框架的代码实现虽然显得啰嗦,但通用性更好。实际上,**许多回溯问题都可以在该框架下解决**。我们只需根据具体问题来定义 `state` 和 `choices` ,并实现框架中的各个方法即可。
|
||||
|
||||
## 13.1.4. 常用术语
|
||||
## 13.1.4 常用术语
|
||||
|
||||
为了更清晰地分析算法问题,我们总结一下回溯算法中常用术语的含义,并对照例题三给出对应示例。
|
||||
|
||||
@@ -1684,7 +1684,7 @@ comments: true
|
||||
|
||||
问题、解、状态等概念是通用的,在分治、回溯、动态规划、贪心等算法中都有涉及。
|
||||
|
||||
## 13.1.5. 优势与局限性
|
||||
## 13.1.5 优势与局限性
|
||||
|
||||
回溯算法本质上是一种深度优先搜索算法,它尝试所有可能的解决方案直到找到满足条件的解。这种方法的优势在于它能够找到所有可能的解决方案,而且在合理的剪枝操作下,具有很高的效率。
|
||||
|
||||
@@ -1698,7 +1698,7 @@ comments: true
|
||||
- **剪枝**:避免搜索那些肯定不会产生解的路径,从而节省时间和空间。
|
||||
- **启发式搜索**:在搜索过程中引入一些策略或者估计值,从而优先搜索最有可能产生有效解的路径。
|
||||
|
||||
## 13.1.6. 回溯典型例题
|
||||
## 13.1.6 回溯典型例题
|
||||
|
||||
回溯算法可用于解决许多搜索问题、约束满足问题和组合优化问题。
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ comments: true
|
||||
icon: material/map-marker-path
|
||||
---
|
||||
|
||||
# 13. 回溯
|
||||
# 第 13 章 回溯
|
||||
|
||||
<div class="center-table" markdown>
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 13.4. N 皇后问题
|
||||
# 13.4 N 皇后问题
|
||||
|
||||
!!! question
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 13.2. 全排列问题
|
||||
# 13.2 全排列问题
|
||||
|
||||
全排列问题是回溯算法的一个典型应用。它的定义是在给定一个集合(如一个数组或字符串)的情况下,找出这个集合中元素的所有可能的排列。
|
||||
|
||||
@@ -20,7 +20,7 @@ comments: true
|
||||
|
||||
</div>
|
||||
|
||||
## 13.2.1. 无相等元素的情况
|
||||
## 13.2.1 无相等元素的情况
|
||||
|
||||
!!! question
|
||||
|
||||
@@ -473,7 +473,7 @@ comments: true
|
||||
}
|
||||
```
|
||||
|
||||
## 13.2.2. 考虑相等元素的情况
|
||||
## 13.2.2 考虑相等元素的情况
|
||||
|
||||
!!! question
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 13.3. 子集和问题
|
||||
# 13.3 子集和问题
|
||||
|
||||
## 13.3.1. 无重复元素的情况
|
||||
## 13.3.1 无重复元素的情况
|
||||
|
||||
!!! question
|
||||
|
||||
@@ -918,7 +918,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图:子集和 I 回溯过程 </p>
|
||||
|
||||
## 13.3.2. 考虑重复元素的情况
|
||||
## 13.3.2 考虑重复元素的情况
|
||||
|
||||
!!! question
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 13.5. 小结
|
||||
# 13.5 小结
|
||||
|
||||
- 回溯算法本质是穷举法,通过对解空间进行深度优先遍历来寻找符合条件的解。在搜索过程中,遇到满足条件的解则记录,直至找到所有解或遍历完成后结束。
|
||||
- 回溯算法的搜索过程包括尝试与回退两个部分。它通过深度优先搜索来尝试各种选择,当遇到不满足约束条件的情况时,则撤销上一步的选择,退回到之前的状态,并继续尝试其他选择。尝试与回退是两个方向相反的操作。
|
||||
|
||||
Reference in New Issue
Block a user