第12章节 分治跟平衡.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章节 分治跟平衡

第12章 分治与平衡 12.1 分治算法 12.2 合并排序 12.3 快速排序 12.4 整数乘法和矩阵乘法 12.5 马的周游路线问题 小结 2. 分治法的适用条件 采用分治法解决的问题一般具有的特征如下: (1)问题的规模缩小到一定的规模就可以较容易地解决。 (2)问题可以分解为若干个规模较小的模式相同的子问题,即该问题具有最优子结 构性质。 (3)合并问题分解出的子问题的解可以得到问题的解。 (4)问题所分解出的各个子问题之间是独立的,即子问题之间不存在公共的子问 题。 3. 分治法的基本步骤 应用分治法一般有三个步骤: (1)分解:将原问题分解为若干个规模较小的子问题,这些子问题与原问 题形式相同,且相互独立。 (2)解决:若子问题易于求解则求出子问题的解,否则递归地解各个子问 题。 (3)合并:合并子问题的解求出原问题的解。 4. 分治法的复杂性分析 如果分治法Divide-and-Conquer(P)解规模为|P|=n,那么用t(n)表示该 问题P所需的计算时间,则: 用在算法复杂性中递归方程解的渐进阶的解法所介绍的迭代法来求解递 归方程,可以求得(12-1)的解: 另一个需要提到的问题是,在分析分治法的计算效率时,通常得到的 是递归不等式: 12.2 合并排序 应用分治法的排序算法通常用以下的步骤来进行:若 num 为1,算法终止;否则,将这一元素集合分解成两个或更 多个子集合,对每一个子集合分别排序,然后将排好序的子集 合并为一个集合 如果用元素的比较次数来计算它的时间复杂性,将满足递归式: 上式的解是t(n)= (num-1),它是O(num)阶的 分治-合并排序法算法如下所示: void Merge(SeqList R,int low,int m,int high) { //将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的 //子文件R[low..high] int i=low,j=m+1,p=0; //置初始值 RecType *R1; //R1是局部向量,若p定义为此类型指针速度更快 R1=(ReeType *)malloc((high-low+1)*sizeof(RecType)); if(! R1) //申请空间失败7 Error(Insufficient memory available!); while(i=mj=high) //两子文件非空时取其小者输出到R1[p]上 R1[p++]=(R[i].key=R[j].key)?R[i++];R[j++]; while(i=m) //若第1个子文件非空,则复制剩余记录到R1中 R1[p++]=R[i++]; while(j=high) //若第2个子文件非空,则复制剩余记录到R1中 R1[p++]=R[j++]; for(p=0,i=low;i=high;p++,i++) R[i]=R1[p]; //归并完成后将结果复制回R[low..high] } //Merge void MergePass(SeqList R,int length) { //对R[1..n]做一趟归并排序 int I; for(i=1;i+2*length-1=n;i=i+2*length) Merge(R,I,i+length-1,i+2*length-1); //归并长度为length的两个相邻子文件 if(i+length-1n) //尚有两个子文件,其中后一个长度小于length Merge(R,I,i+length-1,n); //归并最后两个子文件 //注意:若i≤n且i+length-1≥n时,则剩余一个子文件轮空,无须归并

您可能关注的文档

文档评论(0)

kelly + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档