回溯算法(Backtracking Algorithm)
回溯算法(Backtracking Algorithm)是一种系统性地搜索问题解的算法设计思想,常用于解决组合、排列、搜索、路径探索等类型的问题。它通过尝试所有可能的选择来寻找问题的解,如果某个选择无法通向有效解,则“回溯”到之前的状态,尝试其他选择。
回溯算法的核心思想:
- 深度优先搜索(DFS):回溯算法本质上是一种递归的 DFS 搜索。
- 剪枝(Pruning):在搜索过程中,一旦发现当前路径不可能通向有效解,就立即停止继续探索,回退到上一步,尝试其他路径。
- 试探性求解:尝试填入一个候选解,若无法成功则撤销操作,尝试下一个候选。
回溯算法的典型应用场景:
- 组合问题:如从一组数中选出所有满足条件的组合。
- 排列问题:如生成一个数组的所有排列。
- 子集问题:如找出一个集合的所有子集。
- 数独、八皇后等约束满足问题。
- 迷宫路径搜索。
- 图的着色、哈密尔顿回路等问题。
回溯算法的基本模板(Python):
def backtrack(path, choices):if 满足结束条件:将 path 加入结果集returnfor 选择 in 可选 choices:做选择(将该选择加入 path)backtrack(path, 新的选择集)撤销选择(回溯)
示例:全排列问题
def permute(nums):res = []def backtrack(path, remaining):if not remaining:res.append(path[:]) # 将当前排列加入结果集returnfor i in range(len(remaining)):path.append(remaining[i]) # 做选择backtrack(path, remaining[:i] + remaining[i+1:]) # 递归进入下一层path.pop() # 撤销选择backtrack([], nums)return res
特点与优缺点:
优点:
- 能系统地尝试所有可能解,适合小规模问题。
- 实现直观,逻辑清晰。
- 适用于组合、排列、约束满足等问题。
缺点:
- 时间复杂度高,通常是 指数级 O(N!) 或 O(2^N)。
- 对大规模问题不适用,需结合剪枝、记忆化等优化手段。