算法设计和分析复习.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
 PAGE 8/ NUMPAGES 8 算法概述 算法是若干指令的有穷序列,满足性质: (1)输入(2)输出 (3)确定性 (4)有限性。 算法复杂性分析主要包括空间复杂性和时间复杂性。 算法复杂性分析 (1)渐近上界记号O O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n3 n0有:0 £ f(n) £ cg(n) } (2)渐近下界记号W W (g(n)) = { f(n) | 存在正常数c和n0使得对所有n3 n0有:0£ cg(n) £ f(n) } (3)紧渐近界记号Q Q (g(n)) = { f(n) | 存在正常数c1,c2和n0使得对所有n3 n0有:c1g(n) £ f(n) £ c2g(n) } 定理1: Q (g(n)) = O (g(n)) ? W (g(n)) 最常见的多项式时间算法的渐近时间复杂度 O(1)<O(log n)<O(n)<O(nlog n)<O(n2)<O(n3) 最常见的指数时间算法的渐近时间复杂度 O(2n)<O(n!)<O(nn) 通用分治递推式 大小为n的原问题分成若干个大小为n/b的子问题,其中a个子问题需要求解,而cnk是合并各个子问题的解需要的工作量。 NP完全性理论 P是所有可在多项式时间内用确定算法求解的判定问题的集合。 NP是所有可在多项式时间内用不确定算法求解的判定问题的集合。 (NP难度)对于问题Q以及任意问题Q1?NP,都有Q1∝Q,则Q是NP难度(NP hard)的。 其中∝表示约化,Q1∝Q,表示Q1可以在多项式时间转化为问题Q,从而可通过调用问题Q的算法求解。 (NP完全)对于问题Q?NP,Q是NP难度的,则称Q是NPC(NP complete)的。 P NP NPC的关系 第2章 递归与分治策略 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 2.2 分治法的基本思想 divide-and-conquer(P) { if ( | P | = n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 } 在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。 分治法所能解决的问题一般具有以下几个特征: (1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 2.4 大整数的乘法 X = a2n/2 + b Y = c2n/2 + d 1. XY = ac2n + (ad+bc) 2n/2 + bd (O(n2)) 2. XY = ac2n + ((a-c)(b-d)+ac+bd) 2n/2 + bd T(n)=O(nlog3) 2.8 快速排序 基本思想: templateclass Type void QuickSort (Type a[], int p, int r) { if (pr) { int q=Partition(a,p,r); QuickSort (a,p,q-1); //对左半段排序 QuickSort (a,q+1,r); //对右半段排序 } } 掌握Partition(a,p,r)方法。 平均情况复杂性O(nlogn) 2.9 线性时间选择 templateclass Type Type RandomizedSelect(Type a[],int p,int r,int k) { if (p==r) return a[p]; int i=RandomizedPartition(a,p,r), j=i-p+1; if (k=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); } 在最坏情况下,算法randomizedSelect需要O(n2)计算时间。但算法ra

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档