分治法:将规模为n的问题分解为k个规模较小的问题,子问题互相独立且与原问题相同
分治法将分解后的子问题看成相互独立的,通过用递归来做。
步骤:
分解:原问题分解为若干规模小,相互独立,与原问题相同的子问题
解决:子问题规模小容易被解决直接解决,否则递归的解决各子问题
合并:将子问题的解合并成原问题的解
动态规划:原问题分解为相对简单的子问题的方式求解复杂问题,
适用:有重叠问题和最优子结构特征的问题;
步骤: 找出最优解的性质
刻画结构特征
地柜定义最优解的值
自底向上的方式求最优
最优子结构:问题的最优解包含了子问题的最优解时;
重叠子问题:产生的子问题不总是新问题,有些子问题被反复利用;动态规划:对子问题只解一次并保存,以后可以直接利用子问题;
常见问题:
0-1背包:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
最长公共子序列:
可以不连续的:
连续的:
动态规划将分解后的子问题理解为相互间有联系,有重叠部分,需要记忆,通常用迭代来做。
贪心算法:不从整体最优考虑,选择局部最优;
基本要素: 贪心选择性质:求问题的整体最优是通过一系列的局部最优选择
最优子结构
回溯法:将问题的解空间转化为图或树的结构表示,使用深度预先搜索策略进行遍历,遍历过程中记录和寻找多有可行解或最优解;
步骤:针对所给问题定义解空间(解空间至少包含一个最优解)->确定易于搜索的解空间结构->以深度优先的方式搜索解空间;
常用算法框架:子集树->排列树
回溯法常用算法框架:递归回溯(子集树),迭代回溯(排列树)
应用:最大团问题
分支限界法:
常用算法框架:队列式分支限界,优先队列式分支限界
回溯与分支限界的差异
两者都是在解空间树上搜索问题解的算法;常用数据结构:前者堆栈,后者队列
回溯:按深度优先策略,从根节点开始至某一结点时判断是否包含问题的解,不包含跳过对其子树的判断,向其祖先结点回溯,当回溯到根时所有子树都搜索遍时即为搜索了所有的解;
分支限界:按广度优先或者最小消耗优先,求解目标为满足约束条件的一个解,或在满足约束条件的解中找到使得目标函数值达到最大最小,即为最优解;
搜索策略:在扩展处,先生成所有儿子结点(分支),当前活结点表中选择下一扩展结点(为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。
每一个活结点只有一次成为扩展结点的机会,产生所有儿子结点,不可行或非最优的儿子结点被抛弃,其余的存入活结点表中,继续从活结点表中选取下一个活结点为扩展结点,重复至求出所有解或活结点表为空