计算机算法设计与分析(第五版)---王晓冬--------前六章(递归与分治,动态规划,贪心算法,回溯法,)期末复习资料总结

--1--    

算法:解决问题的一种方法或者一个求解过程 是若干指令的序列

  1. 输入
  2. 输出
  3. 有限性
  4. 确定性

程序:用某种设计语言对算法的具体实现 可以不满足 有限性

  • 程序 = 算法+数据结构

果子合并问题(动态规划)、百钱百鸡(限制循环次数,两重循环)、货郎担问题(穷举不行)
算法复杂性:体现在运行该算法所需要的计算机资源的多少

  • 最重要资源:时间、空间
  • 时间复杂性、空间复杂性

影响因素:问题规模、算法输入、算法本身的函数

最差时间复杂度是最有意义的

渐进上界的阶越低 评价越精确 结果更有意义(渐进下阶相反)--讨论的是最终战胜,数学理解

相对低速尽管用渐进的观点来看,可能较慢,但在河里输入的情况下运行的更快--工程直觉,必须在数学理解和工程直觉之间权衡,才能写出好用的程序

最大字段和问题(分治法lmax、rmax、sum=s1+s2)---O(nlogn)
               (动态规划法b[j]=a[j]---b[j-1]<=0//a[j]+b[j-1]---b[j-1]>=0)---O(n)

--2--    

递归函数:用函数自身给出定义的函数

递归算法:直接或间接调用自身的算法

递归分类:基于归纳法的递(边界条件基础步 递归方程归纳步) 基于分治法的递归

归纳法    整数划分
        P(n,m) =1            m=1/n=1
                   =P(n,n)        m>n
                   =P(n,n-1)+1        m=n
                   =P(n,m-1)+P(n-m,m)       1

优点:结构清晰,可读性强,容易用数学归纳法来证明算法的正确性,为设计算法调试程序带来很大的方便    

缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多    

分治法:将难以直接求解的规模为n的问题,或分成k个相互独立且问题相同的子问题,若子问题仍然不够小,则再递归划分下去,直至容易求解为止,将求出的子问题的解自底向上合并即可求出原问题的解
分治法适用条件:

  1. 该问题规模缩小到一定程度就可以解决
  2. 该问题可以分解成若干个规模较小的相同问题--具有最优子结构
  3. 利用该问题分解出的子问题解可以合并为该问题的解
  4. 该问题分解出来的子问题相互独立,子问题之间不包含公共的子问题

    大整数乘法(X*Y=A*C*2^n+((A-B)(D-C)+A*C+B*D)*2^(n/2)+B*D)、棋盘覆盖(Tn=1+4*Tn-1)、合并排序(最坏--平均:O(nlogn);辅助空间O(n);稳定性:稳定)、快速排序(最坏O(n²);平均O(nlogn);辅助空间O(1);稳定性:不稳定)
    在线性时间内找到第k个元素(一次快排比较k和枢轴位置i的大小,判断在左边(left~i的第k个)找还是在右边找(i+1~right的第k-j个,j=i-left+1))
    在线性时间内找到一/二维上的最接近点对问题的证明方法C2-2
    最大字段和问题(第一章已经讲过了)、循环赛日程表

--3--    动态规划法与分治法的区别:动态规划经分解得到的子问题往往不是互相独立的,大量子问题会重复出现,不同子问题的数目常常只有多项式量级,用分治求解的话,将有大量的子问题被重复计算
    动态规划法   保存已经解决的子问题的答案,需要时找出已求得的答案,避免大量重复计算,从而得到多项式时间算法
    DP法适用条件:1)找出最优解的性质,并刻画其结构特征(适用于求解最优化问题)-----证明时应说明-问题的最优解一定包含子问题的最优解,因此具有最优子结构的特征,可以使用动态规划
                2)递归定义求最优解的公式---证明时应该建立递归关系,定义最优值
                3)以自底向上计算最优解---计算最优值
                4)根据计算最优解时得到的信息,构造最优解
    动态规划求最优值的显著特征---最优子结构(原问题的最优解包含子问题的最优解)
    动态规划算法的基本要素:最优子结构性质、重叠子问题性质    
    矩阵连乘问题算法(P*、m**、n、s**)、果子合并问题(m[i][j]=min{m[i][k]+m[k+1][j]+data[i][j]},data[i][j]=a[i]+...+a[j])、最长公共子序列问题(最优子结构性质 Zk与Xm和Yn的最后一个元素判断分别讨论)
    编辑距离(与最长公共子序列类似)、最长递增子序列(bi=max{bk}+1,1<=k<=i-1,a[i]>a[k],b[1]=1)、最大字段和问题、推广的最大M字段和问题

--4--    贪心算法    总是作出在当前看来最好的选择,即贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择,不一定达到全局最优,但是我们希望贪心算法得到的最终结果也是整体最优,虽然贪心算法不是对所有问题都能从局部得到整体的最优解,但是它的应用依然很广,特别是在一些情况下,最优解无法得到时,贪心算法却是能求得最优解的很好近似解
    会场安排问题 每次选择最早结束的活动,给未安排的活动腾出更多时间,贪心算法策略可以确定这个问题的整体最优解
    贪心算的基本要素:最优子结构性质、贪心选择性质(所求问题的整体最优解可以通过一系列局部最优的选择来达到)
    贪心与DP的区别:贪心算法每次选择不依赖将来的所做选择,不依赖子问题的解决,动态规划法通常以自底向上的方式解决子问题,贪心算法通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择九江所求问题简化为规模更小的子问题
    背包问题(选择单位重量价值高的物品装入背包,若将这种物品全部装入背包后未超重,则选择单位重量价值次高的物品装入,要用float来定义重量和价值)可以用贪心算法、0-1背包问题只能用动态规划法
    最优装载问题(新开辟一个数组t,存放重量第i个小的元素在w数组中的下标;w[t[i]]为第i重的物品的重量)、单元最短路径(迪杰斯特拉算法O(n²))、多机调度(最长处理时间的作业优先选择,先对作业处理时间降序排序,每次将作业分给负荷量最小的机器,并改变这台机器的负荷量)

--5--    回溯法是一个既带系统性又带跳跃性的搜索算法,是解决较为复杂穷举问题的一种常用办法
    全排列问题(t=1,a[t]=0 循环:a[t]++;如果a[t]超过最大值,则回溯,否则t==n?输出:t++,a[t]=0;)
    回溯法思想 从开始结点出发,以深度优先搜索的方法向纵深方进行扩展。首先根节点作为第一个活结点,也成为当前的扩展结点。从当前扩展结点开始向纵深方向移至一个新节点,进结点就成为一个新的活结点,并成为当前的扩展结点;当扩展结点不能再向纵深方向移动时,就要回溯到离他最近的活结点处,并且这个活结点成为当前的扩展结点,回溯法以这种工作方式在解空间中进行搜索,直到找到一个解或者解空间中无活结点为止
    解题步骤:1)针对所给问题,定义问题的解空间
        2)确定易于搜索的解空间结构
        3)以深度优先的方式搜索解空间,并在搜索过称重用剪枝函数避免无效搜索
    回溯法搜索解空间树时,避免无效搜索的两种剪枝策略:1)用约束函数剪去不满足条件的子树;2)用限界函数剪去得不到最优解的子树
    0-1背包问题(子集树)、哈密尔顿回路问题(排列数)
    显约束和隐约束、递归回溯框架(子集树、排列树)、装载问题(固定代码C5-1子集树)、批处理作业调度(排列树C5-2)、最大团问题(完全子图--任意两个顶点的边都在子图中;团--完全子图不包含在更大的完全子图中;最大团--顶点数目最多的团;空子图--任意两顶点的边均不在子图中;独立集--空子图不包含在更大的空子图当中;最大独立集--顶点数目最多的独立集-----子集树)
    图的着色(排列树,完全m叉树、每个可扩展结点都有m种选择、约束条件:a[i][j]=1&&x[i]=x[j]剪枝)、婚姻搭配(排列树,二分图--最大匹配)、n皇后问题(排列树;显约束:皇后ij不在同一列,隐约束不在同一斜线上)
    回溯法效率分析:1)产生x[k]的时间;2)满足显约束的x[k]值的个数;3)计算约束函数的时间;4)计算界限函数的时间;5)满足约束函数和界限函数约束的所有x[k]的个数
    好的约束函数能够显著地减少所生成的结点数,但是这样的约束函数往往计算量较大,因此在选择约束函数时通常存在生成结点数和约束函数计算量之间的折衷。
    
--6--    分支限界法也是在问题的解空间上搜索问题解的算法
    用分支限界法解决问题时,首先应该定义问题的解空间,且问题的解空间至少应该包含一个解
        步骤    1)把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内解的值计算一个上界或者下界(称为限界)
            2)在每次分支之后,对界限超出一直可行解的子集不再做进一步分支,从而缩小搜索范围
            3)在此过程中一直进行到找到可行解为止,该可行解的值不大于任何子集的界限
    分支限界法与回溯法的不同:求解目标不同:回溯法是找出满足约束条件的所有解或者一个解;分支限界法是为了找出满足条件的一个解,或者某种意义下的最优解
                      搜索方式不同:回溯法:深度优先;分支限界法:广度优先或最小耗费优先
                      对扩展结点采用的扩展方式不同:分支限界法中每一个活结点只有一次机会称为扩展结点,成为扩展结点之后,一次性产生其所有儿子结点。其中,导致不可行解或导致非最优解的结点会被舍弃,其余结点加入活结点表中,此后从活结点列表中取出下一节点作为当前扩展结点,并重复上述节点扩展过程直至找到一个解或者没有活结点为止
    扩展结点方式不同导致1)队列式分支限界:将活结点组成为一个队列,按照队列先进先出的原则选取下一结点作为扩展结点;2)优先队列式分支限界:将活结点表组织成为一个优先队列,并按队列中规定的优先级选取优先级最高的结点作为当前可扩展结点,一般用于结点相关的数值p表示优先级(最大优先队列:最大堆,体现效益最大;最小优先队列:最小堆,体现费用最小)
    优化策略:1)利用限界函数在搜索过程中,剪枝子树;2)利用优先函数选择同层结点作为扩展结点
    0-1背包问题(最大优先队列式分支限界法--v做优先级)
    搜索路径的构造:对每一个扩展的结点,建立三个信息 该结点的名称、评价函数值、指向其前驱的指针;一旦找到目标,即可逆向构造其路径
    8数码难题(根结点入队,队不空,依据规则r(循环)发展新节点,若与目标棋盘一致则输出,否则判断新棋盘是不是已经产生过的棋盘,若非则进队;出队)、单源最短路径(优先队列分支限界法)


 

你可能感兴趣的:(计算机算法设计与分析(第五版)---王晓冬--------前六章(递归与分治,动态规划,贪心算法,回溯法,)期末复习资料总结)