算法期末复习-仅供参考.doc
《算法期末复习-仅供参考.doc》由会员分享,可在线阅读,更多相关《算法期末复习-仅供参考.doc(10页珍藏版)》请在沃文网上搜索。
1、1. 算法基础算法复杂度的度量1) 改进算法和提高计算机处理能力对算法速度的影响(课堂上讲过相关提高算法效率的实例)2) 渐进意义下,算法的复杂度的同阶度量:的定义,以及的运算性质证明。3) 给出一个表达式,证明是的上界下面的讨论中,对所有n,f(n) 0,g(n) 0。渐近上界记号OO(g(n)= f(n) | 存在正常数c和n0使得对所有n n0有:0 f(n) cg(n) 渐近下界记号W W (g(n)= f(n) | 存在正常数c和n0使得对所有n n0有:0 cg(n) f(n) 非紧上界记号o o(g(n)= f(n) | 对于任何正常数c0,存在正数n0 0使得对所有n n0有:
2、0 f(n)0,存在正数n0 0使得对所有n n0有:0 cg(n) f(n) 等价于 f(n) / g(n) ,as n。f(n) w (g(n) g(n) o (f(n) 紧渐近界记号Q Q (g(n) = f(n) | 存在正常数c1, c2和n0使得对所有n n0有:c1g(n) f(n) c2g(n) 2. 递归与分治策略分治法的设计思想、递归的实质、排列问题、整数划分问题、二分搜索、大数乘法、strassen矩阵乘、棋盘覆盖、合并排序、快速排序、线性时间选择(寻找中位数)、最近点对问题、循环赛日程安排问题。例:分析二分搜索的时间复杂性,改写二分搜索算法使得搜索元素x不在数组中时,返
3、回小于x的最大元素位置i和大于x的最小元素位置j。如搜索元素在数组中,i和j相同,均为x在数组中的位置。分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。如果问题可分割成k个子问题,且这些子问题都可解,利用这些子问题可解出原问题的解,此分治法是可行的。由分治法产生的子问题往往是原问题的较少模式,为递归提供了方便。例如:快速排序:templateint Partition (Type a, int p, int r) int i = p, j = r + 1; Type x=ap; / 将 x的元素交换到右边区域 while (true) wh
4、ile (a+i x); if (i = j) break; Swap(ai, aj); ap = aj; aj = x; return j;3. 动态规划矩阵连乘问题、系列赛、最长公共子序列、最大子段和、凸多边形最优三角剖分、图像压缩、电路布线、0-1背包问题。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题与分治区别:经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次用分治法求解,子问题的数目常有多项式量级,有些子问题被重复计算了多次,如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,
5、就可以避免大量重复计算,从而得到多项式时间算法。动态规划即是用一个表来记录所有已解决的子问题。 动态规划算法常用于求解具有某种最优性质的问题。可能会有多个解,每个解都对应于一个值,希望找到最优解。例如:矩阵连乘问题void matrixmultiply(int *a, int *b, int *c, int ra, int ca, int rb, int cb)if (ca!=rb) error(“不可乘!”);for (int i=0; ira; i+)for (int j=0; jcb; j+)int sum=ai0*b0j;for (int k=1; kca; k+) sum+=aik*
6、bkj; cij=sum; 三重循环中总共需要pqr次数乘。 16000特征:计算Ai:j的最优次序所包含的计算矩阵子链 Ai:k和Ak+1:j的次序也是最优的。矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。 用动态规划法求最优解:void MatrixChain(int *p,int n,int *m,int *s) for (int i = 1; i = n; i+) mii = 0; for (int r = 2; r = n; r+) for (int i = 1; i = n - r+1;
7、i+) int j=i+r-1; mij = mi+1j+ pi-1*pi*pj; sij = i; for (int k = i+1; k j; k+) / int t = mik + mk+1j + pi-1*pk*pj; if (t mij) mij = t; sij = k; 算法复杂度分析:算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。利用递归直接计算Ai,j的递归算法RecurMatrixChain:int RecurMatr
8、ixChain(int i,int j) if (i=j) return 0; int u=RecurMatrixChain(i,i)+RecurMatrixChain(i+1,j)*pi-1*pi*pj; sij=i; for (int k = i+1; k j; k+) int t=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j)*pi-1*pk*pj; if (t 2n时,算法需要(n2n)计算时间。 由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的i(1in),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳跃点是这一类函数的描
9、述特征。在一般情况下,函数m(i,j)由其全部跳跃点唯一确定。如图所示。对每一个确定的i(1in) ,用一个表pi存储函数m(i, i)的全部跳跃点。表pi可依计算m(i,j)的递归式递归地由表pi+1计算,初始时pn+1=(0,0)。 实例:4. 贪心法原理和设计思想、TSP问题、图着色问题、最小生成树问题(最近顶点策略-Prim算法、最短边策略-Krushal算法)、背包问题(有别于0-1背包,可以找到最优解)、活动安排问题、多机调度问题。例:三个顾客需要的服务时间分别是、,求解顾客的服务顺序, ,证明使用贪心法可以获得最优解。例:最小生成树的生成步骤。顾名思义,贪心算法总是作出在当前看来
10、最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。 最小生成树问题-Prim算法 Krushal算法:使生成树以一种随意的方式生长,先让树随意生长,每长一次将两棵树合并直到成一棵树。 背包问题中的贪心法选择价值最大的物品,但虽然背包总价上升很快,背包容量也消耗太快,不能保证目标函数最大;选择最轻的物品,装尽可能多的物品,虽然容量消耗慢,但背包价值没法保证迅速上升;最后一种策略选择单位重量价值最大的物品如果其重量小于背包容量,就可以把它装入,并将容量减去该物品的重量,然后,转化为一个规模变小的背包问题。 背包问题具有最优子结构性质。贪心算法和动态规划算
11、法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是,对于具有最优子结构的问题应该选用贪心算法还是动态规划算法求解?是否能用动态规划算法求解的问题也能用贪心算法求解?下面研究2个经典的组合优化问题,并以此说明贪心算法与动态规划算法的主要差别。依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。具体算法可描述如下: void Knapsack(int n,float M,float v,float w,float x) Sort(n
12、,v,w); int i; for (i=1;i=n;i+) xi=0; float c=M; for (i=1;ic) break; xi=1; c-=wi; if (i=n) xi=c/wi;n 0/1背包常用动态规划法求解。 对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征。实际上也是如此,动态规划算法的确可以有效地解
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 期末 复习 仅供参考