当前位置:文档之家› 算法设计与分析复习要点

算法设计与分析复习要点

·算法是指解决问题的方法和过程。

算法是由若干条指令组成的有穷序列。

·算法特性:输入、输出、确定性、有限性(执行时间和执行次数)(有五个空再加上可行性)。

·程序是算法用某种程序设计语言的具体实现,程序可不满足有限性的特性。

·程序调试只能证明程序有错,不能证明程序无错误!
·算法复杂性= 算法所需要的计算机资源。

·算法的复杂性取决于:(1)求解问题的规模N;(2)具体的输入数据I;(3)算法本身的设计A。

·可操作性最好且最有实际价值的是最坏情况下的时间复杂性。

第二章递归与分治策略
二分搜索技术:O(logn)大整数乘法:O(n log3)=O(n1.59)Strassen矩阵乘法:O(n log7)=O(n2.81) 棋盘覆盖:O(4k)合并排序和快排:O(nlogn)线性时间选择:O(n)
最接近点对问题:O(nlogn) 循环赛日程表:O(n2)
·分治法思想:将一个难以解决的问题分割成一些规模较小的相同问题,以便逐个击破,分而治之。

边界条件与递归方程是递归函数的两大要素。

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

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

·分治法时间复杂度分析:T(n)<= O(1) n=n0
aT(n/b)+f(n) n>n0
若递归方式为减法:T(n) = O(a n)
若递归方式为除法:
f(n)为合并为原问题的开销:f(n)为常数c时:T(n)=O(n p)
f(n)为线性函数:O(n) a<b
a是子问题个数,b是递减的步长T(n)= O(nlog b n) a=b
O(n p) a>b,p=log b a
f(n)为幂函数n x时:O(n x) a<f(b)
T(n)= O(n p log b n) a=f(b)
O(n p) a>f(b),p=log b a
·证明算法的正确性:部分正确性、终止性。

第三章:动态规划
·当前决策的最优性取决于其后续决策序列的是否最优。

动态规划方法可以保证问题求解是全局最优的。

★·动态规划与贪心算法的比较:
相同点:
都具有最优子结构性质。

不同点:
贪心算法具有贪心选择性质;动态规划算法具有子问题重叠性质,子问题空间小;
动态规划算法通常以自底向上的方式解各子问题;贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

`动态规划通常可以按以下几个步骤进行:
(1)找出最优解的性质,并刻画其结构特征;
(2)递归地定义最优值;
(3)以自底向上的方式计算出各子结构的最优值并添入表格中保存;
(4)根据计算最优值时得到的信息,构造最优解。

步骤1~3是动态规划算法的基本步骤。

若需要最优解,则必须执行第4步,为此还需要在第3步中记录构造最优解所必需的信息。

第四章:贪心算法(最优子结构、贪心选择性质)
·特点:贪心算法每次选择目前最优的解,即通过一系列局部最优来获得整体最优。

贪心算法只有在具有贪心选择性质时才能保证获得整体最优。

Prim算法(O(n2)):在连通的情况下选择权值较小的边。

Kruskal算法(O(nlogn)):在无回路情况下选择权值较小的边。

旅行商问题的贪心算法:
基本思想:首先设置一个集合Path和当前节点v,然后不断地用贪心选择来扩充这个集合,直至Path包含所有V中顶点。

贪心选择:如果V–Path中的顶点j是与当前节点v相邻接的顶点中边权最小的,于是就选择j(将j加入Path),并将j作为新的当前节点。

初始化:Path中仅含有源v。

活动安排问题:
1、最早开始时间:可以增大资源的利用率。

2、最早结束时间(更合理):可以使下一个活动尽早开始。

最优装载问题:
基本思想:每次采用重量最轻者优先装入的贪心选择策略。

贪心算法只有在具有贪心选择性质时才能保证获得整体最优。

第五章:回溯法(可递归实现也可以迭代实现)
思想:回溯法从根结点出发,按照深度优先策略搜索(遍历)解空间树,搜索满足约束条件的解。

初始时,根结点成为一个活结点,同时也称为当前的扩展结点。

在当前扩展结点处,搜索向纵深方向移至一个新结点。

这个新结点成为一个新的活结点,并成为当前的扩展结点。

如果在当前的扩展结点处不能再向纵深方向移动,则当前的扩展结点就成为一个死结点(即不再是一个活节点)。

此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。

解题步骤:
1、针对所给问题,定义问题的解空间;
2、确定易于搜索的解空间结构;
3、以深度优先方式搜索解空间,并在搜索过程中用剪枝函数(1、用约束函数在扩展结点处剪去不满足约束的子树;2、用限界函数剪去得不到最优解的子树)避免无效搜索。

子集树:O(2n) 2n个叶子结点2n+1-1个结点。

排列树:O(n!)n!个叶子结点。

第六章:分支限界法
思想:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。

这个过程一直持续到找到所需的解或活结点表为空时为止。

分类:
·队列式(FIFO)分支限界法:将活结点表组织成一个队列,按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

·优先队列式分支限界法:将活结点表组织成一个优先队列,按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

最大优先队列:使用最大堆,体现最大效益优先
最小优先队列:使用最小堆,体现最小费用优先
★·分支限界法与回溯法的异同:
·同:都是在问题的解空间上搜索问题解的算法。

·异:回溯法的求解目标是找出解空间中满足越苏条件的所有解,回溯法以深度优先的方式搜索解空间。

分支限界法是找出满足约束条件的一个解,在某种意义下的最优解,是以广度优先或最小耗费优先的方式搜索解空间。

回溯法只通过约束条件剪去非可行解,而分支限界法不仅通过约束条件,而且通过目标函数的限界来减少无效搜索。

第七章:随机化算法
随机化算法的分类:
数值随机化算法:主要用于数值问题求解,算法的输出往往是近似解,近似解的精确度与算法执行时间成正比。

蒙特卡罗算法:主要用于求解需要准确解的问题,算法可能给出错误解,获得精确解概率与
算法执行时间成正比。

拉斯维加斯算法:一旦找到一个解, 该解一定是正确的,找到解的概率与算法执行时间成正比。

舍伍德算法:一定能够求得一个正确解,确定算法的最坏与平均复杂性差别大时, 加入随机性, 即得到Sherwood算法.
伪随机数:线形同余算法
设MC(x)是一个一致的(1/2+ε)正确的蒙特卡罗算法,重复n次调用算法MC(x)得到正确解的概率至少为1-δ。

第八章:KMP算法的时间复杂度为O(n+m)。

Next(j)的计算:初始化:k=0;j=1;next(j)=0;
后续:if(k==0||p[k]==p[j]){++k;++j;next(j)=k;}
else k=next(k);
NP与P问题:P是确定性计算模型下的易解问题类;NP是非确定性计算模型下易验证问题类。

对于问题Q,若满足Q∈NP且是NP困难的,则Q是NP完全的(NPC) NPC∈NP. P是NP的子集(是否为真子集学术界暂不确定)。

O(1) k=0
补充:棋盘覆盖T(n)= 4T(k-1)+O(1) k>0 推出 T(k)=O(4k)。

相关主题