算法设计与分析教案.doc
《算法设计与分析教案.doc》由会员分享,可在线阅读,更多相关《算法设计与分析教案.doc(55页珍藏版)》请在咨信网上搜索。
1、算法设计与分析教案张静第1章 绪 论 算法理论的两大论题:1. 算法设计2. 算法分析1.1 算法的基本概念1。1。1 为什么要学习算法 理由1:算法程序的灵魂 问题的求解过程:分析问题设计算法编写程序整理结果 程序设计研究的四个层次:算法方法学语言工具理由2:提高分析问题的能力算法的形式化思维的逻辑性、条理性1.1。2 算法及其重要特性 算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列.算法的五大特性: 输入:一个算法有零个或多个输入。 输出:一个算法有一个或多个输出。 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 确定性:算法中的每一
2、条指令必须有确切的含义,对于相同的输入只能得到相同的输出. 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。1.1。3 算法的描述方法 自然语言优点:容易理解缺点:冗长、二义性使用方法:粗线条描述算法思想 注意事项:避免写成自然段欧几里德算法N开始输入m和n r=m % nr=0m=n;n=r 输出n结束Y 程序设计语言优点:能由计算机执行 缺点:抽象性差,对语言要求高使用方法:算法需要验证注意事项:将算法写成子函数欧几里德算法#include iostream。hint CommonFactor(int m, int n) int r=m n; while (r!=0) m
3、=n; n=r; r=m % n; return n;void main( ) coutCommonFactor(63, 54)0),则有T(n)=O(nm)且T(n)=(n m),因此,有T(n)=(n m)。 1.2。2 最好、最坏和平均情况 例: 在一维整型数组An中顺序查找与给定值k相等的元素(假设该数组中有且仅有一个元素值为k) int Find(int A , int n) for (i=0; in; i+) if (Ai= =k) break; return i; 结论:如果问题规模相同,时间代价与输入数据有关,则需要分析最好情况、最坏情况、平均情况。 最好情况:出现概率较大时分
4、析 最差情况:实时系统 平均情况:已知输入数据是如何分布的, 通常假设等概率分布1。2。3 非递归算法的分析 算法-非递归算法、递归算法 例:求数组最小值算法 int ArrayMin(int a , int n) min=a0; for (i=1; in; i+) if (aimin) min=ai; return min; 非递归算法分析的一般步骤: 1. 决定用哪个(或哪些)参数作为算法问题规模的度量2。 找出算法中的基本语句3. 检查基本语句的执行次数是否只依赖于问题规模4. 建立基本语句执行次数的求和表达式5. 用渐进符号表示这个求和表达式v 关键:建立一个代表算法运行时间的求和表达
5、式,然后用渐进符号表示这个求和表达式。 1.2。4 递归算法的分析 关键:根据递归过程建立递推关系式,然后求解这个递推关系式。1。 猜测技术:对递推关系式估计一个上限,然后(用数学归纳法)证明它正确。2. 扩展递归技术 3。 通用分治递推式大小为n的原问题分成若干个大小为n/b的子问题,其中a个子问题需要求解,而cnk是合并各个子问题的解需要的工作量。 1.2。5 算法的后验分析 算法的后验分析(Posteriori)也称算法的实验分析,它是一种事后计算的方法,通常需要将算法转换为对应的程序并上机运行。一般步骤:1。 明确实验目的 2。 决定度量算法效率的方法,为实验准备算法的程序实现3。 决
6、定输入样本,生成实验数据 4. 对输入样本运行算法对应的程序,记录得到的实验数据5. 分析得到的实验数据 表格法记录实验数据 散点图记录实验数据 执行次数或时间 问题规模n第4章 分治法 4。1 概 述 4.1.1 分治法的设计思想 将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破,分而治之。更一般地说,将要求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。如果子问题的规模仍然不够小,则再将每个子问题划分为k个规模更小的子问题,如此分解下去,直到问题规模足够小,很容易求出其解为止,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解. 启发式
7、规则:1。 平衡子问题:最好使子问题的规模大致相同。也就是将一个问题划分成大小相等的k个子问题(通常k2),这种使子问题规模大致相等的做法是出自一种平衡(Balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。2. 独立子问题:各子问题之间相互独立,这涉及到分治法的效率,如果各子问题不是独立的,则分治法需要重复地解公共的子问题。 分治法的典型情况 子问题1的规模是n/2 子问题1的解 子问题2的解 子问题2的规模是n/2 原问题的解 原问题的规模是n4。1。2 分治法的求解过程 一般来说,分治法的求解过程由以下三个阶段组成:(1)划分:既然是分治,当然需要把规模为n的原问题划分
8、为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。(2)求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现.(3)合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。 分治法的一般过程DivideConquer(P)if(P的规模足够小)直接求解P;分解为k个子问题P1,P2,Pk;for(i=1;i=k;i+) yi= DivideConquer(Pi);return Merge(y1,,yk);例:计算an,应用分治技术得到如下计算方法: 34 32 32 8
9、1 31 31 9 31 31 9 3 3 3 3分解问题求解每个子问题合并子问题的解4。2 递 归 4。2.1 递归的定义 递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。递归有两个基本要素: 边界条件:确定递归到何时终止; 递归模式:大问题是如何分解为小问题的,确定递归体.4。2。2 递归函数的运行轨迹 在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第
10、i层.采用图示方法描述递归函数的运行轨迹,从中可较直观地了解到各调用层次及其执行情况。Hanio(3,A,B,C)Hanio(2,A,C,B)Hanio(1,A,B,C)Move (A,C)Move (A,B)Hanio(1,C,A,B)Hanio(1,A,B,C)Hanio(2,A,C,B)Move (C,B)Hanio(1,C,A,B)Move (A,C)Hanio(2,B,A,C)Hanio(1,B,C,A)Move (B,C)Hanio(1,A,B,C)Hanio(1,B,C,A)Move (A,C)Hanio(2,B,A,C)Move (B,A)Hanio(1,A,B,C)结束4。2
11、。3 递归函数的内部执行过程 一个递归函数的调用过程类似于多个函数的嵌套调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:(1)运行开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。汉诺塔算法在执行过程中,工作栈的变化下图所示,其中栈元素的结构为(返回地址,n值,A值,B值,C值),返
12、回地址对应算法中语句的行号。递归算法结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此,它为设计算法和调试程序带来很大方便,是算法设计中的一种强有力的工具.但是,因为递归算法是一种自身调用自身的算法,随着递归深度的增加,工作栈所需要的空间增大,递归调用时的辅助操作增多,因此,递归算法的运行效率较低。 4。3 排序问题中的分治法4。3。1 归并排序二路归并排序的分治策略是:(1)划分:将待排序序列r1, r2, , rn划分为两个长度相等的子序列r1, , rn/2和rn/21, , rn;(2)求解子问题:分别对这两个子序列进行排序,得到两个有序子序列;(3)合并:将这两个有序子
13、序列合并成一个有序序列。算法4.3归并排序 void MergeSort(int r , int r1 , int s, int t) if (s= =t) r1s=rs; else m=(s+t)/2; Mergesort(r, r1, s, m); /归并排序前半个子序列 Mergesort(r, r1, m+1, t); /归并排序后半个子序列 Merge(r1, r, s, m, t); /合并两个已排序的子序列 算法4.4合并有序子序列 void Merge(int r , int r1 , int s, int m, int t) i=s; j=m+1; k=s; while (i
14、=m & j=t) if (ri=rj) r1k+=ri+; /取ri和rj中较小者放入r1k else r1k+=rj+; if (i=m) while (i=m) /若第一个子序列没处理完,则进行收尾处理 r1k+=ri+; else while (j+=1)2(211)(nnnTnnT根据1。2.4节的主定理,二路归并排序的时间代价是O(nlog2n).二路归并排序在合并过程中需要与原始记录序列同样数量的存储空间,因此其空间复杂性为O(n)。 4.3。2 快速排序 快速排序的分治策略是:(1)划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列r1 ri-1和ri+1 rn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 教案
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。