计算机算法设计与分析课要点总和(应付期末一定要看)

复习理念


书的内容就不必看了,看书后习题(答案可以在微信小程序:答案星找到,绝对正版答案)。书的内容要点总结如下。

内容要点


递归与分治

分治法的设计思路:

将一个难以直接解决的大问题分割成一些规模较小的相同问题(子问题相互独立且与原问题类型相同),以便各个击破,即分而治之。

递归优化分治思路:

使用递归技术,反复应用分治手段,可以使子问题和原问题类型一致而其规模不断缩小,最终使子问题缩小到容易求出其解。

(递归:直接或间接调用自身的算法称为递归算法(递推比递归快且占空间小))

(递归与递推的区别:递归是从后往前,递推是从前往后)

注意:在使用分治法设计算法时,最好使子问题的规模大小相同。

动态规划

基本思想:

将待求解问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。(用一个表来记录已解决的子问题的解,避免重复计算某一子问题)

与分治法的区别:

动态规划法分解成的子问题不是相互独立的,而是相关的,可以由某一子问题的解得到另一子问题的解。而分治法是要求各子问题之间相互独立。

适用:

解最优化问题。

步骤:

  1. 找出最优解的性质,并刻画其结构特征
  2. 递归地定义最优值
  3. 以自底向上的方式计算最优值
  4. 根据计算最优值时得到的信息,构造最优解(如若只需计算最优值,则可省略这一步骤)

基本要素:

用来判断是否选择动态规划算法

  1. 最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质
  2. 重叠子问题:在使用递归算法自顶向下解问题时,如每次产生的子问题并不总是新问题,而是有些子问题被反复计算,则称该问题有重叠子问题性质。

变形:

备忘录方法:

与动态规划方法一样,备忘录方法用表格保存已解决子问题的答案。不同的是,备忘录方法的递归方式是自顶向下的。(未被计算的子问题被在表中标记成特殊值)

注意:若某问题的所有子问题都需求解,则选择动态规划好,若只是部分,则选择备忘录方法好。

贪心算法   

基本思想:

总是作出在当前看来最好的选择,即贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择,不一定达到全局最优,但是我们希望贪心算法得到的最终结果也是整体最优,虽然贪心算法不是对所有问题都能从局部得到整体的最优解,但是它的应用依然很广,特别是在一些情况下,最优解无法得到时,贪心算法却是能求得最优解的很好近似解。

基本要素:

最优子结构性质、贪心选择性质(所求问题的整体最优解可以通过一系列局部最优的选择来达到)

贪心与DP的区别:

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

例子:
背包问题(选择单位重量价值高的物品装入背包,若将这种物品全部装入背包后未超重,则选择单位重量价值次高的物品装入,要用float来定义重量和价值)可以用贪心算法、0-1背包问题只能用动态规划法
最优装载问题(新开辟一个数组t,存放重量第i个小的元素在w数组中的下标;w[t[i]]为第i重的物品的重量)、单元最短路径(迪杰斯特拉算法O(n²))、多机调度(最长处理时间的作业优先选择,先对作业处理时间降序排序,每次将作业分给负荷量最小的机器,并改变这台机器的负荷量)

回溯法

是一个既带系统性又带跳跃性的搜索算法,是解决较为复杂穷举问题的一种常用办法

基本思想:

从开始结点出发,以深度优先搜索的方法向纵深方进行扩展。首先根节点作为第一个活结点,也成为当前的扩展结点。从当前扩展结点开始向纵深方向移至一个新节点,进结点就成为一个新的活结点,并成为当前的扩展结点;当扩展结点不能再向纵深方向移动时,就要回溯到离他最近的活结点处,并且这个活结点成为当前的扩展结点,回溯法以这种工作方式在解空间中进行搜索,直到找到一个解或者解空间中无活结点为止

解题步骤:

  1. 针对所给问题,定义问题的解空间
  2. 确定易于搜索的解空间结构
  3. 以深度优先的方式搜索解空间,并在搜索过称重用剪枝函数避免无效搜索

回溯法搜索解空间树时,避免无效搜索的两种剪枝策略:

  • 用约束函数剪去不满足条件的子树;
  • 用限界函数剪去得不到最优解的子树

效率分析:

1)产生x[k]的时间;2)满足显约束的x[k]值的个数;3)计算约束函数的时间;4)计算界限函数的时间;5)满足约束函数和界限函数约束的所有x[k]的个数  

好的约束函数能够显著地减少所生成的结点数,但是这样的约束函数往往计算量较大,因此在选择约束函数时通常存在生成结点数和约束函数计算量之间的折衷。

例子:

0-1背包问题(子集树)、哈密尔顿回路问题(排列数)、显约束和隐约束、递归回溯框架(子集树、排列树)、装载问题(固定代码C5-1子集树)、批处理作业调度(排列树C5-2)、

最大团问题(完全子图--任意两个顶点的边都在子图中;团--完全子图不包含在更大的完全子图中;最大团--顶点数目最多的团;空子图--任意两顶点的边均不在子图中;独立集--空子图不包含在更大的空子图当中;最大独立集--顶点数目最多的独立集-----子集树)、

图的着色(排列树,完全m叉树、每个可扩展结点都有m种选择、约束条件:a[i][j]=1&&x[i]=x[j]剪枝)、婚姻搭配(排列树,二分图--最大匹配)、n皇后问题(排列树;显约束:皇后ij不在同一列,隐约束不在同一斜线上)、

全排列问题(t=1,a[t]=0 循环:a[t]++;如果a[t]超过最大值,则回溯,否则t==n?输出:t++,a[t]=0;)。
   

分支限界法

也是在问题的解空间上搜索问题解的算法

用分支限界法解决问题时,首先应该定义问题的解空间,且问题的解空间至少应该包含一个解

步骤:

  1. 把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内解的值计算一个上界或者下界(称为限界)
  2. 在每次分支之后,对界限超出一直可行解的子集不再做进一步分支,从而缩小搜索范围
  3. 在此过程中一直进行到找到可行解为止,该可行解的值不大于任何子集的界限

分支限界法与回溯法的不同:

  • 求解目标不同:回溯法是找出满足约束条件的所有解或者一个解;分支限界法是为了找出满足条件的一个解,或者某种意义下的最优解
  • 搜索方式不同:回溯法:深度优先;分支限界法:广度优先或最小耗费优先
  • 对扩展结点采用的扩展方式不同:分支限界法中每一个活结点只有一次机会称为扩展结点,成为扩展结点之后,一次性产生其所有儿子结点。其中,导致不可行解或导致非最优解的结点会被舍弃,其余结点加入活结点表中,此后从活结点列表中取出下一节点作为当前扩展结点,并重复上述节点扩展过程直至找到一个解或者没有活结点为止

扩展结点方式不同导致:

1)队列式分支限界:将活结点组成为一个队列,按照队列先进先出的原则选取下一结点作为扩展结点;

2)优先队列式分支限界:将活结点表组织成为一个优先队列,并按队列中规定的优先级选取优先级最高的结点作为当前可扩展结点,一般用于结点相关的数值p表示优先级(最大优先队列:最大堆,体现效益最大;最小优先队列:最小堆,体现费用最小)
 

优化策略:

1)利用限界函数在搜索过程中,剪枝子树;

2)利用优先函数选择同层结点作为扩展结点

0-1背包问题(最大优先队列式分支限界法--v做优先级)
搜索路径的构造:对每一个扩展的结点,建立三个信息 该结点的名称、评价函数值、指向其前驱的指针;一旦找到目标,即可逆向构造其路径
8数码难题(根结点入队,队不空,依据规则r(循环)发展新节点,若与目标棋盘一致则输出,否则判断新棋盘是不是已经产生过的棋盘,若非则进队;出队)、单源最短路径(优先队列分支限界法)

 

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值