4月 11

一点关于算法竞赛的随想

最近由于有点脑子发热,又想要玩玩topcoder,但是今天有人让我帮看一个匈牙利算法的程序的错误,让我对类似于topcoder这种竞赛产生了一点思考。

我记得之前看过有个人写了一篇很长的文章,说他在面试Facebook的时候因为不能在短时间完成面试官提出的算法而被涮了,然后回来之后写了一篇感想。找了半天,终于找到了,在这里:http://www.ituring.com.cn/article/details/1368。我想能去Facebook面试这个人应该是很NB的,我很同意他在感想里的观点,或许像Topcoder竞赛里的牛人那样能迅速写出某个算法的确是一种能力,但是这种极端的能力或许在工作和科研中根本不是必要的。另外,我一直认为程序代码的可读性是最重要的,而我今天收到的程序,一上来就是:

int sum=0, i, u, v, t, d, e, cur, tail; 

这种单字母变量,我在高中时写代码就不用了。那份代码甚至为了少打字,把本该写在循环体里的内容放到循环语句里面去:

for(tail–, flag=1, d=u, e=v;d!=-1; t=cx[d],cx[d]=e, cy[e]=d, e=t, d=pred[d]);

老实说这种代码我一看就头疼。这样的代码,除了在像Topcoder的比赛里这种极端情况下使用(Topcoder里每晚一分钟提交分数就会损失惨重),其他任何情况都用不到。可以想象,这份代码如果作为一个标程被发布的话(事实上就是人家从网上找了这份代码运行通不过),我可以毫不客气的说,作者有一种幼稚的炫耀病,试图用这种单行代码炫耀自己的能力。

唉,如果Topcoder就是要让我们写出这样的代码来的话,那我自认我的确也是不适合这种竞赛。

另外还想抨击一点,就是关于这个“c+=-a+++(++b);”,还有这个“a=(++i)+(++i)+(++i)”求这种式子的结果。貌似总有这样的编程题在面试里,各种题库里。我想说这种式子也就只能用于这样的场合,有意义么?(除了考编译原理除外)更不客气的说,纯SB。要是我在找工作时面试官问我这样的问题,我想这个公司也就这种水平,我将立即拍拍屁股走人。

看到有大神在博客里这样说:搞ACM有个好处就是让偶们知道什么叫做天外有天。我也向来持这种观点,往往那些越牛的人,越知道世间牛人之多,而偶等菜鸟却越容易自鸣得意。如果成天执迷于这种++i的游戏,又自以为得意,那眼光实在是太短浅了。