- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《Pascal vs C++》解题报告
福州一中
[问题简述]
给N 个数 a[n],求这N 个数最多能够构成最长多少的等差数列,并且差值不为 0 。要
求给出一个具体的方案。
[数据规模及时空限制]
1、n=2000,Memory:16Mb,Time:0.25s
2 、n=10000,Memory:4Mb,Time:1s
[算法分析]
首先排序以及去除相邻项是必不可少的。求递增的等差数列和递减的等差数列是无所谓的,
因为他们是一一对应的。
数据规模 1 很明显是想让 想出一个时间复杂度 O(N^2)或者O(N^2 log N) 的方法,
并且对空间以及常数没有什么限制。
这应该还是没什么太大的难度的。令 f[i][j]表示倒数第二项为 I,最后一项为 J 的等差数
列最长有多少项。之后用 f[k][i]+1 更新,其中a[i]-a[k]=a[j]-a[i],这里的k 可以利用 Hash
表或者二分的方法来计算求出。这样,算法的时间复杂度就为O(N^2)或者 O(N^2 log N) ,
空间复杂度为 O(N^2) 。
但是这种算法对于数据规模 2 却是 为力了,且不说算法的常数比较高,空间就让人
难于承受,10^8 的 量就算是 byte 也 为力,更何况 4Mb 。Sigh~~
之后我曾经试图找一个低于 O(N^2) 的算法,但是始终没有发现任何方法,而通过在
discuss 上的 来看,这题似乎也不存在比 O(N^2)高效的方法, 只能尽量思考一些降
低常数的方法。
首先 应该抛弃掉定势思维,摒弃掉之前想的 N^2 的方法,因为那种方法对于空间
的问题 实在是无路可走了。
让 再从原始的方法上看看:用枚举的方法。枚举第一项,枚举第二项,看这个数列
能够有多长。这种方法最原始的时间复杂度为:O(N^3) 。但是 却去除了空间上的限制,
可以放手对算法进行优化。
首先最明显的优化就是:如果对于 I j k,有a[k] –a[j] = a[j] – a[i],那么 枚举了 I,j
后就没有必要再另行枚举 j,k 了,这个优化看似普通,但是它能够让 总的枚举数量降
到O(N^2)阶的,而 却很容易给忽视掉~~ 。
当然第一个优化只是让 有可能将算法复杂度变为 O(N^2) 的,但是接下来处理数列
时如果做得不够好的话,仍然不是N^2 级别的,这时候 就需要借助Hash 这个强大的武
器了,用 Hash 表来判断是否存在a[j] + (a[j] – a[i]) 。通过Hash,算法的时间复杂度就成功地
变为了 O(N^2) 。
但是这题不仅仅要求 时间复杂度为 O(N^2) 。他要求 常数写得尽可能的低。
于是还需要几个优化:1、最优性剪枝;2 、Hash 表;3、语言种类。
1、最优性剪枝:
假设当前最优解是res,那么如果数列中不存在 a[i] + res * (a[j] – a[i]) 的话,就没
有必要枚举之了,因为它不可能更新最优解。如果 a[i] + res * (a[j] –a[i])a[n]的话,
也没有必要继续枚举 i 作为首项了,因为之后的枚举公差都a[j] – a[i],而a[i] + res *
(a[j] – a[i])a[n]也保证了之后的枚举无法更新了。
2 、Hash 表:
首先要说的是:用开散列而不要用闭散列,因为闭散列的 比开散列的
只多不少,并且采用边表类型写法的开散列在常数上也不会比闭散列大;其次,在
Hash 值的设定上,建议使用位操作,并且越简便越好。一开始的时候 取模一
个质数之类的,这样 的机会会比位操作少掉很多,毕竟不会有什么人刻意的
去找你设置的质数值,然而提交之后却失望的TLE 了,原因主要在于,本题利用
Hash 的询问次数实在是太多了,如果采用太多次的模运算的
文档评论(0)