论坛首页 海阔天空论坛

[转帖]算法之美

浏览 9036 次
精华帖 (0) :: 良好帖 (0) :: 灌水帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-14  
原文在这里;

http://www.douban.com/review/1325850/

里面说的是这本书
http://www.amazon.com/o/ASIN/0073523402/102-9052822-5114543?SubscriptionId=1100889MK2XY9PSTV5G2
引用

这是本很新的书,06年末发行,07年才慢慢出现于人们的视野。我在08年初得知这本书,那会我还很奇怪:都什么年月了,怎么还有人写算法教材——这么“经典”的工作,不是上个世纪就被人做完了吗。
  
  读了这本Algorithms,我才知道:这才是我心中的算法书,我等待这样一本书已经很多年了。它的确当得起这个名字。
  
  书的三位作者:Sanjoy Dasgupta, Papadimitriou, Umesh Vazirani。
  
  其中,Umesh堪称计算机理论界的第二名师(第一名师是他自己的导师Manuel Blum),他带过的学生们犹如一个理论计算机科学新生代的全明星队。另一个作者Papadimitriou可算是理论界的第二名笔(第一非Knuth莫属),他的书Computational Complexity和Combinatorial optimization堪称理论计算机科学最好读的专业书,他业余还写了本小说"Turing"。第三个作者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 computer programming的影响——可那是本工具书而不是教材,因此我们一提到算法课,就想起了排序、哈希、最短路径……这些题目(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的算法设计(这也是本顶新的书)之间选择一本。我个人推荐后者。


后来又去看了这个作者对算法导论的评价,里面有段也说的挺好的:

http://www.douban.com/review/1319527/

引用
对于算法的伪码描述,倒不必太仔细了。不能指望在算法课上学习编程,算法本来就是很纯粹的数学对象,它的设计思想完全依托于背后的数学结构,它运作的机制以及它的美,也都来自它的数学,可是书上那些模仿C和Pascal的语句,让算法的数学之美沦为一段机械代码。读者辛苦的把自己的思维变成机器,读懂了这些代码,但并不会直接带来对算法本身的领悟。就像一个人懂得了打牌的游戏规则,但并不意味着他就会打牌了,因为他可能依旧不通晓牌理。对算法的学习也要从问题本身的数学结构入手,理解解决此种结构问题的算法它的设计思想,掌握分析具有各种结构特征的算法的数学工具,学习怎样发现问题的结构并从中推出问题的下界(lower bound)。这些才是学习算法的根本。
   发表时间:2008-03-14  
刚报名要了一本<<编程之美>>, 还没收到书. 大概也是这种风格.
0 请登录后投票
   发表时间:2008-03-15  
LZ翻译下,出个中文版吧 .

我拿来当教材.

哈哈.
0 请登录后投票
   发表时间:2008-03-15  
大概查了下,貌似国内还没有卖的?
0 请登录后投票
   发表时间:2008-03-15  
ada_li_li 写道
刚报名要了一本<<编程之美>>, 还没收到书. 大概也是这种风格.

必然不是
小笼包和只有小笼没有包的区别
0 请登录后投票
   发表时间:2008-03-15  
NightTree 写道
大概查了下,貌似国内还没有卖的?


恩,不过这本书的电子版是免费的.
0 请登录后投票
   发表时间:2008-03-15  
看了也看不懂,看懂了也记不住,所以不看~~~
0 请登录后投票
   发表时间:2008-03-16  
simohayha 写道
NightTree 写道
大概查了下,貌似国内还没有卖的?


恩,不过这本书的电子版是免费的.


这本书的电子版只对在校学生是免费的。嗯嗯,不过这或许不算什么限制 ……

话说这本书是复旦大学计算机系算法课的现行教材,不知道这两届的学生对此评价如何。以我个人的观点来看,算法教材不专列一节讲平摊分析(amortized analysis)有点过分了,优先队列(priority queue)和并查集(disjoint set - union and find)作为构造许多算法的积木块也是很值得细讲的,当然可以不用细到算法导论那个程度。或许,比较好的模式是用这本书作为教材和线索,然后让任课老师自己上课时补充相关的细节。不过这样对教师的能力要求相当高 —— 有点庆幸于复旦大学计算机系最后还是引进了 Rodulf Fleischer 教授,看来复旦学生在算法训练方面,还是可以保持一点传统的优势。
0 请登录后投票
   发表时间:2008-03-16  
Elminster 写道
simohayha 写道
NightTree 写道
大概查了下,貌似国内还没有卖的?


恩,不过这本书的电子版是免费的.


这本书的电子版只对在校学生是免费的。嗯嗯,不过这或许不算什么限制 ……

话说这本书是复旦大学计算机系算法课的现行教材,不知道这两届的学生对此评价如何。以我个人的观点来看,算法教材不专列一节讲平摊分析(amortized analysis)有点过分了,优先队列(priority queue)和并查集(disjoint set - union and find)作为构造许多算法的积木块也是很值得细讲的,当然可以不用细到算法导论那个程度。或许,比较好的模式是用这本书作为教材和线索,然后让任课老师自己上课时补充相关的细节。不过这样对教师的能力要求相当高 —— 有点庆幸于复旦大学计算机系最后还是引进了 Rodulf Fleischer 教授,看来复旦学生在算法训练方面,还是可以保持一点传统的优势。

化石出现了。。。
电子版在csdn有下。。。
0 请登录后投票
   发表时间:2008-03-17  
NightTree 写道
Elminster 写道
simohayha 写道
NightTree 写道
大概查了下,貌似国内还没有卖的?


恩,不过这本书的电子版是免费的.


这本书的电子版只对在校学生是免费的。嗯嗯,不过这或许不算什么限制 ……

话说这本书是复旦大学计算机系算法课的现行教材,不知道这两届的学生对此评价如何。以我个人的观点来看,算法教材不专列一节讲平摊分析(amortized analysis)有点过分了,优先队列(priority queue)和并查集(disjoint set - union and find)作为构造许多算法的积木块也是很值得细讲的,当然可以不用细到算法导论那个程度。或许,比较好的模式是用这本书作为教材和线索,然后让任课老师自己上课时补充相关的细节。不过这样对教师的能力要求相当高 —— 有点庆幸于复旦大学计算机系最后还是引进了 Rodulf Fleischer 教授,看来复旦学生在算法训练方面,还是可以保持一点传统的优势。

化石出现了。。。
电子版在csdn有下。。。


同学您是哪位啊?为虾米说俺是化石捏?
0 请登录后投票
论坛首页 海阔天空版

跳转论坛:
Global site tag (gtag.js) - Google Analytics