倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:“我只要一把锤子和一个锯”。但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你“我需要一些精确的工具”。由于计算机所解决的问题都是从生活中抽象出来的问题,其复杂性不言而喻,所以我们需要这样精确有效的工具去解决现实生活中的复杂问题。算法、数据结构都是程序设计中必不可少的精确工具。算法的重要性是每一个程序员都十分清楚的。
程序设计当中解决得相当一部分问题都会涉及各种各样的科学计算,这需要程序员具有什么样的基础呢?实际问题转换为程序,要经过一个对问题抽象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设计良好的程序。从中我们不难看出计算数学在程序设计领域的重要性。
算法与计算理论是计算机程序设计领域的灵魂所在,是发挥程序设计者严谨,敏锐思维的有效工具。任何的程序设计语言都试图将之发挥得淋漓尽致。作为计算机专业软件相关无可厚非的最重要基础类核心课程,我们首先对于这个领域的优秀参考进行一个推荐。
作为这方面的介绍,如果不介绍下面这本唯恐大师们笑话,即是计算机程序设计的史诗TAOCP:
《计算机程序设计艺术》
包含:《 计算机程序设计艺术 第1卷 基本算法 (第3版) 》、《 计算机程序设计艺术 第2卷 半数值算法(第3版) 》、《 计算机程序设计艺术 第3卷 排序与查找 (第2版) 》
英文名称:
The Art of Computer Programming
作者:
Donald.E.Knuth
Donald.E.Knuth人生最辉煌的时刻在斯坦福大学计算机系渡过,美国计算机协会图灵奖的获得者,是本领域内当之无愧的泰斗。被简称为TAOCP的这本巨著内容博大精深,几乎涵盖了计算机程序设计算法与理论最重要的内容。现在发行的只有三卷,分别为基础运算法则,半数值算法,以及分拣和搜索。总共应当有7卷。以我个人对本系列书的把握,大家除了可以如其它书籍那样阅读本书,也可以将其作为计算机程序设计的字典。毕竟内容涵盖实在是太广泛,相当的内容未见得你能够用上,还是那句话,按需吧。看本书时最关注的应当是作者严谨的思维方法。每个人都有自己的读书方法,一些大师们说应当顺序读本书,因为它被写得简直就像是诗,然而这还要看大家个人的体会。至于本书的价值我觉得Bill Gates先生的话足以说明问题:“如果你认为你是一名真正优秀的程序员读Knuth的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历”。作者数学方面的功底造就了本书严谨的风格,虽然本书不是用当今流行的程序设计语言描述的,但这丝毫不损伤它“程序设计史诗”的地位。道理很简单,它内涵的设计思想是永远不会过时的。除非英语实在有困难,否则建议读者选用英文版。
如果将TAOCP比喻成“计算机程序设计理论的荷马史诗”,那么被简称作CLRS的《算法导论》不妨称它作 “计算机算法的圣经”。
《 算法导论(第二版影印版) 》
英文名称:Introduction to Algorithms
作者:Thomas H. Cormen ,Charles E. Leiserson ,Ronald L. Rivest ,Clifford Stein
本书的主要作者来自麻省理工大学计算机,作者之一Ronald L.Rivest 由于其在公开秘钥密码算法RSA上的贡献获得了图灵奖。这本书目前是算法的标准教材,美国许多名校的计算机系都使用它,国内有些院校也将本书作为算法课程的教材。另外许多专业人员也经常引用它。本书基本包含了所有的经典算法,程序全部由伪代码实现,这更增添了本书的通用性,使得利用各种程序设计语言进行程序开发的程序员都可以作为参考。语言方面通俗,很适合作为算法教材和自学算法之用。国内的很多作品名为数据结构,从本书中断章取义,把数据结构与算法混为一谈,搞得作者自己都迷迷糊糊。这也是不十分愿意向大家推荐国内作品的原因。你会发现,现在基本上所有的数据结构与算法书籍都会将本书作为参考文献之一,更可以说明一个问题,本书是作为读者进行算法学习的最佳选择。作为本书的补充内容,我愿意向大家推荐下面的学习资料:你可以通过这个地址找到本书的所有练习答案:http://www.itu.dk/people/beetle/ 。为了更好的学习本书中的内容,最好的指导当然是来自作者本身讲述本书的课程,读者们可以通过下列地址获得课程的录像。
http://18.89.1.101/sma/5503fall2001/index5503fall2001.html
哦,你也许会对我说:“天哪,《 算法导论(第二版影印版) 》上面都是伪代码,我程序设计功底没有那么强啊”。是的,对于大部分的大学生来说的确存在一个很严峻的问题,就是程序设计还没有坚实的基础,而你此时需要掌握一些算法知识,那么这个时候一本带有理论的具体语言实现的指导教材便是绝佳的参考:
《 算法Ⅰ-Ⅳ(C++实现)——基础、数据结构、排序和搜索(第三版) 》
此书属于Algorithms in C++系列中的一本。作者都是普林斯顿大学计算机系赫赫有名的教授Robert Sedgewick, 他是Donald.E.Knuth大师们下的高徒。算法理论方面并不逊色于CLRS,对于初学者来说附带理论关键部分的原程序是个很好的参考,这系列书提供了两个语言版本:分别为C++和Java程序员和学习者量身定做。Java版本的叫做Alogorithms in Java,国内清华大学出版社引进了本书并出版了影印版:《 JAVA算法(影印版)(第3版 第1卷) 》。作为专门语言的算法书籍参考,这两本也是我唯一愿意向大家推荐的。可以作为《算法导论》一书的补充。
计算机数学理论方面可推荐的书籍是相当多的,究竟哪些数学理论基础是我们应当涉足的,哪些基本上我们是不需要的,大家可以参考《CSDN开发高手》9月刊上的《计算机科学技术数学理论浅谈》,或者通过下面的地址浏览此文:http://www.cstc.net.cn/docs/docs.php?id=111
离散数学在计算机数学理论领域的位置显然是首屈一指的,首先向大家推荐的就是:
离散数学在计算机数学理论领域的位置显然是首屈一指的,首先向大家推荐的就是:
《 离散数学及其应用(原书第4版) 》
英文名称:Discrete Mathematics and Its Applications,Fourth Edition
作者:Kenneth H.Rosen
本书的价值已经被全世界几百所大学所证实,作为离散数学领域的经典教材,全世界几乎所有知名的院校都曾经使用本书作为教材。以我个人观点看来,这本书可以称之为离散数学百科。书中不但介绍了离散数学的理论和方法,还有丰富的历史资料和相关学习网站资源。更为令人激动的便是这本书少有的将离散数学理论与应用结合得如此的好。你可以看到离散数学理论在逻辑电路,程序设计,商业和互联网等诸多领域的应用实例。考虑到大多数读者的基础,这里推荐给大家的是本书的中文版(原书第四版),本书的英文版(第五版)当中更增添了相当多的数学和计算机科学家的传记,是计算机科学历史不可多得的参考资料。作为教材这本书配有相当数量的练习。每一章后面还有一组课题,把学生已经学到的计算和离散数学的内容结合在一起进行训练。这本书也是我个人在学习离散数学时读的唯一的英文教材,实为一本值得推荐的好书。
《 具体数学:计算机科学基础(英文版.第2版) 》
英文名称:Concrete Mathematics A Foundation for Computer Science(Second Edition)
作者:Ronald L.Graham,Donald E.Knuth,Oren Patashnik
传统数学研究的对象过于抽象,导致对具体的问题关心不够。为了直接面向应用的需要,伟大的计算机科学家以及数学家Donald.E.Knuth在麻省理工大学提出了“具体数学”。自从那天起,“具体数学”便成了计算机科学的基础。所以下面为大家推荐的就是一本经久不衰的著作:
英文名称:Concrete Mathematics A Foundation for Computer Science(Second Edition)
很令人兴奋的就是这本书的主要作者正是泰斗Donald.E.Knuth以及他的同事Ronald L.Graham。书稿是他们在1970年的时候在计算机系教授研究生本门课程的基础上整理出来的教材。内容上是Knuth的巨著TAOCP第一部的扩展,有些比TAOCP中谈及地又深入了许多。重点放在高级计算机程序设计话题以及算法分析上,涉及了计算机科学领域内相当全面的数学知识。具体数学是离散数学和连续数学的综合,书中这点做得极为出色,许多经典问题的解答比目前广泛流传的解法更为通俗易懂。对于提高大家的计算数学修养有很大帮助。之所以TAOCP有的时候读者们读不懂就是因为计算数学基础不是十分扎实,但以我个人经验,若能对本书中内容有一个比较好的理解,会给你阅读如TAOCP这样的旷世巨著带来很大的方便。
作为计算机专业的学生,大概至少都曾经听说过ACM-ICPC程序设计大赛,这也是至今为止代表着全世界最高水平的程序设计大赛。每年国内也有很多学生参加此赛事,然而此赛事涉及面之广令不少人望而却步,也正是因为比赛涉及的计算理论内容之深广,才使大赛的水平得到了全世界的认可。如果你也在准备这方面的比赛,除了上面的《计算机程序设计艺术》你不是必须参考外,都应当予以足够的重视,此外下面这本书也是不错的选择:
《 算法艺术与信息学竞赛 》
哦,是的,刘汝佳和黄亮,这两个名字对于曾经关注过NOI,IOI以及ACM-ICPC比赛的你来说一定不是陌生的名字,也可以这样说,他们是在这些比赛以及相关培训中相当活跃的两个人,由于书的作者号召力相当大,我在这本书出版后很快就买到了并进行了研读。内容涉及上述三种比赛,算法原理阐述扼要,内含大量比赛原题,题库中的经典试题以及各个著名院校队伍自拟的优秀算法题。主要内容分为:算法与数据结构,数学知识和方法以及计算几何学。是一本算法与计算理论相关较为完善的资料结集。2003年如果你还苦于公开出版的相关书籍版本太老,没有新内容,那么本书便是你近期参加NOI,IOI以及ACM-ICPC比赛的不二选择。
概言之,算法与数学乃程序设计之本,计算科学之精华,尚需同学们予以足够的重视。但有一点需指明,不论是理论计算科学还是程序设计,皆通一理:不是所有的内容都需要大家掌握,长远之计乃是在大学学习相关学科的时候对该学科有一个全揽,晓之用途,在自己极为感兴趣或者研究、开发需要的时候深入其中……
(转)应该怎样读TAOCP
谈谈我自己读这套书的心得。抛砖引玉。
首先要清楚这套书的定位:它是古典的算法分析的工具书。
1.古典(classic)体现在模型和问题上。
模型就是顺序算法(sequential algorithms)的经典模型。大名鼎鼎的MIX并非是个程序设计语言这么简单,而是一个计算模型:即标准指令集RAM。这是个非常经典,也是非常符合现实的上界(upper bounds)模型。
该书涉及到的问题是计算机科学诞生之初就自然面对的几个基本的算法和数据结构的问题。时至今日,这些问题还在应用中扮演着重要角色;在很多研究课题中,它们是基础或原型。
2.算法分析(analysis of algorithms)是此书的核心。
TAOCP并没有综述算法设计(design of algorithms)的各种思想;也没有介绍证明问题下界(lower bounds)的各种技巧;也并没有对问题、模型、复杂度这些专题作出体系性的阐述。可以说,TAOCP的几乎所有的篇幅都放在了对具体算法的性能分析上,并把这条路走到了极致。
3.工具书。这最有争议,因为毕竟还有习题。一些介绍也饶有趣味,不太符合大家对工具书的枯燥这一成见。
但把TAOCP看作工具书还是教材,这就关系到怎么去读这本书。
(一)该顺着读还是跳着读:个人认为,没有哪本专业书是不能跳着读的。但前提是你对整个书的结构比较清楚,对它的内容也一定程度的熟悉。知道自己想要查阅的部分。如果是初学者,则不建议这么作,至少还是老老实实的把第一章顺序读下来。可是TAOCP并不是给初学者看得。
(二)初学者适合读TAOCP吗:不太建议。但也要看如何定义初学者——吾生而有涯,而知也无涯。一定程度上,每个人都是初学者。读 TAOCP的前提,就是自己至少比较清楚轻重缓急,可以大概判断那些是根本,那些过时,那些是炫技。这根据每个人的需要,都有各自的具体情况,但至少心里要有点数。如果读书时觉得前路茫茫,完全不知哪里重要。那么去正经的选一门算法基础课才是更应该作的。
(三)MIX值得用心学吗:这要首先清楚Knuth为什么要在这个讲算法的书里搞出个MIX。个人理解,原因有三。其一,如上所述,计算模型;其二,作者个人的审美品味;其三,用于描述算法的语言。第一条里MIX是桥梁作用,确保数学上的严谨,同时也足以代表现实中典型的计算机体系结构。第二条是美学意义。第三条的作用等于伪码。算法用MIX写一遍,这是为了确保上界算法在模型内的严谨性。整个书都没有用MIX模型来证明任何下界,因此除了确保严谨性,MIX没有在数学上起到实际的用途。因此,过分钻研MIX对于理解书中算法没有太多帮助。但如果纯粹只是个人兴趣则另说。
(四)习题该怎么对待:TAOCP是为数不多的计算机专著里面能出这么多高水平习题的了。如果有大块的时间,能做一做当然最好不过。但如果只是一般的查阅,习题并非必要。不过有的习题本身就是经典问题。如果正文里没有找到想要的东西,不仿看看习题。
(五)如何读正文里的算法分析:TAOCP里面的算法分析,算是古典算法分析里面的原教旨主义。始作俑者就是Knuth本人,后面还有 Sedgewick和Flajolet等一干人等给他发扬光大。这一派的作风可以说分毫必究,连常数都不放过。但数学工具却无外乎初等的《具体数学》的工具。这是很好很强大的东西,掌握好了,无论研究还是工作都很方便。但其实TAOCP的数学都不算太难,仔细倒是真的。因此,如果时间不是特别充裕,对书中结构的了解,要比具体分析步骤重要。这些经典内容多少年就没变过,每次有用时都可以回来查查看,每查一次说不定会有新的收获。
(六)TAOCP的不足:前面已经提过了,下界(lower bounds)介绍的不够。下界结果,大多数只在章节结束的讨论部分引用一下。第三卷的查找(searching)一章,一些近些年的下界方面的新进展都没有被引用,Knuth可能没有想到,数据结构这个经典方向这么多年来都在不温不火的不断前进着,尤其是下界。类似的也有第二卷的随机数(random numbers)一章,可以说连上界都严重过时,错过了去随机(derandomization)的黄金时代。好在其他几章这么多年来无甚进展,没怎么过时。
许多人对TAOCP的推崇是无条件的,这里难免有人云亦云的成分。其实大可不必,读的人尽管放轻松。这么说不是因为TAOCP不值得推崇,而是就算把一切溢美之词都抛于脑后,随着岁月流逝,反复的阅读,你也一定会越来越喜欢这部书的。它的魅力经的起时间的考验。
首先要清楚这套书的定位:它是古典的算法分析的工具书。
1.古典(classic)体现在模型和问题上。
模型就是顺序算法(sequential algorithms)的经典模型。大名鼎鼎的MIX并非是个程序设计语言这么简单,而是一个计算模型:即标准指令集RAM。这是个非常经典,也是非常符合现实的上界(upper bounds)模型。
该书涉及到的问题是计算机科学诞生之初就自然面对的几个基本的算法和数据结构的问题。时至今日,这些问题还在应用中扮演着重要角色;在很多研究课题中,它们是基础或原型。
2.算法分析(analysis of algorithms)是此书的核心。
TAOCP并没有综述算法设计(design of algorithms)的各种思想;也没有介绍证明问题下界(lower bounds)的各种技巧;也并没有对问题、模型、复杂度这些专题作出体系性的阐述。可以说,TAOCP的几乎所有的篇幅都放在了对具体算法的性能分析上,并把这条路走到了极致。
3.工具书。这最有争议,因为毕竟还有习题。一些介绍也饶有趣味,不太符合大家对工具书的枯燥这一成见。
但把TAOCP看作工具书还是教材,这就关系到怎么去读这本书。
(一)该顺着读还是跳着读:个人认为,没有哪本专业书是不能跳着读的。但前提是你对整个书的结构比较清楚,对它的内容也一定程度的熟悉。知道自己想要查阅的部分。如果是初学者,则不建议这么作,至少还是老老实实的把第一章顺序读下来。可是TAOCP并不是给初学者看得。
(二)初学者适合读TAOCP吗:不太建议。但也要看如何定义初学者——吾生而有涯,而知也无涯。一定程度上,每个人都是初学者。读 TAOCP的前提,就是自己至少比较清楚轻重缓急,可以大概判断那些是根本,那些过时,那些是炫技。这根据每个人的需要,都有各自的具体情况,但至少心里要有点数。如果读书时觉得前路茫茫,完全不知哪里重要。那么去正经的选一门算法基础课才是更应该作的。
(三)MIX值得用心学吗:这要首先清楚Knuth为什么要在这个讲算法的书里搞出个MIX。个人理解,原因有三。其一,如上所述,计算模型;其二,作者个人的审美品味;其三,用于描述算法的语言。第一条里MIX是桥梁作用,确保数学上的严谨,同时也足以代表现实中典型的计算机体系结构。第二条是美学意义。第三条的作用等于伪码。算法用MIX写一遍,这是为了确保上界算法在模型内的严谨性。整个书都没有用MIX模型来证明任何下界,因此除了确保严谨性,MIX没有在数学上起到实际的用途。因此,过分钻研MIX对于理解书中算法没有太多帮助。但如果纯粹只是个人兴趣则另说。
(四)习题该怎么对待:TAOCP是为数不多的计算机专著里面能出这么多高水平习题的了。如果有大块的时间,能做一做当然最好不过。但如果只是一般的查阅,习题并非必要。不过有的习题本身就是经典问题。如果正文里没有找到想要的东西,不仿看看习题。
(五)如何读正文里的算法分析:TAOCP里面的算法分析,算是古典算法分析里面的原教旨主义。始作俑者就是Knuth本人,后面还有 Sedgewick和Flajolet等一干人等给他发扬光大。这一派的作风可以说分毫必究,连常数都不放过。但数学工具却无外乎初等的《具体数学》的工具。这是很好很强大的东西,掌握好了,无论研究还是工作都很方便。但其实TAOCP的数学都不算太难,仔细倒是真的。因此,如果时间不是特别充裕,对书中结构的了解,要比具体分析步骤重要。这些经典内容多少年就没变过,每次有用时都可以回来查查看,每查一次说不定会有新的收获。
(六)TAOCP的不足:前面已经提过了,下界(lower bounds)介绍的不够。下界结果,大多数只在章节结束的讨论部分引用一下。第三卷的查找(searching)一章,一些近些年的下界方面的新进展都没有被引用,Knuth可能没有想到,数据结构这个经典方向这么多年来都在不温不火的不断前进着,尤其是下界。类似的也有第二卷的随机数(random numbers)一章,可以说连上界都严重过时,错过了去随机(derandomization)的黄金时代。好在其他几章这么多年来无甚进展,没怎么过时。
许多人对TAOCP的推崇是无条件的,这里难免有人云亦云的成分。其实大可不必,读的人尽管放轻松。这么说不是因为TAOCP不值得推崇,而是就算把一切溢美之词都抛于脑后,随着岁月流逝,反复的阅读,你也一定会越来越喜欢这部书的。它的魅力经的起时间的考验。