众所周知,程序设计的过程,就是一个“分析问题——建立数学模型——选择数据结构——设计算法——翻译成计算机语言”的过程。在这个过程中,最后一步就是通常所说的编程序(更确切地说是编写代码)。学会一两门编程语言或者会用一两种开发工具仅仅是学会了最后一步。现有的计算机大部分都基于冯诺依曼体系结构,在该体系结构中,程序就是数据和代码的集合,数据是程序操纵的对象,其组织方式就是数据结构;代码则是程序的控制流程,负责对数据作某种变换,建立输入和输出数据之间的某种一一映射关系,这种映射变换的流就是所谓的算法步骤。
所以,从这个意义上说,程序= 算法+ 数据结构。
随着现代软件工业的飞速发展,软件开发方式和过去相比已经有了很大的变化,各种开发工具如雨后春笋般不断涌现。这些开发工具大部分都能够自动完成程序中一些机械的代码,并隐藏了其中的实现细节。再加上面向对象程序设计思想以及组件技术的发展,使得程序编写看上去就像搭积木一般简单。对于一些简单的应用程序,程序员关注的焦点不再是程序的算法和数据结构, 而是用户界面、可重用性、开发效率等。
在这样的背景下,初学编程者很容易产生错觉,以为学会用VB 、D e l p h i 做一个用户界面就算学会编程了,甚至有人连VC和C + + 是不是一回事都搞不清楚,数据结构和算法更是鲜有问津者。然而, 无论软件工程如何发展, 无论开发工具如何进步,只要我们的计算机还是基于冯诺依曼体系,数据结构和算法仍然是程序的核心, 永远不会被淘汰。
也许有人会说,“我只要会用别人写的类库就行了,不是有S T L 吗,都已经把常用的数据结构和算法封装了,我为什么还要在这上花时间呢?”持这种论调者在C S D N 论坛上有不少。对此我至少可以举出以下几点理由进行反驳:
1 .现在已经有计算器,那为什么还要学1 + 1 呢?因为我们要学会数学的基本思想和方法。学习数据结构和算法并不仅仅要求我们学会如何使用和实现某种数据结构,更重要的是学会分析解决问题的思想和方法。
2 .再先进的控件、再复杂的类库也需要人来写, 必须懂得算法和数据结构才能写出这些类库和控件。
3 .虽然说不知道内部细节, 并不妨碍使用类库或控件,但是如果了解其中的细节, 你会用得更加得心应手。更重要的是,当你手上的类库和控件无法满足你的实际要求时,你能够立刻写出一个来,而不需要花时间到处找,更何况即使花了时间也未必找得到最适合自已的。
4 .算法是解决问题的机械步骤。大多情况下, 人类解决问题的过程都是在实施某种算法,因此强人工智能主义者认为“人的思维也是一种算法”。且不论这种观点正确与否,但学习算法可以增强一个人的逻辑思维能力是毫无疑问的。仅仅从“让自己变得更聪明”这一点,就有必要好好学习算法和数据结构。
5 .还有一点, 我认为最重要: 算法和数据结构是程序编写中最具创造性、最具挑战性的部分, 也是最有趣的部分。倘若不学算法和数据结构, 仅仅是学会使用开发工具进行机械地编码, 编程还有什么乐趣可言?
正因为算法和数据结构在程序设计中如此重要,所以它一直是计算机专业的必修基础课之一,同时也是各类程序员考试的必考内容。然而,算法和数据结构的学习就像数学的学习一样, 很令人望而生畏。
虽然教材并不是影响学习好坏的第一因素,但是一本好书却常常让人豁然开朗、茅塞顿开。下面我根据自己的心得感受,推荐一些自认为比较优秀的有关算法和数据结构的图书,希望对大家有所帮助。
The Art of Computer Programming
作者:Donald E. Knuth
出版社:国内很难见到英文版;中文版由国防大学出版社发行,中译本名为《计算机程序设计技巧》,目前市场上很少见到,据说快要出第三版的中文版了。
推荐程度:五星级
使用语言:MIX
作者主页: http://www-cs-faculty.stanford.edu/~knuth/
电子版图书:超星数字图书馆(http://www.amsci.org/amsci/bookshelf/centurylist.html)有中文版第一卷和第三卷
适用对象:适用于有较高水平的读者,初学者不易读懂,但是极具收藏价值
推荐原因:该书简称TAOCP,是算法界公认的“葵花宝典”。这本书被American Scientist评为20世纪科学界最重要的12本学术著作之一,同此并列的其它11本著作包括Einstein的相对论、Dirac的量子力学、Mandelbrot的分形理论、Wiener的控制论等,由此可见这本书的价值。该书的作者Donald E. Knuth也是计算机界公认的大师,他是laTeX文件格式(一种业界通用的科技文献排版格式)的发明者,是编译原理中LR(k)文法分析算法以及其它很多著名算法的发明者。因为他在算法设计和分析领域的贡献,以及他所写的这本TAOCP,他获得了1974年计算机界的诺贝尔奖——图灵奖。
TAOCP原计划要出七册,但是一直到目前为止Knuth只完成了三册(原因是自从完成TAOCP的第三册之后,Knuth认为出版社将自已的书排得很不好看,于是花了20年时间自己发明了一种新的排版系统,即现在的科技界排版标准laTeX),而目前只能找到第一册和第三册的中文版。这本书最初写于60年代,当时还没有流行高级编程语言,所以Knuth自己发明了一种称为MIX的汇编语言,书中的算法和代码都用MIX语言描述,因此这本书并不适合初学者使用。现在虽然已经是第三次修订版,但Knuth似乎并不打算用某种高级语言来重写他的书。此书的最大特点就是语言生动活泼,内容深入浅出,随手翻来读一读也会妙趣无穷。即使不作为学习资料,该书也极具收藏价值,毕竟历史上还没有人像Knuth一样因为写了一本书而得到图灵奖。
Introduction to Algorithms
作者:Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest
出版社:国内很难见到英文版原作;中文版书名为《现代计算机常用数据结构和算法》,潘金贵等编译,由南京大学出版社发行。
推荐程度:五星级
使用语言:类Pascal的伪代码
适用对象:适合各类读者,极具收藏价值
推荐原因:如果说TACOP是算法界的“葵花宝典”,那么这本书就可以称为“独孤九剑”。该书是MIT的电子工程系和计算机系的算法教材,其三位作者也是计算机界赫赫有名的大师。该书的第一部分是算法学习的数学基础知识介绍;第二部分分类介绍常用算法和数据结构;第三部分是高级专题,介绍包括并行算法、NP问题、近似算法等在内的高级科研专题。其中基础知识部分适合初学者,高级专题部分则适合作为研究生的研究课题。该书的最大特点就是每条算法的设计分析都有严密的证明,看后给人一种知其然而知其所以然的感觉。该书既可以作为算法学习用书,也可以作为一本算法和数据结构的字典,适合各类读者,十分具有收藏价值。该书使用类似Pascal的伪代码进行描述,并不拘泥于语言的细节,适合使用各种编程语言的读者。
算法与数据结构
作者:傅清祥王晓东
出版社:电子工业出版社
推荐程度:五星级
使用语言:Pascal
适用对象:初学编程者、较有经验者,以及要参加各类程序员等级考试的读者
网络资源:超星电子图书馆有该书配套习题集的电子版
推荐原因:该书是《计算机学科教学计划1993》的配套教材之一。它覆盖了《计算机学科教学计划1993》中所列的关于算法与数据结构主科目的所有知识单元。全书强调“算法”与“数据结构”之间密不可分的联系,因而强调融数据类型与定义在数据类型上的运算于一体的抽象数据类型,为面向对象的程序设计方法打下扎实的基础。该书内容丰富,表述详细,适合不同层次的读者。其中基础部分可作为计算机学科专业本科生的教材,高级专题部分可作为高年级本科生或研究生的教材。该书的第一章绪论介绍算法的复杂性和算法表达中的抽象机制,这一章写的尤为经典,受到了不少网友的推崇。该书某些章节和内容摘自前面介绍的那本《Introduction to Algorithms》,但是此书省略了其中复杂的数学证明,因此更适合于初学者。
国际信息学奥林匹克竞赛指导
— — 实用算法的分析与程序设计
作者:吴文虎王建德
出版社:电子工业出版社
推荐程度:五星级
使用语言:Pascal
适用对象:参加竞赛者、初学编程者、较有经验者,以及欲参加各类程序员等级考试的读者
网络资源:超星数字图书馆藏有该书电子版
推荐原因:该书是中学生信息学奥赛的辅导丛书之一。介绍了各种常用的算法和算法设计思想,并以大量的例题和解析详细说明各种算法的具体应用。因为是写给中学生看的,所以该书的语言通俗易懂,不需要太多的数学知识也能够看懂其中大部分的算法。但缺点是对算法只给出具体步骤而缺乏严密的理论证明,不过也正是因为这样才使得该书浅显易懂。书中引用了大量信息学竞赛的题目,很多都是具有实际应用背景的经典问题,具有较高的实用价值。对于参加竞赛的中学生和大学生读者来说,该书是竞赛的必备书,因为它基本涵盖了NOI(即全国信息学奥林匹克竞赛);IOI(即国际信息学奥林匹克竞赛)、ACM/ICPC(即ACM国际大学生程序设计竞赛)的各方面内容;对于初学编程者来说,该书内容通俗易懂,深入浅出,例题生动有趣,解析具体详细,是学习编程不可多得的好书之一;对于有经验的编程者,该书涵盖的算法非常广泛,可作为算法参考手册使用。
Computer Algorithms: Introduction to Design and Analysis
作者:Sara Baase 、Allen Van Gelder好书推荐
出版社:影印版由高等教育出版社出版。目前尚未见到有中文版。附图是英文原版的封面,影印版的封面与此有所不同。
推荐程度:四星级
使用语言:类Java的伪代码
使用对象:已经学习过数据结构的读者、参加程序员等级考试的读者
推荐原因:该书是国外计算机系的经典教材,是中国教育部推荐的国外优秀教材之一,被南京大学等国内数所著名大学的计算机系作为算法设计课程的指定教材。它的特点是强调算法设计的具体步骤,对每个算法的设计和分析都给出一步一步的思维过程,而不是直接给出结果。该书的第三章对递归思想的描述非常经典,以简单的语言和清晰的表述深入浅出地说明了递归的工作过程和原理。该书的内容也非常新,第三版的第1 3 章介绍了如何用最新的DNA计算机设计算法来解决哈密尔顿路径问题。此书使用类似Java语言的伪代码进行描述,充分利用了面向对象思想来描述抽象的ADT,但并不拘泥于具体的语言细节,学过任何一种高级语言的读者都能够看懂。该书重点在于介绍算法的设计和分析,对数据结构的介绍比较少,所以要和其他的数据结构参考书配套使用。
【注:哈密尔顿路径(Hamiltonian Path)问题是图论中的一个经典问题,该问题的原型是:如何找到一条遍历图中所有节点一次且仅一次的最短路径。该问题是一个NP-完全问题,利用目前的图灵机计算模型尚未找到多项式时间的算法,但是利用DNA(脱氧核糖核酸)分子计算模型,似乎可以较好地解决这个问题。目前关于DNA计算机的研究仍是一个崭新的前沿课题】
数据结构与算法——面向对象的C + + 设计模式
英文版书名:Data Structures and Algorithms with Object-Oriented Design Patterns in C++
作者:Bruno R. Preiss
出版社:影印版和中文版由电子工业出版社出版
推荐程度:四星级
使用语言:有C++、Java、C#不同语言的版本
适用对象:初学编程者、参加程序员等级考试者,以及C++(或Java,、C#)语言的初学者
网络资源:
作者主页:http://www.pads.uwaterloo.ca/Bruno.Preiss/超星数字图书藏有该书中文电子版
英文电子版和书中代码下载:http://www.pads.uwaterloo.ca/Bruno.Preiss/books/opus4/
Java语言版本的英文电子版:http://www.pads.uwaterloo.ca/Bruno.Preiss/books/opus5/
C#语言版本的英文电子版:http://www.pads.uwaterloo.ca/Bruno.Preiss/books/opus6
推荐原因: 正如书名所显示的,该书的最大特点是以面向对象的C++设计模式来描述数据结构和算法。书中所有的数据结构都以类和对象进行封装,充分体现了抽象数据类型ADT的内在含义。该书既可作为基本算法和数据结构的学习教材,也可作为面向对象的设计模式的经典范例。该书的作者还写了这本书的Java版和C#版,在作者的主页有该书不同语言版本的英文电子版,可以免费浏览或下载。但相比而言,这本书更适合作为数据结构的教材,作为算法分析的教材内容似乎稍浅一些。
数据结构、算法与应用——C + + 语言描述
英文版书名:Data Structure, Algorithms, and Application in C++
作者:Sartaj Sahni
出版社:影印版和中文版由机械工业出版社出版
推荐程度:四星级
使用语言:C++, 另有Java语言的版本
适用对象:编程初学者、参加程序员等级考试者以及C++(或Java)语言初学者
网络资源:
作者主页:http://www.cise.ufl.edu/~sahni/
书中代码和习题答案下载:http://www.mhhe.com/engcs/compsci/sahni/
该书的Java语言版本主页:http://www.cise.ufl.edu/~sahni/dsaaj/index.html
中文电子版可在中国互动出版社购买光盘或通过e币兑换下载,网址http://www.china-pub.com/
推荐原因:这又是一本C++描述的数据结构和算法教材。该教材第一章介绍了有关C++的语法,书中所有出现代码的地方都对代码做了较详细的解释,比较适合C++初学者学习数据结构时的教材。该书强调面向对象的思想和设计模式,对常用的ADT进行了封装,并用大量的实例说明了数据结构和算法的具体应用。该书还有一个用Java语言描述的版本。总体而言,适合初学者作为数据结构的教材。正所谓书贵精而不贵多。虽然在此只推荐了七本书,但这七本书都是经典中的经典, 倘若能够认真学完其中的任何一本,相信你的算法和数据结构水平一定会得到很大的提高,在实际工作中也能发挥出更高的工作效率!