转载几篇etone关于算法方面书的书评

                             几篇etone关于算法方面书的书评



算法之美

Algorithms的评论   *****

  这是本很新的书,06年末发行,07年才慢慢出现于人们的视野。我在08年初得知这本书,那会我还很奇怪:都什么年月了,怎么还有人写算法教材——这么“经典”的工作,不是上个世纪就被人做完了吗。
  读了这本Algorithms,我才知道:这才是我心中的算法书,我等待这样一本书已经很多年了。它的确当得起这个名字。
  书的三位作者:Sanjoy Dasgupta, Papadimitriou, Umesh Vazirani。
  其中,Umesh堪称计算机理论界的第二名师(第一名师是他自己的导师Manuel Blum),他带过的学生们犹如一个理论计算机科学新生代的全明星队。另一个作者Papadimitriou可算是理论界的第二名笔(第一非Knuth莫属),他的书Computational Complexity和Combinatorial optimization堪称理论计算机科学最好读的专业书,他业余还写了本小说"T
uring"。第三个作者Dasgupta是个算法方向的研究者,他最年轻,本身就是Umesh的学生,相比前面二位也没什么噱头——可他注定要因这本Algorithms而被载入计算机科学的史册。
  在这本书之前,算法的经典教材首推CLRS的算法导论。算法导论让人印象深刻的,是它内容的全面翔实,还有它一千两百页的厚度。而见到这本Algorithms时,你会震惊于它的薄。我从亚马逊收到这本书时,还以为拿错了包裹。可读过之后,你就会折服于它的美。这是一本可以给人带来巨大阅读乐趣的专业书籍。作者娓娓道来,又惜墨如金。用极精炼的语言,为我们指明了一条通向那些美丽算法的线索。我要由衷地说:这本书不仅仅是一些结果的集合,更是一段美好的旅程。我对书中涉及的内容已然熟悉,但读过之后仍感收获良多,对算法这门学问又多了些认识。真的是,写书当如是。对我来说,算法的教与学有两个困难的地方:
  
  其一,我们学习了那些经典的算法,除了赞叹一下设计的巧思,但总难免问上一句:怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。我们下再多的功夫去记忆书上的算法、去分析这些算法的效率,却终究不能理喻得到这些算法的过程。心理盘算着:给我一个新问题,让我设计个算法出来,我能行吗?答案是:不知道。  可这偏偏又是极重要的,无论作研究还是实际工作,一个计算机专业人士最重要的能
力,就是解决问题——解决那些不断从理论模型、或者从实际应用中冒出来的新问题。
  其二,算法作为一门学问,有两条正交的线索。一个是算法处理的对象:数、矩阵、集合、串(strings)、排列 (permutations)、图(graphs)、表达式(formula)、分布(distributions),等等。另一个是算法的设计思想:贪婪、分治、动态规划、线性规划、局部搜索(local search),等等。这两条线索几乎是相互独立的:同一个离散对象,例如图,稍有不同的问题,例如single-source shortest path和all-pair shortest path,就可以用到不同的设计思想,如贪婪和动态规划;而完全不同的离散对象上的问题,例如排序和整数乘法,也许就会用到相同的思想,例如分治。
  两条线索交织在一起,该如何表述。对学生而言,不同离散对象的差别是直观的——我们已经惯于在一章里面完全讲排序、而在另一章里面完全讲图论算法;可是对算法而言,设计思想的差别是根本的,因为这是从问题的结构来的:不同离散对象上面定义的问题,可以展现出类似的结构,而这结构特征,就是支持一类算法的根本,也是我们设计算法的依据。
   
  坦率的说,之前还没有哪一本算法书很好的解决这两个困难,就连算法导论在这两个问题上也都做得不好。传统的算法书,大多注重内容 (content)的收录,但却忽视思维过程的展示(exposition),因此我们学习了经典的算法,却费解于得到算法的过程;而且算法教材对于内容的编排多是枚举式的(enumerative),这多少是受了the art of computerprogramming的影响——可那是本工具书而不是教材,因此我们一提到算法课,就想起了排序、哈希、最短路径……这些题目(topics),却没有一个统一的线索在心中。
  这本Algorithms,在短短的篇幅内,做到了。
  三位作者可谓野心勃勃,几乎是胆大妄为。他们对传统算法教学思路的颠覆和背叛可谓前所未有。刚拿到目录的时候,我就替他们捏了一把汗,觉得这哪里像一本“正经”的算法书。可读下来,却不由得佩服——算法书早该这么写了。
  他们并没有要全面的收录各种各样的算法,他们做的事情是理清了一条算法这门学问的线索。因此填鸭式的内容灌输不是这本书的目的;对结构的精心安排,对问题的数学结构的剖析、从而推出一个算法的过程的讲解,都体现除了这本书真正的用心:它要让学生获得最大程度的启发,要训练学生独立解决问题的能力。 我觉得这才是教育真正的目的,也是算法课应该追求的目标。 
  说完了种种溢美之词,也来补充一下这本书的不足。这样一本精炼的算法书,为了它道理的清晰、为了它的美,必然会放弃一点对面面俱到的追求。如果我用这本书来教一门算法课的话,我会增加一点以下的内容:
  1. 数据结构。
  这本书对数据结构没有单独的章节,都是在某个数据结构被一个算法用到的时候讲一下,例如priority queue之于Dijkstra's algorithm。这种做法体现了作者的观点:这门课完全就是关于algorithms,数据结构对于算法而言就只是个工具。如果同一个系还能开出一门很强的data structures课,这么做当然很好,各有侧重。但若是我来上课,肯定会提一下数据结构的一些重要思想,例如hashing,和他们的数学背景。因为对于一些实际问
题,数据结构已不再是个工具,可能就是问题本身。
  
  2. 几个没有被此书涉及到的算法设计和分析的工具:对手论证(adversarial argument),matroid,平摊分析(amortized analysis)。
  
  3. 书中每个算法问题目前最好的上下界(upper bounds, lower bounds)。  对于一本书而言,让它记录这些不太现实,因为除非上下界已经紧了,也许出版的第二天就会有更好的上界或下界(其实这事已经发生了,书最结尾 historical notes提了一句整数乘法的fastest known algorithm,结果现在这个结果已经被刷新了)。但老师上课的时候,应该跟学生们讲一下这个内容,让学生心里有这个“上下界”和"open problem"的概念,也晓得算法不是死知识,而是正在发生中的事。
  
  4. 讲一点比贪婪、动态规划等等更加“现代”的算法设计的思想,例如spectral analysis, metric embedding, rapid mixing of markov chain等等。也提一点当下的实际问题(例如google或豆瓣想解决的问题)面临的一些新的考虑,例如非经典的现实的计算模型:考虑内外存的I/O模型,面对海量数据输入的streaming model,海量数据的sub-linear algorithms等等。这些现实模型上的算法需要重新设计去面对新的考量。
  我理解Algorithms这本书没有收录这些内容的原因。越是新的东西老的越快,没有人希望自己的书很快过时。但上课不妨出一些这样的case studies,时髦的东西学生肯定会很感兴趣,这些新东西的粗糙也可以锻炼学生实际解决问题的能力。
  
  5. 除了这本Algorithms作为教材,补充读物可以在CLRS算法导论和Kleinberg和Tardos的算法设计(这也是本顶新的书)之间选择一本。我个人推荐后者。

我们为什么要学习计算理论

计算理论导论(英文版)的评论   *****


      在所有我看过的计算理论、可计算性、计算复杂度的教材中,Sipser的这本Introduction to the Theory of Computation是最适合入门的。把计算理论这么个艰深的学问讲解得清晰简洁,直观易懂。而且涵盖了计算理论的各个经典内容。作为一本 introduction,真是再好不过了。
     计算理论这门学问,顾名思义,就是把“计算”(computation)这个抽象的现象作为我们的研究对象,用数学工具来分析和刻画,并为此而建立的理论体系。
  全书分为三部分:自动机;可计算性;复杂度。这刚好是计算的三个不同的方面:计算的模型;计算的界限;计算的代价。自动机理论抽象的描述了什么叫“问题”,什么叫“解”,计算的机制可以有什么样的形式。可计算性关注的是计算的“行不行”的一面。而复杂度关注的是“好不好”的一面、也即问题的 “难”和“易”。什么是计算机?什么可以被计算?什么样的问题是难的、什么样的问题是容易的?这些计算机科学最自然最根本的问题,是计算理论这门学问的主题,也是这本书的主题。
 
  这本书最美妙之处,并不在于它描述的那些艰深的问题和结果,而是它全面展示了计算理论中那些最引人入胜的深刻想法(idea):抽象问题 (problems)的形式语言(formal languages)描述,确定性(deterministic)和非确定性(nondeterministic)的引入,对角化(diagonalization)和停机(halting)问题,归约(reduction)的思想,完全性(completeness), relativization,alternation。这些都是计算理论中最具创造性的划时代的思想。这些不仅仅是单纯的研究结果,这些idea的出现更是影响了人类今天对计算这个现象的根本认识。
  
  唯一的小缺憾就是,应该在最后一章advanced topics里面,去掉parallel computation,加上communication complexity和著名的PCP (probabilistically checkable proofs)。很高兴能有这么一本书,收集了这些璀璨珍珠,清楚的呈现给我们。
  
  
  然而,尽管我对这本书和这门学问都很推崇,我对于学习计算理论的必要性却并不坚定。我自己喜欢这些,可我该如何向别人解释学习它是必要的?Sipser在前言中也试图说明这个问题:"After all, isn't theory arcane, boring, and worst of all, irrelevant?"
  他很认真的试图从几个方面说服学生,计算理论是“有用”的,但我总觉得这些说服很徒劳:书中的三个部分,对于搞研究的人来说,前两个领域已经或走到头了或不再是主流研究趣味了,只有复杂度尚活跃,但也只是个理论方向之一;而对于那些有志于业界工作的学生,后两个部分几乎永远不会在工作中用到,而只有第一部分的自动机,可能会用到一点点正则表达式。
  看来,从“有用”这个方向去为计算理论辩护,难免会遭遇尴尬和勉强。我能想到的理由就只剩两个:
  (一)这些是计算机科学的根本,没有它们计算机科学不能算作是个正经学问,因此,一个自称计算机科学专业的人,应当知道这些。
  (二)这些是美好的,值得在短暂的人生中去经历去见识。
  
  我觉得这已是足够的理由了。



能工巧匠的工具箱


具体数学计算机科学基础(英文版·第2版)的评论   *****

  我一直认为,评价一本专业书籍,不仅要知道它讲了什么,也要清楚它没讲什么。有了这样的信息,人们才会知道这本书是不是他要的;而且除了这本书他还需要什么。这比仅仅把它作为“经典”而向人推荐,更有帮助。一本好的专业书不但要清晰的呈现美丽的结果,也要为人们指出通向这些结果的道路。也就是解决问题的一般途径。Polya所著的那本经典读物,可以很好的概括之:"how to solve it"。用这个统一的标准去衡量,《具体数学》是很优秀的。这本书就是专门为了上课而写,就是为了让原本无知的学生能够掌握一般的解题思路。这一点它作的非常好。
  
  讲解是一流的。那么就让我们来看看内容,看看《具体数学》讲了什么,更重要的,它没讲什么。
  
  用一句话粗暴的归纳:讲的是技巧,没有讲结构。
  
  如果从数学分支去概括,《具体数学》所涉及的内容基本上没有超出计数组合数学(enumerative combinatorics)和分析组合数学(analytic combinatorics)的范围,间或涉及一点数论和离散概率内容,但对这些内容的取舍依然具有很强的组合数学趣味。
  
  与组合数学的专著相比,《具体数学》对这些论题的阐述,处处都在强调“演算”的技巧;但基本忽略了一般的(general)数学定理、抽象的(abstract)数学体系。可谓“具体”的实至名归。
  
  这样选择,是出于计算机科学专业需求的考虑。《具体数学》中的数学,是计算机科学所做之事(例如算法分析)的“工具”,但并非是计算机科学的“主题”。因此计算机科学专业的学生,毋须在这些数学体系上做文章,但若掌握了娴熟的演算技巧,却的确可以事半功倍。
  
  计算机科学的数学工具箱——这就是《具体数学》要扮演的角色。在这个角色上,它是独一无二的。
  
  但数学之于计算机科学,并非时时刻刻都是工具而已,很多时候也可能成为主题本身。这样的内容就是《具体数学》所没有涉及到的。
  
  计算机科学有个俗气的时髦外表,点缀着各种新鲜而短命的技术词汇,但也有个朴素而美丽的硬核,就是计算机科学的理论根基(theoretical foundations)。《具体数学》

为我们展示了这个硬核的一面:分析和演算;却也有意的忽视了另一面:结构(structures)和刻画 (characterizations)。而这部分没有被《具体数学》覆盖的内容,对于计算机科学而言已不再仅仅是工具,而可以影响到我们对计算本身的认识。
  
  任何形式的计算(computation),都受限于具体的计算模型(computational model)。也因这样的限制,问题和算法,作为数学对象,都有了各自的结构。计算的界限也因此产生。怎样刻画这些结构,关系到人类对于计算本质的认识,而这也是理论计算机科学永恒的主题。从这个意义上说,理论计算机科学基本上就是在研究组合数学:面对算法或问题
这么个离散对象,对性质的分析,对结构的刻画。《具体数学》的内容是前者,而后者从风格上则是完全不同的另一类东西了。
  
  并不是每一个计算机科学专业的人都有必要去关注这些内容,毕竟大多数学习计算机的人是为了谋得更好的生活,而不是为了探索未知。这也是为什么《具体数学》展现着精
巧和实用,却藏起了美丽和永恒。因为后者会吓跑很多人,也难免耽误一些人。《具体数学》的英文副标题更诚实:"A Foundation for Computer Science",声明这只是计算机科学的基础之一。到了中文,那个“a”就被含糊掉了,整个就成了全部“计算机科学基础”。
  但愿这只是个翻译上的瑕疵,而不是我们实际的选择:精巧实用尚存一席之地,美丽和永恒已被彻底遗忘。


有保留的推荐


算法导论(第二版 影印版)的评论   ****

  我对《算法导论CLRS》的态度一直是有所保留的。虽然早在国内的时候,这本书一直被推崇为经典。但我那时就觉得它对算法的描述不好。一段费解的伪码,加上一大段费口舌的解释。我觉得本可以做得更好。
  
  后来知道,这是典型的美国本科生用书,美国的本科教材,大抵很罗嗦,都是厚重的大部头书。教授们生怕稍有简略,学生们就不懂;而美国的小本们,也傻呵呵的认为书头越重,自己越了不起。这书中的大段解释,也确是一番好意,就怕哪个不懂。可要真是老老实实的读下去,分散注意要超过传达信息。
  
  这本书我读的最快乐的部分,就是每章的chapter notes。也就是在一章的末尾,介绍这一章提到的各种内容是何时、被谁、怎样引入计算机科学的。不看这部分,总觉得学的就是书上的死学问。而这些引用出处却为我们理清了算法研究的历史脉络,各个经典结果的师承关系。读这些为我带来了巨大的乐趣。也建议读此书的人千万不要放过这一部分,这些引用的结果就是算法研究的里程碑。
  
  对于算法的伪码描述,倒不必太仔细了。不能指望在算法课上学习编程,算法本来就是很纯粹的数学对象,它的设计思想完全依托于背后的数学结构,它运作的机制以及它的美,也都来自它的数学,可是书上那些模仿C和Pascal的语句,让算法的数学之美沦为一段机械代码。读者辛苦的把自己的思维变成机器,读懂了这些代码,但并不会直接带来对算法本身的领悟。就像一个人懂得了打牌的游戏规则,但并不意味着他就会打牌了,因为他可能依旧不通晓牌理。对算法的学习也要从问题本身的数学结构入手,理解解决此种结构问题的算法它的设计思想,掌握分析具有各种结构特征的算法的数学工具,学习怎样发现问题的结构并从中推出问题的下界(lower bound)。这些才是学习算法的根本。

  《算法导论》的最大成就,也就在于它的选材。它筛选出来的结果,每一个都当之无愧的算是计算机科学的根基或里程碑。在所有的算法教材中,这一点《算法导论》被公认是作的最好的。结构也组织的合理。尽管它的讲解,对这些经典结果的呈现,都不是我最满意的方式。但明珠纵然暗投也终究是明珠,《算法导论》覆盖的内容,可作为算法最好
的教学大纲,是算法课的原型。这是它不容抹煞的历史地位

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值