算法基本工具(Part1).ppt
《算法基本工具(Part1).ppt》由会员分享,可在线阅读,更多相关《算法基本工具(Part1).ppt(47页珍藏版)》请在三一办公上搜索。
1、1,算法基本工具,主要内容,2.1 循环与递归2.2 算法与数据结构2.3 优化算法的数学模型,2,3,2.1 循环与递归,设计算法重复处理大量数据的思路:以不变应万变;所谓“不变”是指循环体内运算的表现形式是不变的,而每次具体的执行内容却是不尽相同的。在循环体内用不变的运算表现形式去描述各种相似的重复运算。两种思路:循环、递归。,1 循环设计要点2 递归设计思路(运行机制、复杂度分析)3 递归设计要点4 非递归(循环)/递归比较,4,1 循环设计要点,循环控制-熟悉;设计要点:“自顶向下”的设计方法 由具体到抽象设计循环结构注意算法的效率,5,1 循环设计要点-例2.1,例2.1 编算法找出
2、1000以内所有完数。如:28的因子为1、2、4、7,14,而28=1+2+4+7+14。因此28是“完数”。编算法找出1000之内的所有完数,并按下面格式输出其因子:28 its factors are 1,2,4,7,14。,问题分析:1、这里不是要质因数,所以找到因数后也无需将其从数据中“除掉”。2、每个因数只记一次,如8的因数为1,2,4而不是1,2,2,2,4。(注:本题限定因数不包括这个数本身),6,1 循环设计要点-例2.1,核心算法设计for(i=0;in;i=i+1)判断i是否是完数;if是“完数”则按规则输出;,自顶向下,逐步求精,判断i是否是完数for(j=2;ji;j=
3、j+1)找i的因子,并累加;if 累加值等于i,则i是完数;,判断i是否是完数s=1;for(j=2;ji;j=j+1)if(i%j=0)s=s+j;if(s=i)i是“完数”;,判断是否是完数的方法是“不变”,被判断的数是“万变”。,7,1 循环设计要点-例2.1,考虑到要按格式输出结果,应该开辟数组存储数据i的所有因子,并记录其因子的个数,因此算法细化如下:,int a100,s=1,k=0;for(j=2;ji;j=j+1)if(i%j=0)s=s+j;ak=j;k=k+1;,if(s=i)print(s,“its factors are:”,1);for(j=0;jk;j+)print
4、(“,”,aj);,8,1 循环设计要点-例2.2,对于不太熟悉的问题,其“不变”不易抽象;,1 6 2 10 7 3 13 11 8 4 15 14 12 9 5n=5,例2.2 编写算法:根据参数n打印具有下面规律的图形,如,当n=4时,图形如下:1 5 2 8 6 3 10 9 7 4,9,1 循环设计要点-例2.2,1 5 2 8 6 3 10 9 7 4,问题分析:容易发现图形中数据排列的规律。,另一种思路先用一个数组按此顺序存储数据,再正常输出;,1 5 2 8 6 3 10 9 7 4,可不可以从1最大数,通过循环,直接输出?,printf是按照从左至右、从上至下的顺序;若想直接
5、输出,只有找出公式,循环计算得到序列:1-n-5-2-n-8-6-3-n-10-9-7-4.,为数组赋值,也要用循环,如何循环?又要回到找规律公式的路上吗?,斜着能循环吗?让循环泼辣一点。,10,1 循环设计要点-例2.2,用斜行、列描述新的循环方向。,1 5 2 8 6 3 10 9 7 4,斜1,1a1,1斜1,2a2,2斜1,3a3,3斜1,4a4,4,斜2,1a2,1斜2,2a3,2斜2,3a4,3,列号相同;行号(显然行号与列号有关)第1斜行,对应行号1n,行号与列号j同;第2斜行,对应行号2n,行号比列号j大1;第3斜行,对应行号3n,行号比列号j大2;,斜3,1a3,1斜3,2a
6、4,2,斜行i取值(1n)列j取值(1n+1-i),ai-1+jj,这样可以描述循环。但数组元素的存取还是基于“行列”,能否简单转换?,关键问题:第i斜行、j列的数据对应于第几行第几列的元素?,斜4,1a4,1,11,1 循环设计要点-例2.2,main()int i,j,a100100,n,k;input(n);k=1;for(i=1;i=n;i=i+1)for(j=1;j=n+1-i;j=j+1)ai-1+jj=k;k=k+1;for(i=1;i=n;i=i+1)print(“换行符”);for(j=1;j=i;j=j+1)print(aij);,斜行i取值(1n)列j取值(1n+1-i)
7、,1 5 2 8 6 3 10 9 7 4,12,1 循环设计要点-例2.3,例2.3 求级数求:1/1!-1/3!+1/5!-1/7!+(-1)n+1/(2n-1)!,问题分析:此问题中既有累加又有累乘,累加的对象是累乘的结果。数学模型1:Sn=Sn-1+(-1)n+1/(2n-1)!算法设计1:直接利用题目中累加项通式,构造出循环体不变式为:S=S+(-1)n+1/(2n-1)!需要用二重循环来完成算法。,算法设计1:外层循环求累加S=S+A;内层循环求累乘A=(-1)n+1/(2n-1)!。,算法如下:,求(-1)n+1 for(j=1;j=i+1;j=j+1)sign=sign*(-1
8、);s=s+sign/t;print(“Snm=”,s);,main()int i,n,j,sign=1;float s,t=1;input(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;,14,1 循环设计要点-例2.3,以上算法是二重循环来完成,但算法的效率却太低O(n2)。,数学模型2:Sn=Sn-1+(-1)n+1An;An=An-1*1/(2*n-2)*(2*n-1),其原因是,当前一次循环已求出7!,当这次要想求9!时,没必要再从1去累乘到9,只需要充分利用前一次的结果,用7!*8*9即可得到
9、9!,模型为An=An-1*1/(2*n-2)*(2*n-1)。,15,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,只需一重循环就能解决问题算法的时间复杂性为O(n)。,16,2 递归设计思路-例2.4,程序结构化设计的三种基本结构,顺序、选
10、择、循环是不是必须的?,例2.4根据参数n,计算1+2+n。,void sum_loop(int n)int i,sum=0;for(i=1;i=n;i+)sum=sum+i;printf(nsum=%d,sum);,回答:在很多高级语言中,不是。可以抛弃谁呢?,递归能取代循环的作用。,17,2 递归设计思路-例2.4,例2.4 根据参数n,计算1+2+n。,int sum_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;,sum(n),递归算
11、法是一个模块(函数、过程)除了可调用其它模 块(函数、过程)外,还可以直接或间接地调用自身的算法。直接/间接递归调用。,代入n=4,走一遍。,递归树!,18,2 递归设计思路-例2.4,例2.4 根据参数n,计算1+2+n。,int sum_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;,栈顶(top),栈底(bottom),出栈,进栈,栈底元素,栈顶元素,表面上是一个变量,实际上是一个栈,19,2 递归设计思路-例2.4,例2.4 根据参数
12、n,计算1+2+n。,int sum_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;,T(n)=T(n-1)+O(1),=T(n-2)+O(1)+O(1),=.,=n*O(1)=O(n),20,“收敛”,3 递归设计要点,递归的关键在于找出递归方程式和递归终止条件。递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。递归边界条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。,int sum_recursive(i
13、nt n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;,21,例1.1 欧几里德算法,gcd(m,n)=gcd(n,m mod n)输入 正整数m和n 输出 m和n的最大公因子如果n=0,计算停止返回m,m即为结果;否则继续2。记r为m除以n的余数,即r=m mod n。把n赋值给m,把r赋值给n,继续1。伪代码如下(循环):Euclid(m,n)while n 0 r=m n;m=n;n=r;,递归代码:GCD(m,n)/约定mn/if n=0 return(m)els
14、e return(GCD(n,m mod n),22,GCD(22,8),GCD(8,6),GCD(6,2),GCD(2,0),2,递推,递推,递推,递推,回归,回归,回归,回归,结果为GCD(22,8)=2,例:GCD(22,8)=GCD(8,6)=GCD(6,2)=GCD(2,0)=2;,23,3 递归设计要点-hanoi塔,Hanoi塔hanoi河内越南首都古代有一个梵塔,塔内有3个基座A、B、C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘子,且在移动过程中在3个基座上的盘子都始终保持大盘在下,小盘在上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 基本 工具 Part1

链接地址:https://www.31ppt.com/p-6596900.html