论细节优化的一些方法.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
论细节优化的一些方法

论细节优化的一些方法 广东北江实验学校 卢彦丞 指导老师 黄叶亭 【目录】 内容摘要 关键词 正文 多用位运算 使用合适的类型 数组下标上的优化 判重处理采用Hash表 能不用循环就不用循环 减少重复运算 把小循环放在外面 循环合并 与循环无关的条件应直接放在循环外 减少条件判断 另:标记时如何节省空间? 总结 内容摘要 本文主要讲的是细节优化节省时间的一些方法,也讲了标记数组节省空间的办法。 关键词:细节优化 代码优化 正文 一个程序超时怎么办?如何优化?有两种方法:“从大处着手”和“从小处着手”。“从大处着手”比较难,“从小处着手”却是人人都可以做到的。这里就主要谈谈“从小处着手”的方法,即细节优化的方法。 有一句谚语说:“细节决定成败。”为什么有时采用同样的算法,分数却相差这么远?这是细节优化到不到位的问题。细节优化也不容忽视。细节优化的方法有很多种,这里就列举几种关于节省时间的方法吧。 WAY 1 多用位运算,少用浮点运算。 如:n div 2 可以改为 n shl 1,如果你用trunc(n/2),那你就太不会节省时间了。一般乘以2的n次幂的式子可以改为左移,如: n*4 可以改为 n shl 2 x*16 可以改为 x shl 4 a*4096 可以改为 a shl 12 一般乘除法比加减法、位运算慢好几十倍。所以一个数乘以一个常量,可以用左移、加法组合代替。如以下的代码A可以改成代码B,代码C可以改成代码D,将会减少运行时间。 代码A: n:=0; while not eoln do begin read(c); x:=ord(c)-48; n:=n*10+x; end; 代码B: n:=0; while not eoln do begin read(c); x:=ord(c)-48; n:=n shl 3+n shl 1+x;//10=2^3+2^1 end; 代码C: p:=0; while not eoln do begin read(x); p:=p*1000+x; end; 代码D: p:=0; while not eoln do begin read(x); p:=p shl 10-p shl 4-p shl 3+x;//1000=2^10-2^4-2^3 end; 虽然繁琐了一点,但这也不失为一种尽量避免超时的好方法。 WAY 2 使用合适的类型 对于基于32位系统的Free Pascal,整型存取的速度从快到慢依次是longint/dword(32位)(二进制位,下同),integer/word(16位),shortint/byte(8位),int64/qword(64位)。而对于基于16位系统的Turbo Pascal和Borland Pascal,整型存取速度从快到慢依次是integer/word(16位),shortint/byte(8位),longint(32位),comp(64位)。时下竞赛常用的编译程序是Free Pascal,所以我建议大家多用longint和dword,少用其他整型。[空间需求量很紧可以考虑用integer/word,还不行再考虑shortint/byte,运算十几位(十进制位)的数可以考虑用int64/qword,能不用高精度就不用高精度]而对于浮点数的四种类型,建议大家看情况而用,这里列出来作比较: 序号 类型 占用空间 优点 缺点 1 single 4字节=32位 加减运算快 精度低 占用空间少 2 real 6字节=48位 乘除运算快 加减运算不如double快 占用空间较少 3 double 8字节=64位 加减运算快 乘除运算慢 精度高 占用空间较多 4 extended 10字节=80位 精度非常高 运算慢 占用空间多 WAY 3 对于数组结构,如果空间允许的话,将其下标改为0至2n-1。 如: var a:array[1..10000]of longint; 可以改为: var a:array[0..16383]of longint; 有人说下标改为1至2n,我认为这样不是最0~2n-1、2n~2·2n-1、2·2n~3·2n-1、……的方式寻址,而下标改为1至2n寻址时还得减1,何苦呢?而对于下标原本是1至2n的数组,如: var b:array[1..1024]of longint; 应该改为下标从0开始: var b:array[0..1023]of longint; WAY 4 对于判重处理,如果空间允许,采用Hash表来标记。 即hash[value]=0代表value代表的结点未出现过,可以出现;hash[

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档