ImageVerifierCode 换一换
格式:DOCX , 页数:43 ,大小:86.19KB ,
资源ID:19786600      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19786600.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法效率与程序优化Word文件下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法效率与程序优化Word文件下载.docx

1、便十分重要。可利用计数足够一定次数后再统一 MOD循环完后再 MOD使用中间变量记录 MOD结果等方法减少次数。在高精度计算中,许多人喜欢边运算边整理移位,从而在内层循环中有除、模运算各一次,效率极低。应该利用int的数据范围,先将计算结果保存至当前位,在各位的运算结束后再统一整理。以下是用统一整理法编写的高精度乘法函数,规模为 10000位。int a10000=0,b10000=0,c10000=0;void mul() int i,j,t;for(i=0;iv10000;i+)for(j=0;jv10000-i;j+)ci+j+=ai*bj;i9999; ci+1+=ci/10;ci%=

2、10;以上函数运行后,平均用时。以下是边运算边整理的程序。10000;jy) x=y;净运行时间,与加法运算速度相当。故比较运算也属于较快的基本运算。二、 位运算的速度(1)左移、右移x净运行时间无法测岀,证明位运算速度极快。而使用自乘计算需要,自除运算需要,所以尽可能使用位运算代替乘除。(2)逻辑运算t=x|y; t=xAy; t=x&y;净运行时间约30ms,比加法运算(约 40ms)快较多,是因为全是按二进制位计算。但加减与位运算关系并不大,所以利用位运算主要是利用左右移位的高速度。三、 数组运算的速度(1)直接应用数组for(k=0;kk+)t=qk;净运行时间。这里计算了内层循环的时

3、间。若改为0;t=q0;则净运行时间为,很快,与的循环时间相比,可以忽略。故应用数组,速度很快,不必担心数组 寻址耗时。同时我们发现,循环耗时在各种运算中是很大的,仅次于乘除,故我们要尽量减少循环次 数,能在一个循环中解决的问题不放在两个循环中,减少循环变量次数。(2)二维数组5000;t=zik;实际运行时间为,若规模扩至 10000则10s内无法岀解,由于频繁访问虚拟内存。可以试想,若物理内存足够大,则运行时间约为 320ms,仅为的基准运行时间的 3/2,差距似乎并不是很大;由此推得其净运行时间约为 120ms。但相较加、减等简单操作,速度仍为 3倍,尤其与几乎不需时间的一维数组相比差距

4、巨大。尤其是在计算中,二维数组元素经常调用,时间效率不可忽视。所以,对于已知数目 不多的同样大小的数组,可用几个变量名不同的一维数组表示,如 x、y方向,两种不同参数,而不要滥用二维数组。在滚动数组中,可用两个数组交替计算的方式,用二维数组同样较慢。四、实数运算的速度测试方法与“基本运算”类似。运算符=+-*/%long intin t64double-由上表可见,涉及乘除、取模时 int64很慢,要慎用;int显然最快,但对大数据要小心越界。若一组变量中既有超岀 int的,又有不超过int的,则要分类处理,不要直接都定义成 int64,尤其在乘除模较多的高精度过程中。以上讨论了主要基本运算的

5、速度问题。概括起来说,除、模最慢,二维数组较慢,加减乘、逻辑 位运算、比较大小较快,左右移位、一维数组、赋值几乎不需要时间。而循环 for或while语句十分特殊,它的运算速度大于判断大小、自加控制变量所用时间之和,无论采用内部 if判断退岀,还是在入口处判断,都回用去约 200ms的时间。所以尽量减少循环次数,是优化算法的关键。对于双层或多层的循环,应把循环次数少的放在最外层,最大的循环位居最内部,以减少内层循环的执行次数。第二章各种算法的速度一、排序算法的速度1.冒泡排序20000;ai=ra nd();s=clock();i aj)b=clock();运行时间:1407ms2.选择排序

6、n; max=0;if(ajamax)max=j;bi=amax;amax=-1000000;t=clock();1220ms3.插入排序 t=ai;for(j=i-1;j=0;j-)t)break;for(l=i;lj+1;l-)al=al-1;aj+1=t;984ms以上三种都是 0(n2)的排序,其中插入排序最快,且可以用指针加以优化。从编程复杂度上,冒 泡排序最简单。从算法的稳定性上,插入排序是稳定的,即排序后关键字相同的记录顺序不改变,特 别适用于表达式处理等问题。一般的选择排序是不稳定的,但这里给出的程序由于使用了人类最原始 的方法,即依次选择最大的并排除,故是稳定的。冒泡排序是不

7、稳定的,涉及必须保持数据原顺序的 题目时不能选择冒泡排序,而必须选择稳定的排序方式。以下试验所采用的环境是: CPU In tel Core *2,内存512M,操作系统 Win dows 7 Ultimate Beta,程序语言C。编译环境Dev-c+,以下称为2号机。由于CPU速度较慢,且操作系统占用资源较多,程 序运行速度明显减慢,第一章的“基本运行测试”需要时间约为前者的 2倍,即为406ms。故第一章的程序运行时间此处应乘 2。4.快速排序的标准版#define MAXint aMAX;int p(i nt l,i nt r) int x=al,i=l-1,j=r+1,t;while

8、 do-j;while(ajif(ij)ai=aj;aj=t;else retur n j;void q(i nt l,i nt r) int n;if(lr) n=p(l,r);q(l, n);q( n+1,r);2948ms。注意:不要以为三种平方级排序方法的速度与快速排序可比拟,因为平方级 的数据范围是10000,而快速排序的范围是。对于 10000的数据,快速排序只需。另外,快速排序不是稳定的排序,需要保持原顺序的不能用此法。void p(i nt l,i nt r)r)while(1)else break;P(l,j);P(j+1,r);若程序改为以上形式,则运行时间为 2917ms

9、,稍快了一些,是因为减少了函数调用次数。对于函数调用,我们进行这样的测试。由此可见,调用函数本身并不浪费时间,仅相当于循环本身时间 400ms的1/40,相当于加法80ms的1/8,是很快的运算。但由于在函数内部需要进行现场保护,调用系统堆栈,所以用时大幅增加,定 义变量后只是一个自增运算就用去 120ms,相当于主程序中加法运算时间的 3/2倍。故函数中的运算比主程序中要慢,尤其是反复调用函数,会增加不必要的时间开销。所以,一些简单的功能尽量在一个 函数或主程序内完成,不要使用过多的函数;涉及全局的变量不要在函数调用时由接口给岀,再返回 值,尽量使用全局变量。这些方法可能使程序的可读性降低,

10、不利于调试,但有利于提高时效,正如 汇编语言程序比高级语言快一样。5.优化的快速排序(1)用插入排序优化由于递归调用浪费大量时间,本算法的思想是,当首尾间距小于 min时,改用效率较高的插入排序,减少反复递归。这个想法是好的,但运行效果并不如人意。当 min=4时,程序运行时间降为2901ms,优化幅度不大,且增加了编程复杂度,故不宜采用。其原因是递归调用、插入排序内部循环 所用时间过长。(2)用小数据判断优化if(l+1while(1)并排序归并排序是一种稳定的排序方法,且时间效率与快速排序相同,都是 0(nlogn)。但归并排序比快速排序的常数因子大,故快速排序还是最快的排序方法。归并排序

11、则适用于有特殊要求的题目,如不 满足交换律的表达式处理。int aMAX,bMAX;void comb in e(i nt from,i nt to) int i,t,mid=(from+to)/2,f,r;if(from=to|from+1=to)return;if(from+2=to) if(afromar)bi+=af+;else bi+=ar+;for(i=from;to;ai=bi;调用:combine(0,MAX);归并排序算法还可用于统计逆序对数。所谓逆序对,即为在一个数组 a中,满足iaj(或ai0);while(strcmp( nameloj, nameloi)bi)retu

12、rn 1;if(aireturn -1;return 0;1131ms,净运行时间约 725ms,相当于9次整数比较时间,比标准库函数稍慢。显然, 标准库函数是经过精心优化的,我们在有库函数可用时尽量用库函数,不仅降低编程复杂度,降低错 误率,还能提高时间效率。排序#define MOD 999997 源最短路径 dijkstra 算法void dijkstra() int i,j,m in=0;i+) disi=d0i; min=n;if(!usej&dijdimi n)min=j;use min=1;if(dismi n+dmi njdisj) disj=dismi n+dmi nj;随机

13、数产生器:MAX;if(i!=j)dij=ra nd();当MAX=2000时(即点数为 2000个),运行时间:。当 MAX更大时,内存会使用过多,故在 1s时限内至多运行规模为 2000的单源最短路径 35次。2.单源最短路径一一Ford算法int ford() int i,j;di=MAXINT;j n um;if(dfj+wjvdej) dej=dfj+wj;if(dfj+wjp=(struct misi ng *)malloc(sizeof(struct misi ng); qqb-p=(struct mis ing *)malloc(sizeof(struct mis in g);

14、qqa=qq a-p;qqb=qqb-poo=b;qqb-poo=a;n um=qqb-n um=c;qqi-p=NULL;disi=-1;yes0=1;wor0=0;dis0=0;while(beg!=e nd)x=qworbeg.p;while(x匸NULL)f(disx-poo=-1|(disx-poox-n um+disworbeg&disxpoo!=1) disx-poo=disworbeg+x- wore nd=x-poo;if(yesxpoo=O)yesx-poo=1;en d+;x=x-yesworbeg=0;beg+;,dis n-1); t=clock();随机数生成模块:fprintf(fp,%d %dn,n,10*n);10* n; j=ra nd()% n+1;k=ra nd()% n+1; while(j=k) j=ra nd()% n+1;%d %d %dn,j,k,rand();运行时间(不含文件操作):当n=100000时,运行时间 1937ms;当n=10000时,运行

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1