剪枝本身不改变解的正确性,而是通过提前终止无前途的分支(如违反约束条件、目标函数值已劣于当前最优解等),显著降低时间复杂度

回溯法中,剪枝操作的作用是避免搜索那些不可能产生可行解或最优解的子树,从而减少无效搜索,提高算法效率。因此,正确答案是:

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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值