- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
清华大学算法课13
算法与数据结构Algorithms and Data Structures 第十三章 算法分析与设计技术Algorithm Analysis and Design Techniques 13.1 递归算法的分析 13.2 递归式求解 13.3 大递归式的一般解 13.4 分而治之法 13.5 动态规划法 13.6 贪心法 13.7 搜索算法 13.1 递归算法的分析 考虑一个归并排序算法: List mergesort(List L,int n) { if (n==1) return L; break L into 2 halves, L1 and L2, each of length n/2; return merge(mergesort(l1,n/2), mergesort(l2,n/2)); } // 设 T(n)是最坏情况下的时间复杂度。 显然: T(n)=1 if n=1; T(n)=2T(n/2)+cn if n1 我们前面已做过很多递归算法的分析,给出了相应的递归式; 例如: Hanoi塔: T(0)=0 T(n)=2T(n-1)+1 折半查找: T(0)=0; T(1)=1; T(n)=T(n/2)+1; 最复杂的是快速排序。 13.2 递归式求解 有三种方法: (1). 猜一个解f(n),代入递归式,对n归纳证明T(n)=f(n),同时确定F(n)中的不定系数,使对所有的n有T(n)=f(n)。 (2). 展开递归式,直到式子的右边的T(m)均为初试递归式(如T(0), T(1)). (3). 一般求法。 1 猜解: T(n)=1 if n=1; T(n)=2T(n/2)+cn if n1 设T(n)=a.n.logn+b 归纳基础:当 n=1时 b=1 设对所有的kn 有 a.k.logk+b=T(k) 当k=n时: T(n)=2T(n/2)+cn 2. 展开递归式 13.3 大递归式的一般解 考虑递归算法: T(1)=1 把大小为n的问题,分解为a个大小为n/b的子问题, 划分问题和合并子问题的解所做工作量是d(n). 则: T(1)=1 T(n)=aT(n/b)+d(n) d(n)成为驱动函数 对上一个递归式, a=b=2, d(n)=cn 展开递归式: 考虑3种情况下的特解: 若: ad(b) 2. 若: ad(b), 3 若: a=d(b), 例1: T(1)=1 T(n)=4T(n/2)+n T(n)=4T(n/2)+n2 T(n)=4T(n/4)+n3 由于三个式中:a=4, b=2 ,它们的通解都是n2; d(n)=n, 所以d(b)=2, 因a=4d(b) (2) d(n)= n2, 所以d(b)=4, 因a=4=d(b) (3) T(n)=4T(n/4)+n3 d(n)= n3, 所以d(b)=8, 因a=4d(b) 特解是: O(d(n))= n3 以上讨论的是d(n)是n的积的形式,下面考虑非积形式。 例2: T(1)=1 T(n)=3T(n/2)+2n1.5 2n1.5不是n的积的形式,但n1.5是,令U(n)=T(n)/2 U(1)=1/2 U(n)=3U(n/2)+n1.5 如果U(1)=1, 则通解是:nlog3= n1.59 因U(1)=1/2,所以通解是: n1.59 /2 a=3, b=2, d(n)= n1.5 ,d(b)= 21.5=2.82 , ad(b) 所以特解是: n1.59 所以 T(n)=O(n1.59) 例3: T(1)=1 T(n)=2T(n/2)+nlogn 显然通解是 n。 a=b=2, d(n)=nlogn 不是n的积。 特解: 13.4 分而治之法 分而治之就是将大的问题分解小的子问题分别解决,最常用的办法是递归算法。在前面我们已设计了许多递归算法,诸如:Hanoi塔,快速排序,归并排序,二叉树遍历,dfs,等等。 下面在看几个例子,它们比较特殊 例4:两个n位正整数相乘,这两个数很大,大到计算机内部无法表示。 为简化问题,设n是2的幂。 XY=AC10n+(AD+BC)10n/2+BD 算法分析:位乘次数 T(1)=1 T(n)=4T(n/2)+cn T(n)=O(n2) 改进: XY=AC10n+[
文档评论(0)