前 言
“请问新书《算法实践手册》什么时候出版?望眼欲穿啊……”
自《算法竞赛入门经典》(以下简称《入门经典》)出版以来,我收到的这样的来信已经不计其数。
不过,我心里有着自己的打算。《入门经典》的出版固然为广大算法爱好者提供了一些帮助,但其中的缺憾也是很明显的,如例题太少,习题没有中文翻译,而且限于篇幅,基础知识还没讲完……这样看来,《算法实践手册》的出版时机尚未成熟,还需要一本书来铺垫,弥补上述缺憾。可惜的是,由于创业的繁忙,这个想法一直未能实现。
2010年8月底,我收到了一封读者的E-mail,和我探讨《入门经典》中的一些问题,从此和本书的第二位作者陈锋相识。我万万没有想到,这位来自银行业的软件工程师、产品架构师学习编程的时间只有两三年,他对算法的热爱、严谨求实的态度和认真刻苦的专业精神绝不亚于有着多年算法和软件工程经验的行家。在与陈锋的交流过程中,我重新开始了对这本新书的构思。
事实上,在《入门经典》的写作过程中,完成的书稿远远不止印刷出来的220多页,只是因为篇幅和内容限制没有用到该书中。如果好好地把这些书稿加以整理,再算上笔者多年来外出讲课时制作的课件、题目翻译,那么本书的轮廓已经呼之欲出。这些东西对我来说已经是老生常谈,但接触算法不久的陈锋却觉得很新鲜。这样,我萌生出了一个有趣的念头:和陈锋一起合著一本书,我提供资料和总揽全局,而陈锋一边学习以前没有接触过的新知识,一边把这些东西按照适合初学者的方式重新进行组织和细化,并以“没参加过算法竞赛的软件工程师”这样一个独特的视角提出各种意见和建议。
细水长流了一年多之后,这个构想终于成为了现实。虽然大量的业余时间都奉献给了这本书,但我相信这是值得的。
参与本书编写和校对工作的还有中国人民大学的陈卓华和陈怡、北京大学的鲍由之(绘制了书中的几乎全部插图)等;一位不愿透露姓名的台湾朋友阅读了几乎全部书稿并给出了非常详细的修改意见。为了更好地配合本书,我在UVa上举办了3场专题比赛(数据结构、几何、实用程序),并将其中的典型题目收录在了正文例题或者习题当中。由于题目难度颇大,如果没有李益明、梁盾、沈业基、李耀、周而进、陈卓华、陈怡、唐迪、李晔晨、肖刘明镜、鲍由之等朋友的鼎力相助,这些比赛几乎不可能取得圆满成功。
另外,我还要感谢CCF(中国计算机学会)的杜子德秘书长、吴文虎教授、王宏教授等,还有NOI科学委员会及竞赛委员会的专家们,以及ACM/ICPC亚洲区主席黄金雄教授和中国指导委员会秘书长周维民教授。他们都是我的良师益友,在我接触NOI和ACM/ICPC以来的十多年里让我学到了很多东西。
感谢清华大学出版社辛勤劳动的编辑们,尤其是与我合作多年的朱英彪老师,在本丛书的编写、出版和推广方面都做了大量的工作,是一位真心实意为读者着想的好编辑。
最后,感谢我的爸爸妈妈。不管我做什么,不管别人怎么说怎么看,你们总是那样的支持我,让我可以全身心的投入自己喜爱的事业,没有半点后顾之忧。你们教给我的善良、感恩和奉献,正是我多年来坚持写书的源动力。
刘汝佳
许多计算机相关专业的人在毕业之后除了为应付面试外基本都很少再去碰算法,而在实际的产品或者项目开发过程中,大多数人也没有必要亲自去实现复杂的算法。因此,算法渐渐淡出程序员的日常生活。同时,在现实生活中有另外一种声音:程序员的生活太纠结,coding的速度永远跟不上需求变化的速度,提需求的客户似乎成了程序员的“天敌”,成了他们“苦逼”生活的罪魁祸首。
那么,一本讲算法比赛的书跟这又有多少关系?就从我自身的经历说起吧。我不是计算机科班出身,但因种种原因进入了这个行业,而且是从一个很低的起点进入。于是我像所有人一样,平时很难静下心来学习算法,有的面试就去临时抱本书突击一下。终于有一天我受不了这种循环,问自己难道一定是为了一个急功近利的目的才去付出自己的时间吗?佛家有句话叫“凡夫求果,菩萨求因”,我就想,既然成不了圣人,就学一回圣人吧。
因缘际会,我接触到了《入门经典》及其作者刘汝佳,于是一发不可收拾,写这本书的过程也变成了修行与学习的过程。慢慢地,我发现算法对于实际工作的人而言,有着比应付面试更大的价值。所谓的算法、组件、模式,就像是一些基础的原材料,对于优秀的建筑师来说,需要透彻的理解(不一定写得很熟练)它们的关键性。因为一个错误的设计,对于系统来说,所要付出的代价远比一般的程序bug要高得多。更进一步说,现在做软件的为啥苦,为啥抱怨需求变化快?因为解决问题的思维有偏差。需求分析绝对不是简单地拿着需求,直接翻译成代码——这是最低层次的。算法分析的意义,更多地不在于性能,不在于那些脑筋急转弯,而在于发现纷繁复杂的问题背后的不变式,而这正是本书要着力与大家分享的。
没有大家的支持和帮助,这本书几乎是不可能写好的。尤其要感谢我的家人和朋友,为了这本书的写作,他们投入了大量的时间和精力。这里尤其是在我工作非常繁忙的情况下,写作占用了大量跟家人在一起的时间,没有妻子梁明珠和女儿婉之的支持,我几乎不可能集中精力参与本书的写作过程。
另外,也感谢我的同事徐海波、张大用、周洲、王洪桥、朱宗耀、朱洁晨等,他们不仅在工作上给了我非常大的支持和帮助,也对我参与写作的章节提出了很多非常好的建议。
陈锋
声明:书中用到了大量的例题和习题,感谢这些命题者和竞赛组织方的辛勤劳动。笔者已经尽可能地找到他们并征求了题目的使用权,但如果你认为本书侵犯了你的权益,请与出版社和作者取得联系。在UVa网站上可以找到本书大多数例题/习题的作者。
算法竞赛入门经典——训练指南
前言
·IV·
·V·