- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
减少冗余算法优化
第 PAGE 10页
减少冗余与算法优化
【摘要】
在信息学竞赛中,我们经常会遇到冗余,而冗余会造成算法、程序的效率不同程度的降低:有的是微不足道的,而有的会导致算法复杂度大大提高。本文针对后者,举例说明冗余对算法效率的影响和如何减少冗余。
【关键字】
冗余、算法优化
【正文】
一 引言
信息学竞赛中,我们所追求的目标之一,是使程序用最少的时间解决问题,也就是达到最高的效率。实际生活中也同样需要这样,高效率者往往会在竞争中取得优势。
冗余,是指多余的或重复的操作。在搜索、递推、动态规划等诸多的算法中,都会出现冗余。
由冗余的定义,要使算法达到最高的效率,必须去除算法中的冗余处理。但完全去除冗余是难以实现的,使程序用绝对最少的时间解决问题也是很难的,通常需要退一步,将目标改为:使程序用尽量少的时间解决问题。由冗余的定义,可以得到:要提高算法的效率,必须减少算法中的冗余处理。
要减少冗余,需要在大量的做题过程中,不断探索,不断积累经验。
下面就让我们通过两个具体的例子来研究冗余是如何影响算法效率的以及如何减少冗余。
二 整数拆分
2.1 问题描述①
①题目来源:金恺原创
将正整数N拆分成若干个整数的和,使拆分成的数是2的非负整数幂的形式。问有多少种拆分方案。如果两个方案仅有数的顺序不同,它们算作同一种方案。
如:
当N=5时,可以拆分成下面的形式:
5=1+1+1+1+1
5=1+1+1+2
5=1+2+2
5=1+4
所以,5有4种拆分方案。
2.2 粗略分析
此题可用递推解决(为什么?请读者自己思考 ^_^):
用表示i拆分成若干个数,其中最大的数不超过的拆分总数。则:
,即i拆分成若干个数,其中最大的数不超过的拆分方案只有一种:把i拆分成i个1。
当i0,j0时,由两类组成:第一类:拆分成的最大数正好是,其总数为;第二类:拆分成的最大数小于,其总数为。
所以。
最后要计算的目标是F[N,M]。
因为必须,所以,又有。不难得出:总的时间复杂度是此处所讲的时空复杂度都忽略了高精度的因素。因为当N达答案也只有60位,这个数字是比较小的。,空间复杂度也是。看上去,这个复杂度已经很低了。但是,复杂度能不能再低一点儿呢?
此处所讲的时空复杂度都忽略了高精度的因素。因为当N达答案也只有60位,这个数字是比较小的。
2.3 减少冗余
为了便于研究,可以首先处理N是2的整数幂这种特殊情况,然后把N不是2的整数幂的情况化为N是2的整数幂的情况处理。
2.3.1 当N是2的整数次
设(M为非负整数)。首先,为了讨论时更直观,把所有的对应到以I为横轴,J为纵轴的直角坐标系中的每一个整点上,将横坐标为i的点称为第i列的点、纵坐标为j的点称为第j行的点。(是第i列,第j行的点)
若点C是点A与点B的和当C为时,由递推方程,A、B分别为、。,则连有向边和 (
当C为时,由递推方程,A、B分别为、。
I
I
J
A()
B()
C()
1
2
3
4
5
6
7
8
1
2
3
0
图A (M=3,N=8)
根据递推关系将所有的边都连出来,可以得到图B。
I
I
J
D
1
2
3
4
5
6
7
8
1
2
3
0
图B (M=3,N=8)
E
观察要计算的目标,它是与的和,而是与的和;是与的和……可以看出,图中有很多的点(如图B中的D,E)的值求出与不求出都不影响最后的答案,所以这些点都没必要求出,都是冗余的,在图中也没必要向这些点连边。将这些冗余的点和边删掉,只留下最后可能影响到目标点的点和边,图B变成了图C的样子,可以看出,图C比图B简洁多了,要计算的点数也少多了。
I
I
J
1
2
3
4
5
6
7
8
1
2
3
0
图C (M=3,N=8)
那么,到底要计算多少个点呢?
观察图C,发现当j达到最大,即时第j行只需要计算1个值——;当时第j行要计算2个值——和;当时第J行要计算4个值——、、和……由此可以猜想:
①当时第j行要且只要计算个值。
②这些要计算的值是这个。
这两个猜想是否正确呢?答案是肯定的,下面用归纳法证明:
当时,第j行只要计算,这是显然的。猜想①、②此时都成立。
假设时成立,第j行要计算的为这个数。取,当时,由于第j行要计算,由递推方程,第行要计算,而计算又要用到,计算时要用到……,一直下去,最后所有的都要算出来。当取遍所有的时,就可以得到第行要计算哪些值,它们是这个数,这个式子和②的是一样的。所以此时猜想①、②仍然成立。
综合1°和2°,猜想①、②都是正确的。
由①,图中实际有用的点是个,而开始时计算了个,可见计算过程中的冗余数目远远大于必须计算的数目。如果去掉这此冗余的计算,算法的时间复杂度可能降到。
现在的问题变为:哪些点是要计算的呢?用②找要计算
原创力文档


文档评论(0)