算法设计与分析.PPT

  1. 1、本文档共53页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
四、计算复杂度 定理2.2 若n在区域[2k-1, 2k)中, 则对于一次成功的检索, BinSearch1至多作k次比较; 而对于一次不成功的检索, 或者作k-1次比较或者作k次比较。 平均情况分析 二分检索的时间复杂度结论 定理2.3 设a[n]含有n(n≥1)个不同元素, 排序为a[1]…a[n]. 又设用以比较为基础去判断是否x∈a[n]的任何算法在最坏情况下所需的最小比较次数为FIND(n), 那么, FIND(n) 。 思考题: 1. 请证明 E=I+2n 2. 请证明 S(n)=(I/n)+1 2.3 找最大和最小元素 三、实现分治的递归算法 给定一个含n个元素的集合a[n], 按一定次序(本课程假定均为非降次序)将其分类(排序)。 二、插入分类 三、归并分类 四、快速分类 五、几种分类算法的时间复杂度比较 一、问题 三、基于分治思想的选择算法 selection (p, q, k) { int j; j=partition (p, q); if (k==j) return; if (kj) selection (p, j-1, k); else selection (j+1, q, k); } 一、递归算法的特点 递归的基本思路——分治 输出s=”abc”的递归过程 void reverse (char * s) { extern ElemType stack[2*n+1], top=0; L1: if( *s!=’\0’ ) { stack[++top]=s; stack[++top]=L2; s=s+1; goto L1; L2: putchar(*s); } // 接下来处理返回语句 if(top==0 ) return; // 栈为空 else { addr=stack[top--]; // 恢复地址 s=stack[top--]; // 恢复参数 if(addr == L2) goto L2; } } void reverse(char * s) { int top=0; while(*s!=’\0’) { top++; s++; } while (top!=0) { putchar(*s); s--; top--; } } 例2:写一个求数组a[n]中的最大元素的递归算法并将其改写成迭代算法。 int max (int i) { int j, k=n-1; for (j=n-2; j=i; j--) if (a[j]a[k]) k=j; return k; } 例3:将分治算法的抽象递归过程改写为迭代过程。 设计思路 已分类的集合 对a[j+1:n] 快速分类 a[j] 对a[1:j-1]快速分类 使a[j+1:n]≥a[j] a[j] 使a[1:j-1]≤a[j] a[n] … a[j+1] a[j] a[j-1] … a[1] 实现部分分类的划分过程举例 返回交换位置 k 8 7 5 6 r=4 3 1 2 交换位 置 j k 二 次 循 环 8 7 5 6 2 3 1 r=4 k j r=4 一次循 环 k j r=4 指针 8 7 5 2 6 3 1 4 原始 实现部分分类的划分算法 Partition (p, q) { r=a[p]; j=p+1; k=q; while(1) { while ((j=k) (a[j]=r)) j++; while ((j=k) (a[k]=r)) k--; if (jk) { t=a[j];

文档评论(0)

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

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

1亿VIP精品文档

相关文档