[周末荐书]《Algorithms》

52 views
Skip to first unread message

pongba

unread,
Mar 14, 2008, 8:39:28 AM3/14/08
to TopLanguage
实际上,不是我推荐,是豆瓣上有牛人推荐,下面是转载的评论:

链接:http://www.douban.com/review/1325850/
这份书评居然上了豆瓣头条了,瞬间几十个推荐啊:P

算法之美

  这是本很新的书,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的算法设计(这也是本顶新的书)之间选择一本。我个人推荐后者。

--
刘未鹏(pongba)|C++的罗浮宫
http://blog.csdn.net/pongba
TopLanguage
http://groups.google.com/group/pongba

zl

unread,
Mar 14, 2008, 8:45:02 AM3/14/08
to TopLanguage
书评是etone师兄写的,拜一下

pongba

unread,
Mar 14, 2008, 8:47:04 AM3/14/08
to pon...@googlegroups.com
zl介不介意介绍一下这位老大?:)

2008/3/14 zl <zhangl...@gmail.com>:
书评是etone师兄写的,拜一下

On Mar 14, 8:39 pm, pongba <pon...@gmail.com> wrote:
> 实际上,不是我推荐,是豆瓣上有牛人推荐,下面是转载的评论:
>
> 链接:http://www.douban.com/review/1325850/
> 这份书评居然上了豆瓣头条了,瞬间几十个推荐啊:P
>
> 算法之美
>
> 这是本很新的书,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,在短短的篇幅内,做到了。
>
> 三位作者可谓野心勃勃,几乎是胆大妄为。他们对传统算法教学思路的颠覆和背叛可谓前所未有。刚拿到目录的时候,我就替他们捏了一把汗,觉得这哪里像一本"正经"的算法书。可读下来,却不由得佩服----算法书早该这么写了。
> TopLanguagehttp://groups.google.com/group/pongba



zl

unread,
Mar 14, 2008, 9:00:40 AM3/14/08
to TopLanguage
99cs的
主页在这:http://www.cs.yale.edu/homes/yin-yitong/
已经2篇soda了,连lp都是mit的...

On Mar 14, 8:47 pm, pongba <pon...@gmail.com> wrote:
> zl介不介意介绍一下这位老大?:)
>
> 2008/3/14 zl <zhanglei....@gmail.com>:
Message has been deleted

pongba

unread,
Mar 14, 2008, 9:05:54 AM3/14/08
to pon...@googlegroups.com


2008/3/14 zl <zhangl...@gmail.com>:

99cs的
主页在这:http://www.cs.yale.edu/homes/yin-yitong/
已经2篇soda了,连lp都是mit的...

Orz..*N

pongba

unread,
Mar 14, 2008, 9:18:08 AM3/14/08
to TopLanguage
荡下来看了一些,果然是一针见血一步到位的深刻的书啊!

后面我就期待它能在算法设计的思维上做出深刻的介绍了。

也就是etone说的:


我们学习了那些经典的算法,除了赞叹一下设计的巧思,但总难免问上一句:怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地 方。我们下再多的功夫去记忆书上的算法、去分析这些算法的效率,却终究不能理喻得到这些算法的过程。

我一直期望能够有一本算法书,它能够解开我的这样一个疑惑:为什么有些人在面对一个算法问题的时候,能够直觉地想到答案。当然,直觉的背后是长期的训练。我的疑惑是,这个直觉背后,有没有系统化的思维方法可以遵循。可以让人不需要被动地一道道做题来积累那种抓不到摸不着的"直觉"。

如果哪位看得比较快,如果发现后面有对以上问题的解答的话,一定要mail我:)

2008/3/14 pongba <pon...@gmail.com>:

我们学习了那些经典的算法,除了赞叹一下设计的巧思,但总难免问上一句:怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地 方。我们下再多的功夫去记忆书上的算法、去分析这些算法的效率,却终究不能理喻得到这些算法的过程。


pongba

unread,
Mar 14, 2008, 9:19:52 AM3/14/08
to TopLanguage
忘了给ebook的地址了:
http://gigapedia.org/items/38290/algorithms

2008/3/14 pongba <pon...@gmail.com>:

Yong Yuan

unread,
Mar 14, 2008, 9:39:22 AM3/14/08
to pon...@googlegroups.com


 
2008/3/14 pongba <pon...@gmail.com>:
荡下来看了一些,果然是一针见血一步到位的深刻的书啊!

后面我就期待它能在算法设计的思维上做出深刻的介绍了。

也就是etone说的:


我们学习了那些经典的算法,除了赞叹一下设计的巧思,但总难免问上一句:怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。我们下再多的功夫去记忆书上的算法、去分析这些算法的效率,却终究不能理喻得到这些算法的过程。

我一直期望能够有一本算法书,它能够解开我的这样一个疑惑:为什么有些人在面对一个算法问题的时候,能够直觉地想到答案。当然,直觉的背后是长期的训练。我的疑惑是,这个直觉背后,有没有系统化的思维方法可以遵循。可以让人不需要被动地一道道做题来积累那种抓不到摸不着的"直觉"。

如果哪位看得比较快,如果发现后面有对以上问题的解答的话,一定要mail我:)

2008/3/14 pongba <pon...@gmail.com>:

我们学习了那些经典的算法,除了赞叹一下设计的巧思,但总难免问上一句:怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。我们下再多的功夫去记忆书上的算法、去分析这些算法的效率,却终究不能理喻得到这些算法的过程。


goool

unread,
Mar 14, 2008, 9:16:20 PM3/14/08
to TopLanguage

silwile

unread,
Mar 14, 2008, 11:35:03 PM3/14/08
to TopLanguage


On Mar 14, 9:18 pm, pongba <pon...@gmail.com> wrote:
> 荡下来看了一些,果然是一针见血一步到位的深刻的书啊!
>
> 后面我就期待它能在算法设计的思维上做出深刻的介绍了。
>
> 也就是etone说的:
>
> 我们学习了那些经典的算法,除了赞叹一下设计的巧思,但总难免问上一句:怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地
> 方。我们下再多的功夫去记忆书上的算法、去分析这些算法的效率,却终究不能理喻得到这些算法的过程。
>
我一直期望能够有一本算法书,它能够解开我的这样一个疑惑:为什么有些人在面对一个算法问题的时候,能够直觉地想到答案。当然,直觉的背后是长期的训
练。我的疑惑是,这个直觉背后,有没有系统化的思维方法可以遵循。可以让人不需要被动地一道道做题来积累那种抓不到摸不着的"直觉"。

pongba,你的这个疑惑,我听你讲了N^2次了 ^-^

> 如果哪位看得比较快,如果发现后面有对以上问题的解答的话,一定要mail我:)

即使书上有关于这个问题的解答,而且有人真的在你找到之前找到了,也不能够把它mail给pongba的 :)
有些东西必须自己去寻找,比如你疑惑的这个问题的答案。

hayate

unread,
Mar 14, 2008, 11:40:53 PM3/14/08
to pon...@googlegroups.com
书评写的很好。
不过话说回来,我所学过的大多数教材的前言往往也喜欢说,本书不仅教会你题目的解法,也教会你思考的方法。

2008/3/15 silwile <sil...@gmail.com>:

silwile

unread,
Mar 14, 2008, 11:51:16 PM3/14/08
to TopLanguage


On Mar 14, 9:39 pm, "Yong Yuan" <y...@cs.toronto.edu> wrote:
> 最近出的几本算法书强调算法怎么来的,怎么设计的:http://www.amazon.com/Algorithm-Design-Jon-Kleinberg/dp/0321295358/re...
Kleinberg 的这本书 算法设计 非常的好。
也是清华姚班算法课的指定参考书。

> http://www.amazon.com/Introduction-Design-Analysis-Algorithms-2nd/dp/...

silwile

unread,
Mar 14, 2008, 11:52:44 PM3/14/08
to TopLanguage
Orz...

HanliInter

unread,
Mar 15, 2008, 7:51:07 AM3/15/08
to pon...@googlegroups.com
gigapedia那个貌似图片版的
http://beust.com/algorithms.pdf
这个是文字版的

2008/3/15 silwile <sil...@gmail.com>:



--
Regards
Hanli Wang
__
The best way to predict the future is to invent it

njin

unread,
Mar 16, 2008, 2:01:52 AM3/16/08
to pon...@googlegroups.com
gigapedia上面有文字版的啊~~~~~

在 08-3-15,HanliInter<hanli...@gmail.com> 写道:


--
Best Regards,
Niu Jin

图灵刘江

unread,
Mar 19, 2008, 10:31:09 AM3/19/08
to TopLanguage
可惜版权没有弄到手。电子版倒是早就有了。
Reply all
Reply to author
Forward
0 new messages