有关ACM的一点想法

今天听了我们学校的ACM负责人,程序设计课程组姜学峰老师的ACM宣传讲座,十分激情。甚至准备就要开始买本竞赛入门来看了。

我想买竞赛书来学竞赛算法,已经不是第一回了。不过我的内心总有一个担心,不知道有没有人能够为我解答。

今天的演讲精彩程度我就不说了,ACM人才也被全世界各大IT企业所争夺我也不说了。我的担心就是这个训练的过程。话说中国的数学类竞赛在世界上的排名一向是不错的。ACM虽说是计算机的竞赛,但是我感觉其实也部分属于数学竞赛。一般玩竞赛的人都会经历一个集训的过程。这个过程就是没日没夜的学习算法,把算法打在电脑上,编译运行,调试,最终得出正确结果。如此循环。

我所惊讶的是,玩竞赛的人,学习数据结构和算法的速度相当快,快得简直让人惊奇。我仔细想了一下,这个速度快的原因是因为将基本理论的推导过程省略了,直接学习已经存在的各种数学,各种算法。将他们一遍又一遍的用键盘给”背”出来,编译。这样的学习算法当然是非常快的。

而正正规规按部就班学习算法的人经过的训练则不一样了。往往先提出一个问题,然后提出解决这个问题的瓶颈所在,然后是思考时间。这个思考时间能够训练创造能力。

而竞赛训练把这个训练创造能力的东西给省略了。他们直接需要的是背诵现有的算法,不断的做题(其实不断做题就是为了接触到更多的已经存在的算法)。

再说说很多学竞赛的人,在非常短的时间内就学完了各种数学,什么线代,概率统计,组合数学,拓扑学……我觉得也是这个道理。他们在学习的不是这些数学被创造出来的过程,而是如何运用这些数学。

我在学习美国的这本《数据结构与算法》的时候,感觉和国内的专门为竞赛而编写的书籍的风格完全不同。竞赛的书籍能够让你在一个月内学会各种各样的数据结构,以及完全掌握这些数据结构相对应的各种著名算法;而这本美国人写的教程,则相当着重于思考如何创造出一种算法,单单是学习链表,若是不急于看答案,想一个问题就要想很长时间。

总的来说就是美国的训练,时间大量花在研究现有的算法如何被创造出来;

中国竞赛的训练,时间大量花在熟练掌握已有的算法上。

这一点和高中的全国数学竞赛是一样的。我在听高中奥赛讲座的时候,老师们就非常热衷于给我们介绍各种各样的伟大的数学定理,很多都是没听说过的,也不知道这些定理是怎么来的,就是要你把定理的用法背诵下来;背诵这五个伟大的定理,你就得了20分;背诵那五个伟大的定理,你就得了10分……

但是你没有获得提出问题的能力,没有获得解决你自己提出的问题的能力。

花费两三年的时间放弃其他东西而专门搞竞赛训练,若是获大奖那当然非常棒,也超出了死板训练的局限,得到了真正的提升,未来的就业也非常光明;但是对于真正爱好软件工程,程序设计,真正喜欢编程和计算机的人来说,是否需要全身心投入ACM竞赛,值得商榷。

对此话题有兴趣的同学,可以顺便阅读一下子中国奥林匹克数学和国际奥林匹克数学在发展方面的区别:http://www.zhihu.com/question/20371087