图书前言

以最少的成本、最快的速度、最好的质量开发出适合各种应用需求的软件,必须遵循软件工程的原则,设计出高效率的程序。一个高效率的程序不仅需要“编程小技巧”,更需要合理的数据组织和清晰高效的算法。这正是计算机科学领域里数据结构与算法设计所研究的主要内容。一些著名的计算机科学家在有关计算机科学教育的论述中指出,计算机科学是一种创造性思维活动,其教育必须面向设计。算法设计与分析正是一门面向设计,处于计算机科学与技术学科核心地位的教育课程。通过对计算机算法系统的学习与研究,理解和掌握算法设计的主要方法,培养对算法的计算复杂性进行正确分析的能力,为独立地设计算法和对给定算法进行复杂性分析奠定坚实的理论基础。这些对从事计算机系统结构、系统软件和应用软件研究与开发的科技工作者都是非常重要和必不可少的。为了适应培养21世纪计算机人才的需要,结合我国高等院校教育工作的现状,立足培养学生能跟上国际计算机科学技术的发展水平,更新教学内容和教学方法,本书以算法设计策略为知识单元,系统地介绍计算机算法的设计方法与分析技巧,以期为计算机学科的学生提供广泛坚实的计算机算法基础知识。

全书共分10章。首先在第1章中介绍了算法的基本概念,接着对算法的计算复杂性和算法的描述作了简要的阐述。然后围绕设计算法常用的基本设计策略组织了第2章至第10章的内容。

第2章介绍递归与分治策略,这是设计有效算法最常用的策略,必须掌握的方法。

第3章介绍动态规划算法,以具体实例详述动态规划算法的设计思想、适用性以及算法的设计要点。

第4章介绍贪心算法,这也是一种重要的算法设计策略,它与动态规划算法的设计思想有一定的联系,但其效率更高。按贪心算法设计出的许多算法能产生最优解。其中有许多典型问题和典型算法可供学习和使用。

第5章和第6章分别介绍了回溯法和分支限界法。这两章所介绍的算法适合于处理难解问题,其解题的思想各具特色,值得学习和掌握。

第7章介绍了概率算法,对许多难解问题提供了高效的解决途径,是有很高实用价值的算法设计策略。

第8章介绍NP完全性理论。首先介绍了计算模型,确定性和非确定性图灵机。然后进一步深入介绍NP完全性理论。这一章是全书理论性最强的一章,难度较大,适合于高年级本科生或研究生学习。

第9章介绍了解NP难问题的近似算法,这是当前计算机算法领域的热门研究课题,具有很高的实用价值。

第10章通过实例介绍算法设计中常用的算法优化策略。

在本书各章的论述中,首先介绍一种算法设计策略的基本思想,然后从解决计算机科学与应用中出现的实际问题入手,由简到繁地描述几个精典的精巧算法,同时对每个算法所需要的时间和空间进行分析。这样使读者既能学到常用的精巧算法,又能通过对算法设计策略的反复应用,牢固掌握这些算法设计的基本策略,以期收到融会贯通之效。在为各种算法设计策略选择用于展示其设计思想与技巧的具体应用问题时,本书有意重复选择某些经典问题,使读者能深刻地体会到一个问题可以用多种设计策略求解。同时通过对解同一问题的不同算法的比较,更容易体会到每一个具体算法的设计要点。随着本书内容的逐步展开,读者也将进一步感受到综合应用多种设计策略可以更有效地解决问题。

本书采用面向对象的Java语言作为表述手段,在保持Java优点的同时,尽量使算法的描述简明、清晰。为了加深对知识的理解,各章配有难易适当的习题,以适应不同程度读者练习的需要。

福州大学“211工程”计算机与信息工程重点学科实验室为本书的写作提供了优良的设备与工作环境。南京大学宋方敏教授和福州大学傅清祥教授在百忙之中认真审阅了全书,提出了许多宝贵的改进意见。在此,谨向每一位曾经关心和支持本书编写工作的各方面人士表示衷心的谢意!

由于作者的知识和写作水平有限,书稿虽几经修改,仍难免有缺点和错误。热忱欢迎同行专家和读者的批评指正,使本书在使用中不断改进,日臻完善。