递归回溯模板(回溯概念)

本文深入解析了回溯法这一通用算法的核心概念与实现原理。详细介绍了回溯法如何通过动态生成解空间,进行深度优先搜索,以求解复杂问题。并提供了一个递归回溯模板,展示了算法的具体实现步骤。

 

通用算法: 
 

 

用回溯法解体的一个显著特征是 在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根节点到当前扩展节点的路径。如果解空间树中从根结点到叶节点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))   

 

 

递归回溯模板:

回溯法对解空间做深度优先搜索,因此在一般情况下可用递归函数来实现回溯法: 

 

      void Backtrack(int t)    //t表示递归深度 即当前扩展节点在解空间树中的深度 

      { 

          if (t > n) output(x);   // n用来控制递归深度 当t > n时表明已经到叶节点,此时输出得到的可行解x 

          else 

              for(int i = f(n, t); i <= g(n, t); i++)   // f g分别表示为 在当前扩展节点处未搜索过的子树的起始编号和终止编号 

              { 

                  x[t] = h(i);   // h(i)表示在当前扩展节点x[t]的第i个可选值 

                  if(Constraint(t) && Bound(t))  Backtrack(t + 1);     //constraint 表示约束  bound表示界限   

                  // 当constraint返回为true时表示 在当前扩展节点x[1 : t]的取值满足问题的约束条件,否则不满足,可剪去相应子树 

                  //当bound返回为true时表示 在当前扩展节点x[1 : t]的取值未使得目标函数越界,还需要backtrack(t + 1)对其做进一步搜索。否则当越界时,可剪 

              

              }    //在执行了算法得for循环后已搜索遍当前扩展节点的所有为搜索的子树,backtrack执行完毕,返回t - 1层继续执行,继续搜索。 

      } 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值