ACM培训课程算法设计课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《ACM培训课程算法设计课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 培训 课程 算法 设计 课件
- 资源描述:
-
1、ACM培训课程算法设计主讲教师:校景中如何用计算机求解问题?1. 1. 问题分析问题分析 准确、完整地理解和描述问题是解决问题的准确、完整地理解和描述问题是解决问题的第一步。要做到这一点,必须注意以下一些问第一步。要做到这一点,必须注意以下一些问题:在未经加工的原始表达中,所用的术语是题:在未经加工的原始表达中,所用的术语是否都明白其准确定义?题目提供了哪些信息?否都明白其准确定义?题目提供了哪些信息?这些信息有什么用?题目要求得到什么结果?这些信息有什么用?题目要求得到什么结果?题目中作了哪些假定?是否有潜在的信息?判题目中作了哪些假定?是否有潜在的信息?判定求解结果所需要的中间结果有哪些?
2、定求解结果所需要的中间结果有哪些?如何用计算机求解问题?2 2、数学模型建立、数学模型建立 用计算机解决实际问题必须有合适的数学模型,因用计算机解决实际问题必须有合适的数学模型,因为在现实问题面前,计算机是无能为力。对一个实际为在现实问题面前,计算机是无能为力。对一个实际问题建立数学模型,可以考虑这样两个基本问题:最问题建立数学模型,可以考虑这样两个基本问题:最适合于此问题的数学模型是什么?是否有已经解决了适合于此问题的数学模型是什么?是否有已经解决了的类似问题可借鉴?的类似问题可借鉴?如何用计算机求解问题?3 3、算法设计与选择、算法设计与选择 算法设计是指设计求解某一特定类型问题的算法设计
3、是指设计求解某一特定类型问题的一系列步骤,并且这些步骤是可以通过计算机一系列步骤,并且这些步骤是可以通过计算机的基本操作来实现的。算法设计要同时结合数的基本操作来实现的。算法设计要同时结合数据结构的设计,简单说数据结构的设计就是选据结构的设计,简单说数据结构的设计就是选取存储方式。算法的设计与模型的选择更是密取存储方式。算法的设计与模型的选择更是密切相关的,但同一模型仍然可以有不同的算法,切相关的,但同一模型仍然可以有不同的算法,而且它们的有效性可能有相当大的差距。而且它们的有效性可能有相当大的差距。如何用计算机求解问题?在这些步骤中,算法设计是解决问题在这些步骤中,算法设计是解决问题的核心的
4、核心算法又是如何定义的呢?算法由操作、控制结构、数据结构三要素算法由操作、控制结构、数据结构三要素组成。组成。算法又是如何定义的呢?1 1)操作)操作 算术运算:加、减、乘、除算术运算:加、减、乘、除 关系比较:大于、小于、等于、不等于关系比较:大于、小于、等于、不等于 逻辑运算:与、或、非逻辑运算:与、或、非 数据传送:输入、输出数据传送:输入、输出, , 赋值赋值算法又是如何定义的呢?2 2)控制结构)控制结构 各操作之间的执行次序。各操作之间的执行次序。 顺序结构:各操作依次执行顺序结构:各操作依次执行 选择结构:由条件是否成立来选择选择结构:由条件是否成立来选择 执行执行 循环结构:有
5、些操作要重复执行,直到循环结构:有些操作要重复执行,直到 功能满足某个条件时结束。又称重复或功能满足某个条件时结束。又称重复或 迭代结构。迭代结构。算法又是如何定义的呢?3 3)数据结构)数据结构 算法操作的对象是数据,数据间的逻算法操作的对象是数据,数据间的逻辑关系、数据的存储方式及处理方式就辑关系、数据的存储方式及处理方式就是数据的数据结构。它与算法设计是紧是数据的数据结构。它与算法设计是紧密相关的。密相关的。如何设计循环? 1 1设计中要注意算法的效率设计中要注意算法的效率 2 2“自顶向下自顶向下”的设计方法的设计方法 循环体的特点是:循环体的特点是:“以不变应万变以不变应万变”。 所
6、谓所谓“不变不变”是指循环体内运算的表现是指循环体内运算的表现形式是不变的,而每次具体的执行内容却是形式是不变的,而每次具体的执行内容却是不尽相同的。在循环体内用不变的运算表现不尽相同的。在循环体内用不变的运算表现形式去描述各种相似的重复运算。形式去描述各种相似的重复运算。1 1循环循环设计中设计中如何如何注意算法的效率注意算法的效率【例【例1 1】求】求1/1!-1/3!+1/5!-1/7!+1/1!-1/3!+1/5!-1/7!+ +(-1-1)n+1/(2n-1)!n+1/(2n-1)!分析:此问题中既有累加又有累乘,准确地说累分析:此问题中既有累加又有累乘,准确地说累加的对象是累乘的结
7、果。加的对象是累乘的结果。数学模型数学模型1 1:SnSn=Sn-1+=Sn-1+(-1-1)n+1n+1/(2n-1)!/(2n-1)!算法设计算法设计1 1:多数初学者会直接利用题目中累加项:多数初学者会直接利用题目中累加项通式,构造出循环体不变式为:通式,构造出循环体不变式为: S=S+S=S+(-1-1)n+1n+1/(2n-1)!/(2n-1)!需要用二重循环来完成算法,算法需要用二重循环来完成算法,算法1 1如下:如下:算法如下:算法如下:main( ) int i,n,j,sign=1; float s,t=1;/s存储最终的结果,存储最终的结果,t存储存储(2k-1)的阶乘的阶
8、乘 input(n);/输入输入n s=1; for(i=2;i=n;i=i+1) t=1; 求阶乘求阶乘 for(j=1;j=2*i-1;j=j+1) t=t*j; sign =1;求(求(-1)n+1 for(j=1;j=i+1;j=j+1) sign = sign *(-1); s=s+ sign/t; print(“Snm=”,s);算法分析算法分析: 以上算法是二重循环来完成以上算法是二重循环来完成 ,但算,但算法的效率却太低是法的效率却太低是O(n2)。)。 其原因是,当前一次循环已求出其原因是,当前一次循环已求出7 7!,当这次要!,当这次要想求想求9 9!时,没必要再从!时,没
9、必要再从1 1去累乘到去累乘到9 9,只需要充分利,只需要充分利用前一次的结果,用用前一次的结果,用7 7!* *8 8* *9 9即可得到即可得到9 9!,模型为!,模型为A An n=A=An-1n-1* *1/(21/(2* *n-2)n-2)* *(2(2* *n-1)n-1)。另外运算。另外运算sign = sign sign = sign * *(-1);(-1);总共也要进行总共也要进行n n* *(n-1)/2(n-1)/2次乘法,这也是没有次乘法,这也是没有必要的。下面我们就进行改进。必要的。下面我们就进行改进。 数学模型数学模型2:Sn=Sn-1+(-1)n+1An; An
10、=An-1 *1/(2*n-2)*(2*n-1)main( )int i,n, sign; float s,t=1; input(n);s=1;sign=1; for(i=2;i=n;i=i+1) 或或 for(i=1;i=n-1;i=i+1) sign=-sign; sign=-sign;t= t*(2*i-2)*(2*i-1); t= t*2*i*(2*i+1);s=s+ sign/t; s=s+ sign/t; print(“Sum=”,s);算法说明算法说明2 2:构造循环不变式时,一定要注意循环变量的意义,如当构造循环不变式时,一定要注意循环变量的意义,如当i i不是项数序号时(右边
11、的循环中)有关不是项数序号时(右边的循环中)有关t t的的累乘累乘式与式与i i是项是项数序号时就不能相同。数序号时就不能相同。算法分析:按照数学模型算法分析:按照数学模型2 2,只需一重循环就能解决问题,只需一重循环就能解决问题算法的时间复杂性为算法的时间复杂性为O O(n n)。 2 2“自顶向下自顶向下”的设计方法的设计方法 自顶向下的方法是从全局走向局部、从自顶向下的方法是从全局走向局部、从概略概略走向走向详尽的详尽的设计设计方法。自上而下是系统分解和细化的过程。方法。自上而下是系统分解和细化的过程。 【例【例2 2】编算法找出】编算法找出10001000以内所有完数以内所有完数例如,
12、例如,2828的因子为的因子为1 1、2 2、4 4、7 7,1414,而,而28=1+2+4+7+1428=1+2+4+7+14。因此因此2828是是“完数完数”。编算法找出。编算法找出10001000之内的所有完之内的所有完数 , 并 按 下 面 格 式 输 出 其 因 子 :数 , 并 按 下 面 格 式 输 出 其 因 子 : 2 8 i t s 2 8 i t s factors are 1factors are 1,2 2,4 4,7 7,1414。1 1)这里不是要质因数,所以找到因数后也无需将其从)这里不是要质因数,所以找到因数后也无需将其从数据中数据中“除掉除掉”。2 2)每
13、个因数只记一次,如)每个因数只记一次,如8 8的因数为的因数为1 1,2 2,4 4而不是而不是1 1,2 2,2 2,2 2,4 4。(注:本题限定因数不包括这个数本。(注:本题限定因数不包括这个数本身)身)1)顶层算法 for(i=2;i=n;i+)判断i是否是“完数”;是完数则按格式输出;2)判断是否是”完数” 的算法for(j=2;ji;j+)找i的因子,并累加;如果累加值等于i,i是完数3)进一步细化判断i是否“完数”算法s=1for(j=2;ji;j=j+1) if (i mod j=0) (j是i的因素) s=s+j;if (s=i) i是“完数”;4 4)考虑输出格式)考虑输出
14、格式判断判断i i是否是否“完数完数”算法算法 考虑到要按格式输出结果,应该开辟数组存储数据考虑到要按格式输出结果,应该开辟数组存储数据i i的所有因子,并记录其因子的个数,因此算法细化如下:的所有因子,并记录其因子的个数,因此算法细化如下:定义数组定义数组a,s=1; k=0;for(j=2;ji;j=j+1)j=2;ji;j=j+1) if (i mod j=0) (j if (i mod j=0) (j是是i i的因素的因素) ) s=s+j; ak=j;k=k+1;s=s+j; ak=j;k=k+1;if if (s=is=i) 按格式输出结果按格式输出结果 算法如下:算法如下:mai
15、n( )int i,k,j,s,a20;for(i=1;i=1000;i+) s=1; /*两个赋初值语句两个赋初值语句s=1,k=0 k=0; 一定要位于外部循环的内部一定要位于外部循环的内部*/ for(j=2;ji;j+) if (i mod j)=0) s=s+j; ak=j; k+; if(i=s) print(s, “its factors are :”,1); for(j=0;ik;j+) print(“,”,ak); 递归算法是一个模块(函数、过程)除了可调用递归算法是一个模块(函数、过程)除了可调用其它模其它模 块(函数、过程)外,还可以直接或间接块(函数、过程)外,还可以直
16、接或间接地调用自身的算法地调用自身的算法。 递归是一种比迭代循环更强、更好用的循环结构递归是一种比迭代循环更强、更好用的循环结构。只需要找出递归关系和最小问题的解。只需要找出递归关系和最小问题的解。 递归的关键在于找出递归方程式和递归终止条件。递归的关键在于找出递归方程式和递归终止条件。递归定义:使问题向边界条件转化的规则。递归定义递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。必须能使问题越来越简单。递归边界条件:也就是所描述问题的最简单情况,它递归边界条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。本身不再使用递归的定义。递归算法解题通常有三个步骤:递归
17、算法解题通常有三个步骤:1 1)分析问题、寻找递归:找出大规模问题与小规模问)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。题的关系,这样通过递归使问题的规模逐渐变小。2 2)设置边界、控制递归:找出停止条件,即算法可解)设置边界、控制递归:找出停止条件,即算法可解的最小规模问题。的最小规模问题。3 3)设计函数、确定参数:和其它算法模块一样设计函)设计函数、确定参数:和其它算法模块一样设计函数体中的操作及相关参数。数体中的操作及相关参数。 【例【例2 2】整数的分划问题】整数的分划问题 对于一个正整数对于一个正整数n n的分划就是把的分划就是把n n
18、写成一系列正整数之和的表达写成一系列正整数之和的表达式。例如,对于正整数式。例如,对于正整数n=6n=6,它可以分划为:,它可以分划为: 6 6 5+1 5+1 4+2, 4+1+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 3+3, 3+2+1, 3+1+1+1 2+2, 2+2+1+1, 2+1+1+1+1 2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+11+1+1+1+1+1 根据例子发现根据例子发现“包括第一行以后的数据不超过包括第一行以后的数据不超过6 6,包括,包括第二行的数据不超过第二行的数据不超过5 5,第六行的数据不超过,第六行的数据
19、不超过1”1”。 因此,定义一个函数因此,定义一个函数Q(n,m)Q(n,m),表示整数,表示整数n n的的“任何被加任何被加数都不超过数都不超过m”m”的分划的数目,的分划的数目,n n的所有分划的数目的所有分划的数目P(n)=Q(n,n)P(n)=Q(n,n)。模型建立:模型建立: 一般地一般地Q(n.m)Q(n.m)有以下递归关系:有以下递归关系: 1)1)Q(n,n)=1+Q(n,n-1) Q(n,n)=1+Q(n,n-1) (m=nm=n)Q(n,n-1)Q(n,n-1)表示表示n n的所有其他分划,即最大被加数的所有其他分划,即最大被加数m=n-1m=n-1的划分。的划分。2)2)
20、Q(n,m)=Q(n,m-1)+Q(n-m,m) (mn)Q(n,m)=Q(n,m-1)+Q(n-m,m) (mn) Q(n,m-1) Q(n,m-1)表示被加数中不包含表示被加数中不包含m m的分划的数目;的分划的数目; Q(n-m,m)Q(n-m,m)表示被加数中包含表示被加数中包含( (注意不是小于注意不是小于)m)m的分划的数目,的分划的数目,递归的停止条件:递归的停止条件:1)Q(n,1)=11)Q(n,1)=1,表示当最大的被加数是,表示当最大的被加数是1 1时,该整数时,该整数n n只有一只有一种分划,即种分划,即n n个个1 1相加;相加; 2)Q(1,m)=1 2)Q(1,m
21、)=1,表示整数,表示整数n=1n=1只有一个分划,不管最大被加只有一个分划,不管最大被加数的上限数的上限m m是多大。是多大。 算法如下:算法如下:Divinteger(n, m) if (n 1 or m n ) Error(“输入参数错误输入参数错误”); /*nm Q(n,m)是无意义的是无意义的*/ else if (n = 1 or m = 1) return(1);); else if ( n m ) return Divinteger(n, n) else if (n = m ) return(1 + Divinteger(n, n-1) else return(Divinte
22、ger(n,m-1)+Divinteger(n-m,m); 算法与数据结构算法与数据结构数据的逻辑结构常分为四大类:数据的逻辑结构常分为四大类:(1 1)集合结构)集合结构 (2 2)线性结构)线性结构 (3 3)树形结构)树形结构(4 4)图结构(网结构)图结构(网结构) 存储结构可以分为:连续存储和链式存储。存储结构可以分为:连续存储和链式存储。连续存储又可以分为:静态存储和动态存储连续存储又可以分为:静态存储和动态存储 1 1、常用的几种数据结构、常用的几种数据结构 顺序存储的优点:顺序存储的优点: (1) 方法简单,各种高级语言中都提供数组结方法简单,各种高级语言中都提供数组结构,容易
23、实现。构,容易实现。 (2) 不用为表示结点间的逻辑关系而增加额外不用为表示结点间的逻辑关系而增加额外的存储开销。的存储开销。 (3) 顺序表具有按元素序号随机访问的特点。顺序表具有按元素序号随机访问的特点。2 2、连续存储和链式存储比较、连续存储和链式存储比较顺序存储的缺点:顺序存储的缺点: (1) 在顺序表中做插入删除操作时,平均移动在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对大约表中一半的元素,因此对n较大的顺序表效较大的顺序表效率低。率低。 (2) 需要预先分配足够大的存储空间,估计过需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配大,可
24、能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。过小,又会造成溢出。温馨提示:温馨提示: 链表的优缺点恰好与顺序表相反。链表的优缺点恰好与顺序表相反。3 3、在选取存储结构时权衡因素有:、在选取存储结构时权衡因素有:)基于存储的考虑)基于存储的考虑 顺序表的存储空间是静态分配的,在程顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就序执行之前必须明确规定它的存储规模,也就是说事先对是说事先对“MAXSIZE”MAXSIZE”要有合适的设定,过要有合适的设定,过大造成浪费,过小造成溢出。可见对线性表的大造成浪费,过小造成溢出。可见对线性表的长度或存储规模难以估计时
25、,不宜采用顺序表;长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密链表不用事先估计存储规模,但链表的存储密度较低,度较低,)基于运算的考虑)基于运算的考虑 在顺序表中按序号访问在顺序表中按序号访问a ai i的时间性能时的时间性能时O(1)O(1),而链表中按序号访问的时间性能而链表中按序号访问的时间性能O(n)O(n),所以如果,所以如果经常做的运算是按序号访问数据元素,显然顺序经常做的运算是按序号访问数据元素,显然顺序表优于链表;表优于链表;)基于环境的考虑)基于环境的考虑 顺序表容易实现,任何高级语言中都有数顺序表容易实现,任何高级语言中都有数组类型,链
展开阅读全文