`
xiebh
  • 浏览: 612891 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论
阅读更多
原文在这里;

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)。这些才是学习算法的根本。


《算法之美》电子版:http://beust.com/algorithms.pdf
分享到:
评论

相关推荐

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    编辑人员转帖去水印工具

    总之,编辑人员转帖去水印工具如Teorex Inpaint,为图像编辑提供了便利,通过其独特的算法和技术,我们可以高效地去除图片中的水印,提高内容的质量。但在使用过程中,务必遵守版权法和相关法律法规,以维护良好的...

    [转帖]世界编程大赛第一名写的程序

    而在解决最短路径问题时,Dijkstra算法或Floyd-Warshall算法则是不二之选。 2. **代码优化**:竞赛中的时间限制意味着代码的运行效率至关重要。优化代码不仅包括选择高效的算法,还包括减少不必要的计算、利用缓存...

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    转帖别人的图片比较源码

    实现了从文件中导入位图、屏幕截图、鼠标指针截图、在图片上查找子图、在图片上查找颜色等功能。在查找过程中可以设定颜色变化范围、可以从左到右从上到下查找、也可以从指定点向四周查找,版权 2009,由 yeye55 ...

    discuz X2转帖工具、采集工具

    X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...

    轻松转帖之突破网页复制限制宣贯.pdf

    除了火狐,其他浏览器如搜狗、遨游和世界之窗也有类似插件或方法来解除复制限制。例如,可以寻找专为此目的设计的通用插件来安装。 【图片转文字工具】 对于不能直接复制的富媒体内容,如图片中的文字,可以使用OCR...

    转帖经典---JAVA设计模式

    《转帖经典---JAVA设计模式》这本书或资料可能涵盖了这些模式的详细解释、示例代码以及如何在实际项目中应用这些模式。通过学习和理解这些设计模式,开发者能够更好地设计和重构软件,提升代码质量。

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    超级无敌转帖手

    看到论坛里帖子由精美的图片想转过来,或者批量提取地址时很好用

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    《一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0》 本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

    [转帖] 用C# Generator解决Hanoi塔问题

    任何时候大盘子都不能位于小盘子之上;必须将所有盘子最终移动到目标柱子上。 【描述】中的“程序的输出结果”表明,作者不仅实现了汉诺塔问题的解决方案,还通过C# Generator展示了代码运行的实际效果。这通常意味...

    高三政治教学总结(转帖)教学工作总结.doc

    高三政治教学总结(转帖)教学工作总结.doc

    (转帖)4x4x4立体led显示程序

    8. **图形算法**:如果要显示复杂的图像,可能需要应用基本的图形算法,如扫描线算法或深度排序,来决定LED的点亮顺序。 9. **调试与测试**:在实际开发过程中,对代码进行调试和测试至关重要,可能需要使用串口...

Global site tag (gtag.js) - Google Analytics