网站大量收购独家精品文档,联系QQ:2885784924

02递归与分治策略.pptVIP

  1. 1、本文档共78页,可阅读全部内容。
  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文档。上传文档
查看更多
2.5 Strassen矩阵乘法 复杂度分析 设M(n)为计算两个n阶方阵相乘执行的乘法的次数(其中n是2的乘方),有如下递推关系 M(1)=1 M(n)=7M(n/2) 因为n=2k M(2k) =7M(2k-1)=72M(2k-2)=… =7iM(2k-i)…=7kM(2k-k)=7k 因为k=log2n, 所以M(n)=7log2n=nlog27≈n2.807 O(n2.807) O(n3),较大的改进。 2.5 Strassen矩阵乘法 更快的算法 Hopcroft和Kerr已经证明(1971),计算2个2×2矩阵的乘积,7次乘法是必要的。因此,要想进一步改进矩阵乘法的时间复杂性,就不能再基于计算2×2矩阵的7次乘法这样的方法了。或许应当研究3×3或5×5矩阵的更好算法。 在Strassen之后又有许多算法改进了矩阵乘法的计算时间复杂性。 目前最好的计算时间上界是 O(n2.376) 是否能找到O(n2)的算法?目前为止还没有结果。 2.7 合并排序 基本思想 将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 递归算法描述 Mergesort(A[0..n-1]) //递归调用Mergesort对数组A[0..n-1]排序 //输入:可排序数组A[0..n-1] //输出:非降序排列的数组A[0..n-1] if n1 copy A[0.. ?n/2? -1] to B[0.. ?n/2? -1] copy A[ ?n/2? ..n-1] to C[ ?n/2? ..n-1] Mergesort( B[0.. ?n/2? -1] ) Mergesort( C[ ?n/2? ..n-1] ) Merge(B,C,A) 2.7 合并排序 基本思想 将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 递归算法描述 Merge (B[0..p-1],C[0..q-1],A[0..p+q-1]) //将两个有序数组合并为一个有序数组 //输入:两个有序数组B[0..p-1],C[0..q-1] //输出:合并B、C形成的有序数组A[0..p+q-1] i=0;j=0;k=0 while ip and jq do if B[i]≤C[j] A[k]=B[i]; i=i+1 else A[k]=C[j]; j=j+1 k=k+1 if i=p copy C[j.. q-1] to A[k.. p+q-1] else copy B[ i..p-1] to A[ k..p+q-1] 2.7 合并排序 合并排序的例子 8 3 2 9 7 1 5 4 8 3 2 9 7 1 5 4 8 3 2 9 7 1 5 4 8 2 3 9 7 1 5 4 3 8 2 9 1 7 4 5 2 3 8 9 1 4 5 7 1 2 3 4 5 7 8 9 2.7 合并排序 复杂度分析 键值比较此数C(n)的递推关系式为 Cmerge(n)为合并元素键值比较此数。最坏情况下(如最小元素轮流来自不同数组)Cmerge(n)=n-1 Cworst(n)=2Cworst(n/2)+n-1 Cworst(1)=0 若n=2k,最差递推式的精确解为Cworst=nlog2n-n+1 所以合并排序是O(nlogn) 渐进意义下的最优算法。 2.8 快速(划分)排序 2.8 快速排序 基于分治策略的另一个排序算法,基本思想是: 分解 以aq为基准元素将ap:r划分成3段ap:q-1、aq和aq+1:r,使得ap:q-1中任何元素小于aq ,aq+1:r中任何元素大于aq ; 下标q在划分过程中确定。 递归求解 递归调用快速排序算法对ap:q-1和aq+1:r进行排序; 合并 对ap:q-1和aq+1:r的排序是就地进行的,ap:q-1和aq+1:r排好序后不需要执行任何计算,ap:r就已排好序。 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); //对右半段排序 } } 2.8 快速排序 分解/划分算法描述: templateclass Type//以确定基准元素a[p]对子数组a[p:r]划分 int Partition (Type a[],

文档评论(0)

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

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档