经典算法设计方法大杂烩

经典算法设计方法大杂烩

ID:29475380

大小:91.98 KB

页数:22页

时间:2018-12-20

经典算法设计方法大杂烩_第1页
经典算法设计方法大杂烩_第2页
经典算法设计方法大杂烩_第3页
经典算法设计方法大杂烩_第4页
经典算法设计方法大杂烩_第5页
资源描述:

《经典算法设计方法大杂烩》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、经典算法设计方法大杂烩经典算法设计方法大杂烩2010-03-3121:56一、什么是算法算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n的函数f(n),算法执行的时间的增长率与f(n)的增长率正相关,称作渐进时间复杂度(Asym

2、ptoticTimeComplexity)。时间复杂度用"O(数量级)"来表示,称为"阶"。常见的时间复杂度有:O(1)常数阶;O(log2n)对数阶;O(n)线性阶;O(n2)平方阶。算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。二、算法设计的方法1.递推法递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后

3、,由问题的递推性质,能从已求得的规模为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并

4、用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素…。例如,5!=120,在数组中的存储形式为:3021…首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。细节见以下程序。#includestdio.h#includemalloc.h#defineMAXN1000voidpnext(inta[]

5、,intk){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];for(j=1;j=k;j++){for(carry=0,i=1;i=m;i++){r=(ia[0]?a[i]+b[i]:a[i])+carry;a[i]=r%10;carry=r/10;if(carry)a[++m]=carry;free(b);a[0]=m;voidwrite(int*a,intk){inti;printf("%4d!=",k);for(i=a[0];i0;i--)

6、printf("%d",a[i]);printf("");voidmain(){inta[MAXN],n,k;printf("Enterthenumbern:");scanf("%d",&n);a[0]=1;a[1]=1;write(a,1);for(k=2;k=n;k++){pnext(a,k);write(a,k);getchar();2.递归递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后

7、从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。【问题】编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。斐波那契数列为:0、1、1、2、3、…,即:fib(0)=0;fib(1)=1;fib(n)=fib(n-1)+fib(n-2)(当n1时)。写成递归函数有:intfib(intn){if(n==0)return0;if(n==1)return1;if(n1)returnfib(n-1)+fib(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。