五大常用算法之四:回溯法

(转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html)

1、概念

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

2、基本思想

   在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。

若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。

而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

3、用回溯法解题的一般步骤:

(1)针对所给问题,确定问题的解空间:

首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解。

(2)确定结点的扩展搜索规则

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

4、算法框架

(1)问题框架

设问题的解是一个n维向量(a1,a2,………,an),约束条件是ai(i=1,2,3,…..,n)之间满足某种条件,记为f(ai)。

(2)非递归回溯框架

   1: int a[n],i;

   2: 初始化数组a[];

   3: i = 1;

   4: while (i>0(有路可走)   and  (未达到目标))  // 还未回溯到头

   5: {

   6:     if(i > n)                                              // 搜索到叶结点

   7:     {   

   8:           搜索到一个解,输出;

   9:     }

  10:     else                                                   // 处理第i个元素

  11:     { 

  12:           a[i]第一个可能的值;

  13:           while(a[i]在不满足约束条件且在搜索空间内)

  14:           {

  15:               a[i]下一个可能的值;

  16:           }

  17:           if(a[i]在搜索空间内)

  18:          {

  19:               标识占用的资源;

  20:               i = i+1;                              // 扩展下一个结点

  21:          }

  22:          else 

  23:         {

  24:               清理所占的状态空间;            // 回溯

  25:               i = i –1; 

  26:          }

  27: }

(3)递归的算法框架

回溯法是对解空间的深度优先搜索,在一般情况下使用递归函数来实现回溯法比较简单,其中i为搜索的深度,框架如下:

   1: int a[n];

   2: try(int i)

   3: {

   4:     if(i>n)

   5:        输出结果;

   6:      else

   7:     {

   8:        for(j = 下界; j <= 上界; j=j+1)  // 枚举i所有可能的路径

   9:        {

  10:            if(fun(j))                 // 满足限界函数和约束条件

  11:              {

  12:                 a[i] = j;

  13:               ...                         // 其他操作

  14:                 try(i+1);

  15:               回溯前的清理工作(如a[i]置空值等);

  16:               }

  17:          }

  18:      }

  19: }
时间: 2024-10-14 06:34:22

五大常用算法之四:回溯法的相关文章

(转)五大常用算法之四:回溯法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 许多复杂的,

五大经典算法之回溯法

一.基本概念 ??回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷举法的区别和联系: 相同点:它们都是基于试探的. 区别:穷举法要将一个解的各个部分全部生成后,才检查是否满足条件,若不满足,则直接放弃该完整解,然后再尝试另一个可能的完整解,它并没有沿着一个可能的完整解的各个部分逐步回退生成解的过程.而对于回溯法,一个解的各个部分是逐步生成的,当发现当前生成的某

[转]五大常用算法:分治、动态规划、贪心、回溯和分支界定

Referred from http://blog.csdn.net/yapian8/article/details/28240973 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求

五大常用算法----贪心、动态规划、分支限界、分治算法和回溯算法

五大常用算法之一:贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 五大常用算法之二:动态规划算法 五大常用算法之三:分支限界算法

五大常用算法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)-- 任何一个可以用计

五大常用算法:分治、动态规划、贪心、回溯和分支界定

苹果的WWDC ,除了发布了os x 10.10 和IOS8 外,还推出了Swift.详细点击这里 代码总体风格有点像Java,也有点像javascript. 下面给出一些代码段(来自苹果官方手册): println("Hello, world") "var myVariable = 42 myVariable = 50 let myConstant = 42" 摘录来自: Apple Inc. "The Swift Programming Languag

转:算法分析之 五大常用算法

算法分析之 五大常用算法 算法的复杂度 1.分治法 · 话说递归与HANOI塔 · 二分法求方程近似解 · 用C++实现合并排序 · 求最大值和最小值的分治算法 2.动态规划法 · 动态规划求0/1背包问题 · 最长公共子串问题的实现 · 用动态规划实现导弹拦截 · 最大化投资回报问题的实现 3.贪心算法 · 最小生成树之Prim算法 · 最小生成树之kruskal算法 · 贪心算法在背包中的应用 · 汽车加油问题之贪心算法 4.回溯法 · 回溯法之数的划分 · 回溯法求解运动员最佳配对问题 ·

【转载】算法设计之五大常用算法设计方法总结

转载自http://blog.csdn.net/zolalad/article/details/11393915 算法设计之五大常用算法设计方法总结 一.[分治法]  在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)--等.任

五大常用算法总结

最优化问题是计算机领域的一个很重要的问题,很多现实的问题本质上都是最优化问题,或者说都可以转化为最优化的问题.比如说怎么规划旅游线路最省钱,在指定的时间里做更多的事情等等,这些都是最优化问题.为了解决最优化问题,计算机界提出了各种算法. 其中有五大常用算法,它们是贪婪算法,动态规划算法,分治算法,回溯算法以及分支限界算法. 1) 贪婪算法 在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解.贪婪算法可以获取到问题的局部最优解,不