一、分治算法
1、步骤:
将原问题划分为若干性质相同、规模较小(规模尽可能均衡)、彼此独立的子问题。
递归或迭代求解子问题。
综合子问题的解为原问题的解。
2、改进分治算法的途径:
减少子问题数量。
增加预处理。
二、回溯算法
1、思想:
回溯算法要有解空间,问题的解空间至少包含问题的一个解,将解空间组成树的形式。
对树进行遍历,搜索整棵树,在访问到当前结点时,要判断当前结点是否包含问题的解,如果肯定不包含就不访问以该结点为根结点的子树,向该结点的双亲结点进行回溯。
回溯算法求问题的所有解时要回溯到根结点,且根结点所有子树都已被搜索到才结束。
回溯算法求一个解时,只要搜索到问题的一个解就可以结束。
问题的解就是一个从根结点到叶子结点的路径。
三、动态规划算法
1、算法思想
动态规划算法与分治算法类似,都是将原问题划分为若干个子问题,再求解子问题,将子问题的解综合为原问题的解。区别在于,适用于动态规划算法的问题划分的子问题往往不是相互独立的。如果用分治算法求解这样的问题,会有重复的子问题出现,这些子问题会被计算,从而耗费大量的时间。动态规划算法会建立一个表用来记录所有已被求解的子问题的答案,在遇到同样的问题时只需要调用记录中的答案即可,这样节省了大量的时间。
动态规划算法的求解过程是一个多阶段决策的过程,每一步处理一个子问题,这一步的求解往往依赖于上一步(子问题)的答案。
2、动态规划算法步骤:
找到问题的最优解的性质,刻画其结构特征。
递归地定义最优值。
以自底向上的方式计算最优值。
用计算最优值时得到的信息,构造原问题的最优解。
3、适用于动态规划算法的问题
适用于动态规划算法的问题要具有两个重要的性质:最优子结构性质和重叠子问题性质。
最优子结构性质:原问题的最优解中包含子问题的最优解。在动态规划算法中,利用这个性质,以自底向上的方式递归地从子问题的最优解逐步构造出原问题的最优解。
子问题重叠性质:在用递归方法自顶向下的求解问题时,每次产生的子问题并不总是新的问题,有些子问题会被重复计算。动态规划算法就是利用这一性质,将子问题的答案记录在表中,当再次遇到此问题时只需要在记录中调用问题的答案即可。
四、贪心算法
1、算法思想
贪心算法通过一系列的选择来得到问题的解。每一步所做的选择都是当前状态下的最优选择。用贪心算法求解的问题一般具有两个性质:贪心选择性质和最优子结构性质。
贪心选择性质:这个性质时贪心算法和动态规划算法的区别。所求问题的整体最优解可以通过一系列局部最优选择来实现。在贪心算法中,仅在当前状态下做出最优选择,即局部最优选择,再去解做出这个选择后产生的相应的子问题。贪心算法所做的贪心选择可以依赖以往所做过的选择,但绝不依赖将来所做的选择,也不依赖子问题的解。动态规划算法通常以自底向上的方式解各子问题,贪心算法则通常以自顶向下的方式进行,以迭代的方法做出相继的贪心选择,每一次贪心选择,就将所求问题简化为规模更小的子问题。
最优子结构性质:原问题的最优解中包含子问题的最优解。