回溯法中,剪枝操作的作用是避免搜索那些不可能产生可行解或最优解的子树,从而减少无效搜索,提高算法效率。因此,正确答案是:
A. 加快搜索速度
剪枝本身不改变解的正确性,而是通过提前终止无前途的分支(如违反约束条件、目标函数值已劣于当前最优解等),显著降低时间复杂度,尤其在解空间庞大的问题(如N皇后、0-1背包、旅行商问题)中效果明显。
# 示例:N皇后问题中的剪枝(判断当前列是否与已放置皇后冲突)
def is_safe(board, row, col):
# 检查列、主对角线、副对角线是否有冲突 → 剪枝条件
for i in range(row):
if (board[i] == col or
board[i] - i == col - row or
board[i] + i == col + row):
return False
return True
回溯法中:
-
可行性剪枝(Feasibility Pruning):用于判断当前部分解是否满足问题的约束条件。若不满足(如N皇后中同一列/对角线已存在皇后、图着色中相邻顶点颜色相同),则该分支不可能延伸出任何可行解,立即回溯。其目标是排除不可行解,保证最终得到的解都合法。
-
最优性剪枝(Optimality Pruning):仅适用于求最优解的问题(如最小代价、最大收益)。它基于对当前部分解所能达到的目标函数上界(或下界)的估计,若该估计值已劣于当前已找到的最优解(例如:已得最优值为100,而当前路径即使填满剩余位置也不可能超过95),则剪去该子树。其目标是排除虽可行但不可能更优的分支,提升效率而不影响最优性。
✅ 关键区别总结:
| 维度 | 可行性剪枝 | 最优性剪枝 |
|---|---|---|
| 判断依据 | 约束条件(硬性规则) | 目标函数界 + 当前最优解 |
| 适用问题类型 | 所有回溯问题(求解/计数) | 仅优化类问题(求最大/最小值) |
| 是否影响解集 | 是(剔除非法解) | 否(不丢最优解,前提是界计算正确) |
| 典型技术 | 冲突检测、约束检查 | 限界函数(Bound)、贪心估计、松弛解 |
# 示例:0-1背包回溯中的两类剪枝
def backtrack(i, weight, value):
if i == n: # 叶子节点
global best_value
best_value = max(best_value, value)
return
# ✅ 可行性剪枝:超重则不扩展左子树(选第i个物品)
if weight + w[i] <= W:
backtrack(i + 1, weight + w[i], value + v[i])
# ✅ 最优性剪枝:计算剩余物品的上界(如按单位价值贪心填充)
bound = value + bound_estimate(i + 1, W - weight)
if bound > best_value: # 仅当可能超越当前最优时才搜索右子树(不选i)
backtrack(i + 1, weight, value)


165

被折叠的 条评论
为什么被折叠?



