前言 David Berlinski在The Advent of the Algorithm中写道: 有两种思想,像珠宝商放在天鹅绒上的宝石一样熠熠生辉,一个是微积分,另一个就是算法。微积分以及在微积分基础上建立起来的数学分析体系造就了现代科学,而算法则造就了现代世界。算法是当代信息技术的重要基石,同时也是计算科学的永恒主题。在计算机科学技术领域,算法更是处于核心地位。通过对算法系统的学习和研究,掌握算法设计的主要方法,能够正确分析算法的复杂性。这对每一位从事计算机系统结构、系统软件、应用软件研究和开发的科技人员都是非常重要和必不可少的。本书是在结合编者多年教学经验及实践的基础上编写而成的,详细讲述了多种经典算法设计策略。纵观全书,这里并没有创造出任何新的算法,因为编者仅仅是希望通过对经典算法的讲解,把算法设计与分析中基础且重要的内容用更清晰的思路、更直观的形式展现给读者。 本书主要内容 本书以算法策略为知识单元,共9章内容,其中第1章是算法概述,第2~8章是经典的算法设计策略,第9章简单介绍了NP完全理论。 第1章为算法概述。主要介绍了什么是算法、为什么学习算法、算法的描述方式、算法设计的一般过程、算法分析、递推方程求解方法等。 第2章为贪心算法——贪心不足。首先介绍贪心算法的本质、贪心算法的基本要素; 接着从问题分析、算法设计、实例构造、算法分析和Python实战5个方面讲解经典问题,包括活动安排问题、单源最短路径问题、哈夫曼编码、最小生成树和背包问题等。 第3章为分治算法——分而治之。首先介绍分治算法的本质、分治算法的求解步骤; 接着从问题分析、算法设计、实例构造、算法分析和Python实战5个方面讲解经典问题,包括二分查找、选第二大元素、循环赛日程表、合并排序、快速排序、线性时间选择等。 第4章为动态规划。首先介绍动态规划的基本思想、求解步骤及基本要素; 接着从问题分析、算法设计、实例构造、算法分析和Python实战5个方面讲解经典问题,包括矩阵连乘问题、凸多边形最优三角剖分、最长公共子序列问题、加工顺序问题、01背包问题及最优二叉查找树等。 第5章为回溯法——深度优先搜索。首先讲解回溯法的算法框架及思想; 然后介绍了典型的解空间结构,讲解用回溯法求解的经典问题,包括01背包问题、最大团问题、批处理作业调度问题、旅行商问题、图的m着色问题及最小质量机器设计问题等。 第6章为分支限界法——宽度优先或最小耗费(最大效益)优先搜索。首先讲解分支限界法的基本思想; 然后讲解用分支限界法求解的经典问题,包括01背包问题、旅行商问题、布线问题; 最后对比分析了回溯法和分支限界法的异同点,设计了分支限界法实践,用于巩固分支限界法设计策略。 第7章为线性规划问题与网络流。着重讲述线性规划问题的标准化及单纯形算法、网络流的基本概念及理论、求最大流的增广路算法、求最小费用流的消圈算法,通过线性规划问题与网络流实践巩固相关算法设计思想。 第8章为随机化算法。着重讲述了随机数发生器、数值随机化算法、蒙特卡罗算法、拉斯维加斯算法、舍伍德算法,并结合实例讲述了每种类型随机化算法的特点,通过随机化算法实践巩固随机化算法的设计方法。 第9章为NP完全理论。简单介绍了NP理论和近似算法,以引起读者进一步学习和研究的兴趣。 本书特色 (1) 实例丰富、通俗易懂。针对每一种算法设计策略,通过实例图解算法运行过程,形象直观、通俗易懂。 (2) 完整的实战演练,易于上机操作。针对每个经典问题,在算法设计、实例构造的基础上,提供完整Python代码,学习者可以体验从理论到实践的快感。 (3) 注重算法实践。针对主要算法概念及算法设计策略,精心设计实践内容,便于学习者巩固算法设计与分析的方法。 (4) 网络资源丰富,便于教学、自学。网络资源包括本书所有Python源代码、习题解析、微视频、微课件、随堂测试等丰富的学习资源。 配套资源 为便于教与学,本书配有微课视频、源代码、题库、教学课件、教学大纲、考试试卷、教学进度表、实验指导书等。 (1) 获取教学视频方式: 读者可以先扫描本书封底的文泉云盘防盗码,再扫描书中相应的视频二维码,观看教学视频。 (2) 获取源代码、实验指导书和扩展阅读(数论算法及计算几何算法)方式: 先扫描本书封底的文泉云盘防盗码,再扫描下方二维码,即可获取。 源代码 实验指导书 扩展阅读 (3) 其他配套资源可以扫描本书封底的课件二维码下载。 读者对象 本书面向计算机科学与技术、软件工程、智能科学、数据科学与大数据等计算机类相关专业的教师、学生及广大科研工作者,计算机类算法相关工作的从业人员。 本书的编写参考了诸多相关资料,得到多方面的支持,在此谨向清华大学出版社负责本书编辑出版工作的全体同仁、资料提供者及每一位曾经关心和支持本书编写工作的专家们表示衷心感谢。 限于个人水平和时间仓促,书中难免存在疏漏之处,欢迎读者批评指正。 编者 2021年1月