基本信息
- 原书名:Algorithms in a Nutshell
- 原出版社: O’Reilly Media
- 作者: George T. Heineman Gary Pollice Stanley Selkow
- 译者: 杨晨 李明
- 出版社:机械工业出版社
- ISBN:9787111286745
- 上架时间:2010-3-23
- 出版日期:2010 年3月
- 开本:16开
- 页码:333
- 版次:1-1
- 所属分类:计算机 > 计算机科学理论与基础知识 > 计算理论 > 算法

编辑推荐
伍斯特理工学院教授合力打造的算法学习必备手册
提供高效的代码解决方案,轻松应用于实践
内容简介
计算机书籍
开发健壮的软件需要高效的算法,然后程序员们往往直至问题发生之时,才会去求助于算法。《算法技术手册》讲解了许多现有的算法,可用于解决各种问题。通过阅读它,可以使您学会如何选择和实现正确的算法,来达成自己的目标。另外,书中的数学深浅适中,足够使您可以了解并分析算法的性能。
较之理论而言,本书更专注于应用。《算法技术手册》提供了高效的代码解决方案,使用多种语言进行编写,让您可以轻松地将其应用于特定的工程当中。通过本书,您可以:
· 解决特定代码的问题,或者提升既有解决方案的性能
· 快速找到与您所解决的问题相关的算法,并决定哪个算法才是最适合的那一个
· 探索使用C、C++、Java以及Ruby实现的算法解决方案以及开发小贴士
· 了解算法预期的性能,以及它达到最高性能时所需要的条件
· 发现不同算法之间相似的设计哲学
· 学习高级数据结构,来提升算法的性能
通过《算法技术手册》,您能学到如何提升算法的性能,这将是您的软件应用程序走向成功的关键。
作译者
目录
第一部分
第1章算法真的很重要
理解问题
如果需要,尽可能用实践检验
解决问题的算法
花絮
故事的寓意
参考文献
第2章算法的数学原理
问题样本的规模
函数的增长率
最好最坏和平均情况下的性能分析
性能指标
混合操作
基准测试
最后一点
参考文献
第3章模式和领域
模式:一种交流语言
译者序
在这里,我们很高兴能向大家介绍本书。它正是能够带领你学好算法的一本不可多得的好书。
本书的三位作者是伍斯特理工学院的教授,其中GeorgeT.Heineman毕业于达特茅斯学院和哥伦比亚大学,曾经获得过GE、IBM和AT&T的研究奖金,在软件工程方面有独到的研究。而Gary Pollice曾经供职于Rational Sonware,Sun等多家巨头,有着丰富的工业界经验,知道如何将学术和工业结合起来。Stanley M.Selkow毕业于卡内基梅隆大学和宾夕法尼亚大学,擅长图论和算法设计。本书由这三位伍斯特理工学院计算机理论专家合著,向我们展示了工业界和学术界对算法的不同看法以及如何高效地将理论和实践相结合。本书搭建了一条真正属于开发者的路。
本书的读者主要面向本科生以及程序设计人员,同样也适用于产品和项目管理人员。由于译者的知识和经验有限,翻译中难免有疏漏或错误,敬请广大读者谅解井批评指正。
杨晨李明
2009年7月
前言
“Neo,是这个问题驱使着我们,是这个问题带你来到这儿。”
你知道这个问题,我也是。
作为本书的作者,我们将回答引领你到此的问题:
我能够使用某个算法解决我的问题吗?如果可以,那么怎么实现呢?
你也许并不需要理解一个算法为什么是正确的。如果你需要,那么请看看其他的资料,例如1180页的算法圣经——《算法导论》,作者是Thomas H.Cormen等(2001)。在那本书中你会了解到推论、定理以及证明;你也会从一些练习题和逐步递进的样例中看到算法是如何执行的。也许你会惊奇地发现,在算法导论中你找不到任何的实际代码,仅仅是一些伪代码的片段,伪代码是无数的算法教科书用来阐述算法的高级描述手段。在课堂上,这些教科书是非常重要的,但是在实际软件开发中,它们却起不到应有的作用,因为这些书假定伪代码都能够直接变成实际代码。
我们希望经验丰富的程序员在寻找问题的解决方案时,能够频繁参考本书。作为一名程序员,你每天要解决的问题都能在这里找到解决方案。在软件中,算法是决定成败的关键因素,在这里你能够了解到哪些决定能够改善关键算法的性能,也能够找到适合你的需求和解决方案的实际代码。
所有的算法都有实现,并且都使用测试工具经过仔细测试,以确保其正确性。而且,它们有足够的代码文档,能在这本书的代码库附录中找到它们。我们严格地遵照一系列的原则来设计算法、实现算法,以及编写这本书。如果这些原则对你很有意义,那么这本书也会同样有用。
原则:使用实际代码,而不是伪代码
为了计算最大网络流,一个实践者应该做些什么才能将图P—1的Ford-Fulkerson算法描述转换成实际代码呢?
图中的算法描述来自于维基百科(http://en.wikJFedia.org/wiki/Ford_Fulkerson),这个描述与《算法导论》上的伪代码极其相似。最好还是不要期望一个软件的开发者能够根据这个Ford-Fulkerson算法的描述开发出实际的代码。翻到第8章,对比一下我们的代码。我们只使用有注释的,并且是精心设计过的代码。在你自己写的代码或者软件系统中使用我们提供的现成代码,或者这些代码的逻辑吧。
一些算法教科书确实有完整的C或者Java代码。但是这些教科书的目的通常是教初学者编程语言,或者是解释如何实现抽象数据类型。而且代码都只是在页面的狭窄边栏,作者通常都会忽略注释和错误处理,或者使用在实际应用中不会用到的快捷方法。我们相信程序员能够从有注释的,并且是精心设计过的代码中学到更多的东西,这就是我们为什么做如此多的工作来开发算法的实际解决方案。
原则:将算法和将要解决的问题分开
如果不和具体的问题联系起来,我们很难“泛化地”实现一个算法。我们反对那些给出了算法完全实现的书,这些书上的实现将泛化问题和特定问题纠结在一起,从而很难看出算法的原始结构。更糟糕的是,很多可用的实现依赖于一些特定的数据存储方式,虽然这种方式能够容易被机器理解,但是很难被人理解。
我们将会为泛化的问题和特殊的问题各设计算法的实现。例如,在第7章,当我们描述A*搜索算法的时候,我们用了一个例子,叫做八数码问题(在一个3×3格子的棋盘中移动编号为1—8的小方块)。A*算法的实现依赖于一系列良好定义的接口。因为有良好定义的接口,实现这些接口的类能够清晰地封装八数码这类特定问题的细节。
在本书中,我们使用了大量的编程语言,并且遵循一种严格的设计规范,使得代码可读性高并且生成高效的解决方案。由于我们具备软件工程背景,所以根据泛化的算法和特定领域的解决方案设计一个清晰的接口是一件很容易的事情。按照这样的流程编码,产生的软件是易于测试、维护并且能够根据面临的问题即时扩展。另外一个奸处是读者能够更加容易地阅读和理解算法的描述和结果。当选择了一个算法,我们将会告诉读者,如何将我们编写的可读并且高效的代码转换成高度优化(虽然稍稍降低了可读性)并且性能优秀的代码。毕竟,优化是在问题已经解决之后才进行的,而且客户需要的是运行更快的代码。即便如此,我也认为我们需要听从C.A.R.Hoare的建议:“过早的优化是一切问题之源”。
原则:仅仅讲述足够的数学
很多算法注重专门关注干证明算法的正确性,并且抽象地解释其细节。我们关注的却是如何将算法应用到实践中去。最后我们才会介绍一些数学知识,这些数学知识都是为了读者能够更好地理解数据结构和解的控制流程。
例如,一个人需要理解在很多算法中使用的集合和二叉树的性质。但是,没有必要证明二叉树的高度如何得到,并且解释红黑二叉树是如何平衡的。如果你需要了解这些细节,请阅读《算法导论》的第13章。我们仅仅是需要才会解释结果,如果读者需要理解如何证明结论,我们将会告诉读者在哪儿能够找到数学证明。
在这本书你将会学习到使用一些关键术语和分析技术,并且基于数据结构的功能来区分算法行为。
媒体评论
——Matthew Russell,Digital Reasoning Systems高级技术总监,《Dojo权威织南》(O’Reilly)的作者