算法设计与分析,分治,回溯法,分支限界法,动态规划,贪心算法总结

分治,回溯法,分支限界法,动态规划,贪心算法

分治法

1.基本思想及策略

(1)分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
(2)分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

2.使用要求

(1)该问题的规模缩小到一定的程度就可以容易地解决
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3)利用该问题分解出的子问题的解可以合并为该问题的解
(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加
第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用
第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。
第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。

3.NOJ中可使用分治法求解的一些经典问题

(1)二分查找 (2)归并排序 (3)快速排序
(4)求第k小数 (5)循环赛日程表

回溯法

1、基本思想

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

2.使用要求

(1)当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,需要使用回溯法
(2)当需要使用回溯法时,需要明确定义问题的解空间,问题的解空间至少包含问题的一个(最优解)

在回溯法搜索空间树时,通常采用两种策略避免无效搜索,提高回溯法的搜索效率。其一时用约束函数在扩展节点处减去不满足约束的子树;其二是用限界函数剪去得不到最优解的子树。这两类函数统称为剪枝函数。

3.NOJ中可使用回溯法求解的一些经典问题

(1)穷举n位二进制数 (2)穷举所有排列 (3)走迷宫
(4)素数环 (5)迷宫问题 (6)堡垒问题
(7)装载问题 (8)0-1背包(9)三阶幻方
(10)图的m着色问题 (11)求图像周长 (12)农场灌溉问题
(13)字母转换 (14)踩气球

分支限界法

1.基本思想:

每一个结点只有一次机会成为扩展结点。结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

2、分支限界法的一般过程

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树,在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,那些导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。

3.NOJ中可使用分支限界求解的一些经典问题

(1)加1乘2平方 (2)电子老鼠闯迷宫 (3)跳马
(4)独轮车 (5)六数码问题 (6)木乃伊迷宫
(7)推箱子 (8)polygon(9)八数码

动态规划法

1.基本思想与策略

(1)基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
(2)由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。

2.使用条件

(1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
(2)无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

动态规划三要素:
(1)问题的阶段 (2)每个阶段的状态
(3)从前一个阶段转化到后一个阶段之间的递推关系。

递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。

3.NOJ中可使用动态规划求解的一些经典问题

(1)最长公共子序列 (2)防卫导弹 (3)田忌赛马(tian ji racing)
(4)计算矩阵连乘积 (5)石子合并 (6)旅游预算
(7)花生米(二) (8)花生米(三) (9)最大连续子序列和问题
(10)0-1背包问题 (11)装盘子 (12)滑雪

贪心算法

1.贪心算法的基本思路:

建立数学模型来描述问题。 把求解的问题分成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。把子问题的解局部最优解合成原来解问题的一个解。

2.适用的问题

局部最优策略能导致产生全局最优解。

实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

3.NOJ中可使用贪心算法求解的一些经典问题

活动安排

eg.对于0-1背包问题,贪心选择之所以不能得到最优解是因为:它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。

分治&回溯,动规&贪心

分治&回溯

(1)分治与回溯,其实本质上就是递归,只不过它是递归的其中一个细分类。可以认为分治和回溯最后就是一种特殊的递归,或者是较为复杂的递归即可。
(2)分治本质就是一种递归,只不过在它的递归的状态树的时候,对一个问题它要化解成好几个子问题。
(3)回溯法采用试错的思想,它尝试分布的去解决一个问题。在分布解决问题的过程中,当它通过尝试发现有的分布答案不能得到有效的正确的解答的时候,它将取消上一步甚至上几步的计算,再通过其它的可能的分布解答再次尝试寻找问题的答案。

动规&贪心

动态规划以自底向上的方式解决各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的问题。

猜你喜欢

转载自blog.csdn.net/weixin_45619006/article/details/109976432