分治法
设计思想:扫描技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解;
关键——依次处理所有元素。
典型问题应用:
1、查找问题
顺序查找,O(n)
串匹配(BF O(n*m) ,KMPO(n+m), BMO(n*m))
2、排序问题
选择排序,O(n2)
冒泡排序,O(n2)
3、组合问题
生成排列对象 ,O(n!)
生成子集 ,O(2n)
0/1背包
任务分配
4、图问题
哈密顿回路,TSP问题
5、几何问题
最近对问题 O(n2),凸包问题 O(n3)
分治法
设计思想:将要求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。如果子问题的规模仍然不够小,则再将每个子问题划分为k个规模更小的子问题,如此分解下去,直到问题规模足够小,很容易求出其解为止,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解。
步骤:(1)划分(2)求解子问题(3)合并
典型问题应用:
归并排序,快速排序,最大子段和,最近对问题,凸包问题,这五种问题的分治算法的时间复杂度为O(nlog2n)
棋盘覆盖,循环赛日程安排为O(4k)
减治法
设计思想:原问题的解只存在于其中一个较小规模的子问题中,所以,只需求解其中一个较小规模的子问题就可以得到原问题的解。
典型问题应用:
折半查找,二叉树查找,堆排序,选择问题,淘汰赛冠军问题,假币问题;
以上问题的时间复杂度,如果减治是每次减小为原来规模的1/2,则时间复杂度一般为O(log2n)
动态规划法
设计思想:
将待求解问题分解成若干个相互重叠的子问题,每个子问题对应决策过程的一个阶段,将子问题的解求解一次并填入表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解而不用再次求解。
步骤:
将原始问题分解为相互重叠的子问题,确定动态规划函数;
求解子问题,填表;
根据表,自底向上计算出原问题的解。
典型问题应用:
TSP,多段图的最短路径问题,0/1背包,最长公共子序列问题,最优二叉查找树,近似串匹配问题;
多段图的最短路径问题: O(n+m)
0/1背包问题: O(n×C)
贪心法
设计思想:
贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出局部最优选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。
贪心法的关键在于决定贪心策略。
典型问题应用:
TSP问题中的两种解决方法:最近领点策略,最短链接策略
最小生成树问题的两种算法:最近顶点策略(Prim算法),最短边策略(Kruskal算法)
背包问题,活动安排问题,多机调度问题,哈夫曼编码。
回溯法
设计思想:
从解空间树根结点出发,按照深度优先策略遍历解空间树,在搜索至树中任一结点时,先判断该结点对应的部分解是否满足约束条件,或者是否超出目标函数 的界,也就是判断该结点是否包含问题的(最优)解,如果肯定不包含,则跳过对以该结点为根的子树的搜索,即所谓剪枝(Pruning);否则,进入以该结 点为根的子树,继续按照深度优先策略搜索。直到搜索到叶子结点,则得到问题的一个可能解。
步骤:
确定解向量和分量的取值范围,构造解空间树;
确定剪枝函数;
对解空间树按深度优先搜索,搜索过程中剪枝;
从所有的可能解中确定最优解。
典型问题应用:
属于组合问题和排列问题中求最优解的问题都可以用回溯法解决,例如:图着色问题,哈密顿回路问题,八皇后问题(4皇后问题),批处理作业调度问题。
分治限界法
设计思想:
1)首先确定一个合理的限界函数,并根据限界函数确定目标函数的界[down,up] ,并确定限界函数;
2)然后按照广度优先策略遍历问题的解空间树,在分支结点上,依次搜索该结点的所有孩子结点,分别估算这些孩子结点的限界函数的可能取值;
3)如果某孩子结点的限界函数可能取得的值超出目标函数的界,则将其丢弃;否则,将其加入待处理结点表(以下简称表PT)中;
4)依次从表PT中选取使限界函数的值是极值的结点成为当前扩展结点;
5)重复上述过程,直到找到搜索到叶子结点,如果叶子结点的限界函数的值是极值,则就是问题的最优解,否则,找到其他极值结点重复扩展搜索。
步骤:
确定解空间树
确定限界函数
按广度优先搜索解空间树,计算限界函数的值,填入PT表
从PT表中寻找极值,继续扩展结点,直到找到限界函数值为极值的叶子结点。
典型问题应用:
TSP问题,多段图的最短路径问题,任务分配问题,批处理作业调度问题,0/1背包问题。
掌握任务分配问题的分支限界法(P195-197),习题9-5
掌握0/1背包问题的分支限界法(P184-185),习题9-6
掌握批处理作业问题的分支限界法(P198-200),习题9-7