递归中是将原问题分解为一层层的子问题,与分治相似
递归一般需要定义边界条件,即递归的出口,一般为n=1的时候,当满足边界条件时,立即返回结果;当不满足时,层层递归
1.本身是按照递归的方式来定义的,比如某种函数
2.回朔算法本身可以用递归实现的
3.数据结构,如树、图的遍历
分治法是将问题分解为规模大致相同的子问题,求解子问题,合并子问题的解,最终得原问题的解。
一般都会用到递归算法,典型问题:.二/四分 搜索技术
1.该问题缩小到一定程度就可以很简单的解决
2.分解出的子问题具有相同的特征 前提
3.可以合并为原问题的解, 如果不满足,考虑贪心法和动态规划
4.不包含公共子问题 如果包含,效率会不高
a.常常用于求解最优性质问题; 需要具有最优子结构,即原问题的最优解包含子问题的最优解
b.与分治法一部分相似,都是将问题分解为若干子问题,但子问题不是互相独立的。具有重叠,若单纯的递归,部分子问题会被多次计算
c.结果子问题重叠的方法:用一张表保存被计算过的子问题的解,在需要时取出
1.找出最优解的性质,刻画他的结构特征
2.递归方法定义最优值,写出动态规划的方程
3.以自底向上的方式计算最优值 其中,备忘录方法采用自顶向下法
4.根据计算最优值时得到的信息,构造最优解
最长公共子序列:找出两个序列中的最长公共子序列
0-1背包问题:物品重量w,价值v,背包容量为W,如何选定物品,使背包总价值最大
a.动态规划中,每一步的选择依赖于子问题的解,因此是在解出相关子问题之后再做出选择;自底向上求解子问题; 可回退, 一般用于高维问题
b.贪心算法中。仅在当前算法中做出最好选择,自顶向下,一步步缩小问题规模,可得近似值;每一步都直接影响结果,不可回退,一般用于一维问题
1.构造候选集A,包含问题所有的可能解
2.构造解集S,不断扩大,直到找到最优解
3.检查函数f。检查解集S是否已经是问题的完整解
4.贪心策略select,从候选集A中选择解,通常与目标函数有关
单源最短路径:带权有向图中,求解源到其他各顶点的最短路径长度
最小生成树:无向全通带权图,即一个网络,包含G的所有顶点的树称为生成树,各边权值最小的生成树称为最小生成树。 prim算法、Kruskal算法
a.是一种搜索的一般策略,一般用于遍历,如深度优先搜索
b.需要明确定义一个问题的解空间,确定易于搜索的解空间结构,如一棵怎样的树
c.以深度优先方式搜索,并且使用剪枝函数避免无效搜索
1.用约束函数,在生成扩展结点时就剪去(生成时)
2.限界函数剪去经计算得不到最优解的子树(,搜索时比如部分结点和的费用已经大于当前最优了)
1.树的深度优先搜索
2.旅行商(TSP)问题:有n个城市,商人从某一个城市出发,经过每个城市且只有一次,最后回到出发点,求出最短路径
3.n皇后问题:在n*n的棋盘上,放置n个不可以互相攻击的皇后(不在同一行,同一列,同一斜线),
4.流水作业调度:作业、工序、机器、求时间最短