您的位置  > 互联网

豆瓣为什么选择《算法设计》,不愧是算法界三大圣经之一

为什么选择“算法设计”

算法设计的一个重要特征是问题集。 《算法设计》共包含200多个问题。 这是我们在康奈尔大学教授的课程的一部分,几乎所有问题都是在课外作业中提出或在课堂测验中测试的。 我们将这些问题视为本书的重要组成部分,并对其进行结构调整,使其与我们对内容的总体方法保持一致。 其中大多数包含计算机科学应用或其他地方出现的问题的详细文本描述。 问题的一部分是我们在教科书中讨论的问题的实践:建立必要的符号和形式化,设计一个算法,然后分析这个算法并证明它是正确的。 (我们认为,这些问题的完整答案应该包括所有这些部分:算法的完整解释、对其运行时间的分析以及正确性的证明。)这些问题的想法很大程度上来自我们多年的对话与不同领域工作的人进行讨论。 而且,在某些情况下,这些问题还记录了我们在其他地方从未见过的算法的有趣(尽管简单)应用。

为了帮助解决这些问题,我们在每一章中都包含了一个名为“解决方案练习”的部分,该部分讨论一个或多个问题并描述如何形式化解决方案。 因此,专门针对每个练习和解决方案进行讨论将比简单地编写完整、正确的解决方案花费更长的时间(换句话说,如果将这些解决方案指定为家庭作业问题,则需要更长的时间。比获得满分所需的时间要长得多) 。 事实上,这些章节中的讨论,就像本书的其余部分一样,应该被视为试图提供对更大过程的理解,通过该过程可以考虑此类问题并最终制定精确的解决方案。

关于将这些问题用作课程作业,有两点值得一提。 首先,题目按照难度递增的顺序大致排列,但这只是一个粗略的指导,建议不要太当真:因为大部分题目都是为本科生课堂作业设计的,每章中的大部分题目难度排名其实都差不多。 其次,除了最小数量的问题之外,所有问题都需要投入时间,无论是将问题描述与本章中的算法技术联系起来,还是实际设计必要的算法。 在我们的本科课程中,每周大约布置 3 个这样的问题。

《算法设计》教学特色及补充教材

除了问题和附有答案的练习外,本书还有其他几个教学特色和补充材料,以方便教学。

如前所述,本书用大量篇幅专门描述算法问题(包括其背景和潜在动机),以及针对该问题的算法的设计和分析。 为了反映这种风格,各部分始终围绕一系列小节进行组织:“问题”描述问题并确定其精确的形式定义; “设计算法”使用适当的设计技术开发算法; 《算法分析》证明了算法的性质并分析了算法的效率。 这些部分在文本中用羽毛图标突出显示。 当涉及到问题扩展或算法的进一步分析时,还有专门讨论这些问题的其他部分。 这种结构用于提供相对统一的演示风格,从对计算应用程序中出现的问题的最初讨论,到对这些问题的解决方案的详细分析。

本书提供了许多辅助材料来支持教学。 随附的教师手册完成了书中的所有练习,并提供了每个问题的完整解决方案。 还提供了一套由普林斯顿大学Kevin Wayne开发的教学PPT。 它是按照书中章节的顺序组织的。 以本书为教材进行课堂教学。

如何阅读算法设计

本书主要面向本科生学习第一门算法课程,但它也可以作为研究生入门课程的基础。 当本科生使用这本书时,我们大约用一堂课来介绍它。 如果一节课无法涵盖某个部分的内容(例如,如果该部分提供了进一步的应用作为附加示例),那么我们会将此附加材料作为补充材料,供学生在课外阅读。 我们跳过带星号的部分。 尽管这些部分包含重要的主题,但它们对于课程的展开并不那么重要,而且有时更困难。 在本书的前半部分,我们也倾向于每章跳过一两节(例如,我们倾向于跳过第 4.3、4.7、4.8、5.5、5.6、6.5、7.6 和 7.11 节)。

第11章到第13章,每章我们只讲了大约一半。 最后值得强调的一点是:不要将以下章节视为“高级章节”,从而认为它们超出了本科算法课程的范围。 我们设计这些章节的目标是每章的前几个部分应该适合本科生。 我们自己的本科课程包含所有这些章节的材料,因为我们相信所有这些主题在本科阶段都占有重要地位。 最后,我们将第 2 章和第 3 章主要视为对早期课程材料的回顾。 然而,如前所述,这两章的使用很大程度上取决于每门特定课程与其预备知识的关系。

最终的教学大纲大致如下:第1章、第4章至第8章(不包括第4.3、4.7、4.8、4.9、5.5、5.6、6.5、6.10、7.4、7.6、7.11和7.13节)、第9章(简要说明) ,第10章,第10.1和10.2节,第11章,第11.1、11.2、11.6和11.8节,第12章,第12.1节至第12.3节,以及第13章,第13.1节至13.5节。

本书自然也支持研究生算法入门课程。 我们认为,这样的课程应该为有兴趣在各种不同研究领域从事职业的学生介绍当前算法设计中的重要主题。 在这里,我们还发现强调问题的正式描述很有用,因为学生很快就会尝试在许多不同的子领域定义自己的研究问题。 对于此类课程,我们在第 4 章和第 6 章(第 4.5 至 4.9 节和 6.5 至 6.10 节)以及第 7 章的所有内容(前面的部分覆盖得更快)中包含了后面的主题,还对 NP 完备性进行了快速介绍在第 8 章中(正如许多新研究生在本科时学习的那样),然后将剩下的时间花在第 10 至 13 章中。 尽管在研究生入门课程中,我们的重点是更高级的部分,但我们发现,当学生学习课程时,拥有一本完整的书进行复习或补充背景知识是有用的。学生的本科背景各不相同。

最后,本书支持研究生、研究人员或计算机专业人士自学,他们可能希望了解如何在自己的工作环境中使用特定的算法设计技术。 一些研究生和同事以这种方式使用了本书的部分内容。