软考软件设计师专题十算法分析与设计.docx
- 文档编号:27326117
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:40
- 大小:60.43KB
软考软件设计师专题十算法分析与设计.docx
《软考软件设计师专题十算法分析与设计.docx》由会员分享,可在线阅读,更多相关《软考软件设计师专题十算法分析与设计.docx(40页珍藏版)》请在冰豆网上搜索。
软考软件设计师专题十算法分析与设计
专题十:
算法分析与设计
1.常用的算法设计方法:
1.1迭代法
1.2穷举搜索法
1.3递推法
1.4递归法
1.5贪婪法
1.6分治法
1.7动态规划法
1.8回溯法
算法基础部分:
算法是对特定问题求解步骤的一种描述,算法是指令的有限序列,其中每一条指令表示一个或多个操作。
算法具有以下5个属性:
有穷性:
一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:
算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口
可行性:
一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:
一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:
一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
所以对应的算法设计的要求:
正确性:
算法应满足具体问题的需求;
可读性:
算法应该好读,以有利于读者对程序的理解;
健壮性:
算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。
效率与存储量需求:
效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。
一般这两者与问题的规模有关。
1.1 迭代法:
迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。
设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:
(1)选一个方程的近似根,赋给变量x0;
(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤
(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。
上述算法用C程序的形式表示为:
【算法】迭代法求方程的根
{ x0=初始近似根;
do{
x1=x0;
x0=g(x1); /*按特定的方程计算新的近似根*/
}while(fabs(x0-x1)>Epsilon);
printf(“方程的近似根是%f\n”,x0);
}
迭代算法也常用于求方程组的根,令
X=(x0,x1,…,xn-1)
设方程组为:
xi=gi(X) (I=0,1,…,n-1)
则求方程组根的迭代算法可描述如下:
【算法】迭代法求方程组的根
{ for(i=0;i x[i]=初始近似根; do{ for(i=0;i y[i]=x[i]; for(i=0;i x[i]=gi(X); for(delta=0.0,i=0;i if(fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]); }while(delta>Epsilon); for(i=0;i printf(“变量x[%d]的近似根是%f”,I,x[i]); printf(“\n”); } 具体使用迭代法求根时应注意以下两种可能发生的情况: (1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制; (2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。 1.2穷举搜索法: 穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。 要解决的问题只有有限种可能,在没有更好算法时总可以用穷举搜索的办法解决,即逐个的检查所有可能的情况。 可以想象,情况较多时这种方法极为费时。 实际上并不需要机械的检查每一种情况,常常是可以提前判断出某些情况不可能取到最优解,从而可以提前舍弃这些情况。 这样也是隐含的检查了所有可能的情况,既减少了搜索量,又保证了不漏掉最优解。 【问题】 将A、B、C、D、E、F这六个变量排成如图所示的三角形,这六个变量分别取[1,6]上的整数,且均不相同。 求使三角形三条边上的变量之和相等的全部解。 如图就是一个解。 程序引入变量a、b、c、d、e、f,并让它们分别顺序取1至6的整数,在它们互不相同的条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。 当这些变量取尽所有的组合后,程序就可得到全部可能的解。 细节见下面的程序。 #include voidmain() { inta,b,c,d,e,f; for(a=1;a<=6;a++) //a,b,c,d,e依次取不同的值 for(b=1;b<=6;b++) { if(b==a) continue; for(c=1;c<=6;c++) { if(c==a)||(c==b) continue; for(d=1;d<=6;d++) { if(d==a)||(d==b)||(d==c) continue; for(e=1;e<=6;e++) { if(e==a)||(e==b)||(e==c)||(e==d)continue; f=21-(a+b+c+d+e);//最后一个用减法算 if((a+b+c==c+d+e))&&(a+b+c==e+f+a)) { printf(“%6d,a); printf(“%4d%4d”,b,f); printf(“%2d%4d%4d”,c,d,e); scanf(“%c”); } } } } } } 按穷举法编写的程序通常不能适应变化的情况。 如问题改成有9个变量排成三角形,每条边有4个变量的情况,程序的循环重数就要相应改变,循环的重数和变量的个数相关。 从上述问题解决的方法中,最重要的因素就是确定某种方法来确定所有的候选解。 下 1.3递推法: 递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。 设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。 能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。 这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。 【问题】 阶乘计算 问题描述: 编写程序,对给定的n(n≦100),计算并输出k的阶乘k! (k=1,2,…,n)的全部有效数字。 由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。 如有m位成整数N用数组a[]存储: N=a[m]×10m-1+a[m-1]×10m-2+…+a[2]×101+a[1]×100 并用a[0]存储长整数N的位数m,即a[0]=m。 按上述约定,数组的每个元素存储k的阶乘k! 的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。 例如,5! =120,在数组中的存储形式为: 3 0 2 1 …… 首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。 计算阶乘k! 可采用对已求得的阶乘(k-1)! 连续累加k-1次后求得。 例如,已知4! =24,计算5! ,可对原来的24累加4次24后得到120。 细节见以下程序。 #include #include #define MAXN 1000 void pnext(inta[],intk)//已知a中的(k-1)! 求出k! 在a中。 { int*b,m=a[0],i,j,r,carry; b=(int*)malloc(sizeof(int)*(m+1)); for(i=1;i<=m;i++) b[i]=a[i];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 设计师 专题 算法 分析 设计