计算机设计与分析复习.pdf
学术菌 QQ363961023 1 计算机计算机算法算法设计与分析设计与分析复习复习 算法:由若干条指令指令组成的有穷序列有穷序列 性质:性质:输入(零个或多个输入)、输出(至少有一个输出)、确定性(语义清晰无歧义)、有限性(每条指令的执行次数是有限的)程序:算法用程序设计语言的具体实现 算法的复杂性:算法复杂性的高低体现在运行该算法所需要的计算机资源的多少上 选用算法时遵循的重要准则:复杂性最低者 算法的复杂性:(1)有上界时,f(N)=O(g(N)(2)有下界时,f(N)=(g(N)(3)同阶时,f(N)=(g(N)递归算法:直接或间接调用自身的算法 分治方法的设计思想:将一个难以直接解决的大问题,分割成一些较小规模的问题,以便各个击破,分而治之。阶乘:Int jiecheng(int n)if(n=0)return 1;Return n*jiecheng(n-1);Fibonacci 数列:Int Fibonacci(int n)if(n=1)return 1;Return Fibonacci(n-1)+Fibonacci(n-2);整数划分:Int q(int n,int m)if(n1)|(m1)return 0;If(n=1)|(m=1)return 1;If(n0)hanoi(n-1,a,c,b);Move(a,b);Hanoi(n-1,c,b,a);QQ374289236学术菌 QQ363961023 2 二分搜索算法分析:将 n 个元素分成大致相同的两半,将 an/2与 x 比较,若大于则在左半部分继续搜索,若小于则在右半部分搜索,若相等就结束。算法设计:Int binarySearch(int n,int x,int a)int left=0,right=n-1;Middle=(left+right)/2;While(leftamiddle)left=middle+1;Else right=middle-1;Retrun-1;棋盘覆盖:合并排序算法分析:将待排序的元素分成大致相等的两个集合,分别对两个子集合进行排序,最后将排好序的子集合合并成所要求的排好序的集合。算法设计:Void mergeSort(int a,int left,int right)if(leftright)Int middle=(left+right)/2;mergeSort(a,left,middle);mergeSort(a,middle+1,right);merge(a,b,left,middle,right);copy(a,b,left,right);Merge(int a,int b,int l,int m,int r)int i=l,j=m+1,k=l;While(i=m)&(j=r)If(cim)For(int q=j,q=r;q+)dk+=cq;else for(int q=i;q=m;q+)dk+=cq;动态规划算法的基本要素:1.最优子结构性质:原问题的最优解包含着子问题的最优解的性质 2.重叠子问题性质 设计动态规划算法的步骤:(1)找出最优解的性质,并分析其结构(2)递归定义最优值 QQ374289236学术菌 QQ363961023 3 (3)自底向上计算最优值(4)根据最优值的信息构造最优解 设计思想:将待求解的问题分解成若干个子问题,先求子问题,再通过这些子问题的解得到原问题的解。动态规划与分治的不同:适合于用前者求解的问题,经过分解得到的子问题往往不是相互独立的。矩阵连乘问题:(1)分析最优解的结构 计算 A1:n的最优计算次序,设在矩阵 Ak 和 A k+1 之间断开(1kn),则其完全加括号方式为(A1Ak)(Ak+1An)),依此次序计算。(2)建立递归:Mij=0 i=j minmik+mk+1j+pi-1pkpj ikj(3)计算最优解 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;i+)int j=i+r-1;Mij=mi+1j+pi-1*pi*pj;Sij=i;For(int k=i+1;kj;k+)int t=mik+mk+1j+pi-1pkpj;If(tmij)mij=t;sij=k;(4)构造最优解 Void traceback(int i,int j,int*s)if(i=j)return;Traceback(i,sij,s);Traceback(sij+1,j,s);Cout Aisij;Cout Asij+1j;最长公共子序列:(1)分析最长公共子序列的结构 (1)若 Xm=Yn,,则 Zk=Xm=Yn,且 Zk-1 是 Xm-1 和 Yn-1 的最长公共子序列 (2)若 XmYn,且 ZkXm,则 Z 是 Xm-1 和 Y 的最长公共子序列 (3)若 XmYn,且 ZkYn,则 Z 是 Xm 和 Yn-1 的最长公共子序列 QQ374289236学术菌 QQ363961023 4 (2)递归结构 (3)计算最优值 Void LCSLength(int m,int n,int*b,charX,char Y,int*c)int i,j;For(i=1;i=m;i+)ci0=0;For(j=1;j=n;j+)c0j=0;For(i=1;i=m;i+)For(j=1;j=cij-1)cij=ci-1j;bij=2;Else cij=cij-1;bij=3;(4)构造最优解 Void LCS(int i,int j,int*b)if(i=0|j=0)return;If(bij=1)LCS(i-1,j-1,b);print(xi);Else If(bij=2)LCS(i-1;j;b);Else LCS(I,j-1,b);最大字段和 (1)简单算法:QQ374289236学术菌 QQ363961023 5 (看不清书上有)(2)分治算法:(3)动态规划算法:Int Maxsun(int m,int*a)int i,sum=0,b=0;QQ374289236学术菌 QQ363961023 6 For(i=1;i0)b+=ai;Else b=ai;If(bsum)sum=b;Return sum;最优三角剖分:与矩阵连乘类似(略)算法如下:Void Knapsack(type v,int w,int c,int n,type*m)int jMax=minwn-1,c;For(j=0;j=jMax;j+)mnj=0;For(j=wn;j1;i-)jmax=minwi-1,c;For(int j=0;j=jMax;j+)mij=mi+1j;For(int j=wi;j=w1)m1c=max(m1c,m2c-w1+v1);Void tracback(type*m,int n,int x,int w,int c)for(int i=1;in,i+)If(mic=mi+1c)xi=0;Else Xi=1;c-=wi;Xn=(mnc)?1:0;书上 80 页还有一个改进的算法 贪心算法:总是作出在当前情况下最好的选择 QQ374289236学术菌 QQ363961023 7 基本要素:(1)最优子结构性质(2)贪心选择性质(整体最优解可以通过贪心选择来达成)活动安排问题:使尽可能多的活动能兼容使用公共资源 Void greedySelector(int n,int s,int f,bool A)int j=1;A1=true;for(int i=2;i=fj)Ai=true;k=i;else Ai=false;(算法的前提是输入的活动是按结束时间非递减序排列的)贪心算法与动态规划的差异:0-1 背包问题(见上面)背包问题(在选择物品装入是可以选择物品的一部分,而不一定要全部装入)Void Knapsack(int n,float m,float w,float v,int x)int i;Float c=m;Sort(n,v,w);/将物品以单位重量的价值按非递减排序 For(i=1;i=n;i+)xi=0;For(i=1;ic)break;Else xi=1;c-=wi If(i=n)xi=c/wi;/如果剩下的空间不足以装下接下来的那个物品时,只装一部分 最优装载:QQ374289236学术菌 QQ363961023 8 算法设计:Void Loading(int n,type w,type c,int x)int*t=new intn+1;Sort(n,t,w);/将集装箱按重量升序排列放于数组 t 中 For(int i=1;i=n,i+)xi=0;For(int i=1;i=n&wti=c;i+)xi=1;c-=wti;哈弗曼编码:首先用字符集中每一个字符的频率初始化优先队列 Q,然后不断地从优先队列 Q 中取出具有最小频率的两棵树合并,将它们的频率和最为合并树的频率,并将新生成的树插入优先队列 Q 中,经过 n-1 次合并后得到的最后一颗树就是要求的树 T。基本思想:设置顶点集合 S 并不断地做贪心选择来扩充这个集合。初始时,S 中只有源,u是 G 中的一个顶点,每次从 S-V 中找出具有最短特殊路长的顶点 u,将 u 添加到 S 中,同时用一个数组 dist 记录当前每个顶点所对应最短特殊路径长度,一旦 S 中包含了所以 V 中顶点,dist 就记录了从源到所有其他顶点之间的最短路径长度。Void Dijkstra(int n,int v,type dist,int prev,type*c)bool smaxint;For(int i=1;i=n;i+)disti=cvi;Si=false;If(disti=maxint)previ=0;/i 点与源点不直接相连 Else previ=v;Distv=0;sv=true;For(int i=1;in;i+)/总共应进行 n-1 步 v-s 寻找 int temp=maxint;Int u=v;QQ374289236学术菌 QQ363961023 9 For(int j=1;j=n;j+)If(!si)&(distitemp)u=j;temp=disti;Su=true;/将最短长度的点加入 S 集合 For(int j=1;j=n;j+)If(!si)&(cujmaxint)type newdist=distu+cuj;If(newdistn)output(x);Else For(int i=f(n,t);i0)if(f(n,t)=g(n,t)For(int i=f(n,t);i=g(n,t);i+)xt=h(i);if(constraint(t)&bound(t)if(solution(t)output(x);Else t+;QQ374289236学术菌 QQ363961023 10 Else t-;子集树与排列树 子集树重在找出满足某种性质的子集,排列树重在确定 n 个元素满足某种性质的排列 装载问题:QQ374289236学术菌 QQ363961023 11 Template QQ374289236学术菌 QQ363961023 12 具体分析见课本 147-148 批处理作业调度:批处理作业调度问题的解空间是一颗排列树,按照回溯法搜索排列树的算法框架,设计算法。回溯算法可描述如下:Class Flowshop QQ374289236学术菌 QQ363961023 13 符号三角形问题:2 个同号下面都是+号,2 个异号下面都是-号 QQ374289236学术菌 QQ363961023 14 见 152 QQ374289236学术菌 QQ363961023 15 计算时间为 O(n2n)N 后问题:,在同一行或同一列就好判断 QQ374289236学术菌 QQ363961023 16 有关迭代回溯可见课本 156 0-1 背包问题:QQ374289236学术菌 QQ363961023 17 QQ374289236学术菌 QQ363961023 18 QQ374289236学术菌 QQ363961023 19 分支限界法:在扩展结点处,先生成其所以儿子结点,并在每一个活结点处计算一个限界,根据这个限界,然后再从当前的活结点表中选择一个最有利的结点作为下一个扩展结点的算法,回溯法的求解目标:找出解空间中满足约束条件的所有解 分支限界法目标:找出满足约束条件的一个解,或在某种意义下的最优解。分支限界法以广度优先方式或以最小耗费优先方式搜索解空间 非常抱歉时间有限,没能来得及弄完,希望对你有用!QQ374289236如果你还不知道读什么书,或者想寻找下载阅读更多书籍,就请您打开微信扫一扫,扫描下方二维码,关注微信公众号:大学生学术墙。微信直接搜索关注公众号:大学生学术墙这里是每一位上进的人的家园【大学生学术墙】资料库里有数百万本书籍,此外,关注微信公众号:大学生学术墙,并在后台回复:1.回复:资料,即可免费领取100000G的书籍库、大学必备笔记期末试卷、考证资料、四六级考试、计算机二级考试等资料!2.回复:电影,即可免费在线观看最新上线的热门大片!3.回复:小说,即可免费领取数百万本著名小说!4.回复:证券、期货,即可免费在行业龙头企业用超低手续费开户,开启你的投资生涯!你需要的书籍、课件、视频、PPT、简历模板等等一切资源和资料,都可以在微信公众号:大学生学术墙,回复关键词免费领取!微信小程序:鼠友。国内首个大学生在线交流社区,既可以看外校新鲜事,又可以和本校同学沟通交流,实时发布信息,这是鼠于大学生们的友谊树洞如果您对金融领域一知半解,想学习金融领域相关知识,提高自身综合投资水平,获取相关金融服务,请关注微信公众号:财醒来微信直接搜索关注微信公众号:财醒来,您可以获得以下服务:1.私人财富管理咨询服务,您通过公众号添加号主个人微信后,可结合自身情况咨询财富管理服务等。2.公众号会分享原创的宏观、股票、期货等二级市场复盘和投资参考,助力您发现投资机会。3.公众号不定期会分享号主自己的投资心得,投资策略等,带给您不一样的金融评论和金融思维。4.公众号后台回复:证券、期货,即可免费在行业龙头企业用超低手续费开户,开启你的投资生涯!重磅福利:头部券商,万 1.1 开户无论是买股票、基金还是期货,交易成本都是我们不可忽视的重要元素。如果你自己去应用市场下载 XX 证券、XX 期货或者在同花顺开户,交易佣金一般默认为较高的万 2.5 或万 3 且没有客服服务。现在,如果你从我们这边的专属渠道二维码开股票账户,可以享受到万 1.1 的开户优惠,并且有专属客服服务!对于大部分人来说,每年至少可以省出一部苹果最新款手机的钱了,下面简单介绍一下该券商:【AA 类券商,全国前五大券商,安全可靠】【步骤简单,无需排队,全国都能开户,没有时间和地域的限制】【营业部遍布全国,业务可以异地办理】如何开户并享受最低佣金优惠?搜索微信 ID:daxueshengqiang 或扫描下方二维码,添加客服微信并备注:开户,客服会辅助你开户!记 住 了,只 有 从 上 面 二 维 码 首 次 开 户 注 册 的,才 可以 享 受 最 低 佣 金 优 惠!开 户 后 客 服 会 主 动 联 系 您 进 行 佣金 调 整。如 果 你 自 个 儿 去 应 用 市 场 下 载 注 册,就 无 法 享 受 到这 边 的 专 属 渠 道 福 利 了。同 时,我 强 烈 推 荐 你 开 一 个 期 货 账 户!期 货 账 户 最大 的 好 处 是,既 可 以 做 空 又 可 以 做 多!与 股 票 账 户 相 同,如果你从我们这边的专属渠道二维码开期货账户,也可以享受到超低手续费的开户优惠,并且有专属客服服务!下面简单介绍一下:【AA 类期货公司,全国前五大期货公司,安全可靠】【步骤简单,手机快速开户,足不出户即可开通】【营业部遍布全国,业务可以异地办理】【超低手续费的开户优惠】【一对一专属客服服务】如何开户并享受最低佣金优惠?搜索微信 ID:daxueshengqiang 或扫描下方二维码,添加客服微信并备注:开户,客服会辅助你开户!