---------------分治法
一:递归概念
递归是指子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的常用方法。
递归有两个基本要素:边界条件,即确定递归到何时终止,也称递归出口;
递归模式,即大问题是如何分解为小问题的,也称为递归体。
二:分治法的基本思想
分治法的设计思想是将一个难以直接解决的大问题分解成一些规模小的相同问题,以便各个击破,分而治之。如将规模为n的问题分解成互相独立且与原问题相同的k(1<K<n)个子问题。分治法产生的·子问题往往是原问题的较小模式,这就为递归替供了方便。
一般来说:分治法在每一层递归上都有3个步骤:
(1)分解。将原问题分解成一系列子问题。
(2)求解。递归的求解各个子问题。若子问题足够小,则直接求解。
(3)合并。将子问题的解合并成原问题的解。
三:典型应用:Hanoi塔问题
void Hanoi(int n,char a,char b,char c)
{
if(n>1){
Hanoi(n-1,a,c,b);//先将前n-1个盘子从a处通过c移到b处;
move(n,a,c); //将第n个盘子从a处直接移到c处;
Hanoi(n-1,b,a,c);//再将前n-1个盘子从b处通过a移到c处;
}
else
{
move(n,a,c); //只有一个盘子时,直接从a移到c。递归出口
}
}
---------贪心法
和动态规划法一样,贪心法也常常用于解决最优化问题。不过与动态规划法不同点是,贪心法在解决问题的策略上仅仅根据当前已有的信息做出选择,而且一旦做出选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做的选择只是在某种意义上的局部最优。
用贪心法求解的问题一般具有两个重要的性质.
(1)最优子结构。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构。问题的最优子结构是该问题可以采用动态规划或贪心法求解的关键性质。
(2)贪心选择性质。指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来得到。这是贪心法和动态规划法的主要区别。
装箱问题是贪心法的一个典型应用。
装箱问题可以描述如下:设有编号为0,1,2.......,n-1的n种物品,体积分别是v1,v2,v3......vn-1,将这n种物品装进容量都为v的若干箱子里。约定这n种物品的体积均不超过v。不同的装箱方案所需的箱子数目可能不同,装箱问题要求使装尽这n种物品的箱子数最少。
算法描述如下:
函数
{
输入箱子的容量v;
输入物品种类n;
按体积从大到小排列,输入各物品的体积;
预置已用箱子链为空;
预置已用箱子计数器box_count为0;
for(i=0;i<n;i++){//物品i按以下步骤装箱
从已用的第一只箱子开始顺序寻找能放入物品i的箱子j;
if(已用箱子都不能再放物品i){
另用一只箱子,并将物品i放入该箱子中;
box_count++;
}
else{
将物品i放入箱子j中;
}
}
}
---------------动态规划算法----------------------------
动态规划算法与分治法类似,其基本思想也是将带求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是独立的。
动态规划算法往往用于求解具有某种最优性质的问题。这类问题中。可能会有许多可行解,每一个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。当然,最优解可能会有多个,动态规划算法能找到其中的一个最优解。设计一个动态规划算法,通常可按照以下几个步骤进行。
(1)找到最优解的性质,并刻画其结构特征。
(2)递归地定义最优解地值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造一个最优解。
对于一个给定的问题,若其具有以下两个性质,则可以考虑用动态规划法来求解。
(1)最优子结构。如果一个问题的最优解包含了其子问题的最优解,就说该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划法可能适用,但是此时贪心策略可能也是适用的。
(2)重叠子问题。指用来解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。即当一个递归算法不断地调用同一个问题时,就说该问题包含重叠子问题。此时若用分治法递归求解,则每次遇到的子问题都会被视为新问题,极大地降低算法的效率,而动态规划法总是充分利用重叠子问题,对每一个子问题仅计算一次,把解保存在一个在需要时就可以查看的表中,而每次查表的时间为常数。
---------------------回溯法---------------------------
回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按照某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果