华信教育资源网
算法设计与分析 ——基于计算教学论的解析
丛   书   名: 新工科建设之路•计算机类专业精品教材
作   译   者:段会川 等 出 版 日 期:2022-08-01
出   版   社:电子工业出版社 维   护   人:杜军 
书   代   号:G0440510 I S B N:9787121440519

图书简介:

本教材是基于作者所创立的计算教学论编写的,是为实现教学效率显著提升而对计算教学论提出的思想、 方法和工具的深广应用。 本教材共 12 章。第 1 章由 Euclid GCD 算法引出算法的定义,并介绍基于可视化的算法学习方法,第 2~5 章分别介绍算法的穷举设计方法、算法复杂度分析、算法的递归设计方法和基于比较的排序算法,第 6~10 章 分别介绍分治、动态规划、贪心、回溯和分支限界等经典的算法设计方法,第 11 章介绍 RSA 算法,第 12 章介 绍 NP 理论。 本教材可作为高等学校计算机科学与技术专业算法设计与分析课程的教材,也可作为计算机及相关专业研 究生和科研、工程或技术人员自学算法设计与分析的参考书。
定价 89.0
您的专属联系人更多
关注 评论(4) 分享
配套资源 图书内容 样章/电子教材 图书评价
  • 配 套 资 源

    本书资源

    会员上传本书资源

  • 图 书 内 容

    内容简介

    本教材是基于作者所创立的计算教学论编写的,是为实现教学效率显著提升而对计算教学论提出的思想、 方法和工具的深广应用。 本教材共 12 章。第 1 章由 Euclid GCD 算法引出算法的定义,并介绍基于可视化的算法学习方法,第 2~5 章分别介绍算法的穷举设计方法、算法复杂度分析、算法的递归设计方法和基于比较的排序算法,第 6~10 章 分别介绍分治、动态规划、贪心、回溯和分支限界等经典的算法设计方法,第 11 章介绍 RSA 算法,第 12 章介 绍 NP 理论。 本教材可作为高等学校计算机科学与技术专业算法设计与分析课程的教材,也可作为计算机及相关专业研 究生和科研、工程或技术人员自学算法设计与分析的参考书。

    图书详情

    ISBN:9787121440519
    开 本:16(185*260)
    页 数:444
    字 数:746

    本书目录

    目 录
    第1章 算法及其可视化教学支持系统
    1.1 初识算法:Euclid GCD算法
    1.1.1 GCD 及因子分解方法
    1.1.2 Euclid GCD算法
    1.2 算法的定义
    1.2.1 算法是一种求解问题的科学方法
    1.2.2 算法的克努特定义
    1.2.3 算法的图灵机定义
    1.3 算法的描述方法
    1.3.1 算法的自然语言描述方法
    1.3.2 算法的流程图描述方法
    1.3.3 算法的伪代码描述方法
    1.3.4 算法的现代版C++描述方法
    1.3.5 设计算法求解问题的基本过程
    1.4 可视化算法学习的支持工具
    1.4.1 CAAIS的基本界面及其功能
    1.4.2 算法CD-AV演示的基本操作
    1.5 使用现代版C++进行算法实验
    1.5.1 现代版C++的算法实验环境建议
    1.5.2 算法的现代版C++实现方式——以Euclid GCD算法为例
    1.6 算法国粹——《九章算术》中的二进制GCD算法
    1.6.1 《九章算术》中的更相减损术——最早的二进制GCD算法
    1.6.2 现代版的二进制GCD算法
    习题
    参考文献
    第 2 章 算法的穷举设计方法
    2.1 穷举算法设计基础
    2.2 穷举算法设计示例
    2.2.1 百钱买百鸡问题算法设计
    2.2.2 素性测试的试除算法设计
    2.2.3 顺序搜索算法设计及CD-AV演示
    2.2.4 洗牌算法设计及CD-AV演示
    2.3 伪随机数发生器及其在算法实验中的应用
    2.3.1 生成伪随机数的线性同余法
    2.3.2 传统C语言标准库中的伪随机函数及其应用
    2.3.3 现代版 C++标准库中的伪随机函数及其应用
    2.4 算法国粹——图灵奖获得者姚期智院士的伪随机数理论
    2.4.1 姚期智院士密码学安全的伪随机数理论
    2.4.2 LCG不是密码学安全的
    2.4.3 Java JDK提供的密码学安全的伪随机数发生器
    习题
    参考文献
    第 3 章 算法复杂度分析
    3.1 算法复杂度分析基础
    3.1.1 算法的输入规模及复杂度计量
    3.1.2 算法的最好、最坏和平均情况复杂度
    3.2 算法复杂度的渐近分析方法
    3.2.1 算法的渐近复杂度及其记法
    3.2.2 常见的算法复杂度阶及其关系 
    3.2.3 算法复杂度渐近分析的基本范型
    3.3 大整数算术运算的复杂度
    3.3.1 二进制数的竖式算术运算的复杂度
    3.3.2 大整数的多精度表示
    3.3.3 多精度整数算术运算的复杂度
    3.4 Euclid GCD算法的复杂度分析
    3.4.1 Fibonacci数列及其通项的闭式解
    3.4.2 Euclid GCD算法复杂度的详细分析
    3.5 算法复杂度的平摊分析方法
    3.5.1 平摊分析方法概述
    3.5.2 Fibonacci堆的基本操作及其复杂度的平摊分析
    3.6 算法复杂度的实验分析法
    3.6.1 算法复杂度实验分析的必要性和基本过程
    3.6.2 算法复杂度的实验分析法示例
    3.7 问题的复杂度
    3.7.1 问题的复杂度概述
    3.7.2 基于比较的排序问题的复杂度
    3.8 算法国粹——姚期智院士的通信复杂性理论
    3.8.1 通信复杂性的问题定义
    3.8.2 通信复杂性理论的基本成果
    习题
    参考文献
    第 4 章 算法的递归设计方法
    4.1 递归算法的普适性及其理论内涵
    4.1.1 递归算法的基本特性及实例
    4.1.2 递归是一种普适的算法表达方法
    4.2 子集遍历问题的递归穷举算法
    4.2.1 子集遍历问题及其递归穷举算法设计
    4.2.2 现代版C++实现与CD-AV演示设计
    4.3 全排列遍历问题的递归穷举算法
    4.3.1 全排列遍历问题及其递归穷举算法设计
    4.3.2 现代版C++实现与CD-AV演示设计
    4.4 0-1背包问题及其递归穷举算法
    4.4.1 0-1背包问题的定义及解空间分析
    4.4.2 0-1 背包问题的递归穷举算法
    4.5 TSP 问题及其递归穷举算法
    4.5.1 TSP 问题的定义及解空间分析
    4.5.2 TSP 问题的递归穷举算法
    4.6 栈框架及将递归算法转换为迭代算法的方法
    4.6.1 函数调用的栈框架
    4.6.2 将递归算法转换为迭代算法的方法
    4.7 算法国粹——管梅谷教授的中国邮递员问题
    4.7.1 CPP与欧拉回路
    4.7.2 CPP的求解思路与算法
    习题
    参考文献
    第 5 章 基于比较的排序算法
    5.1 冒泡排序算法
    5.1.1 基本思想、伪代码与复杂度分析
    5.1.2 现代版C++实现
    5.1.3 CD-AV演示设计
    5.2 插入排序算法
    5.2.1 基本思想、伪代码与复杂度分析
    5.2.2 现代版 C++实现
    5.2.3 CD-AV 演示设计
    5.3 堆排序算法
    5.3.1 二叉堆的理论及相关算法
    5.3.2 基本思想、伪代码与复杂度分析
    5.3.3 现代版C++实现
    5.3.4 CD-AV演示设计
    5.3.5 优先队列简介
    5.4 算法国粹——π值计算方法
    5.4.1 刘徽关于π值的“割圆术”计算方法
    5.4.2 祖冲之的π值计算成果
    5.4.3 π值的近现代计算方法和计算成果
    习题
    参考文献
    第 6 章 算法的分治设计方法
    6.1 分治法基础
    6.1.1 分治法概述
    6.1.2 二分搜索算法
    6.2 Karatsuba 乘法算法
    6.2.1 大整数乘法的朴素分治算法
    6.2.2 大整数乘法的Karatsuba算法
    6.3 归并排序算法
    6.3.1 基本思想、伪代码与复杂度分析
    6.3.2 现代版C++实现与CD-AV演示设计
    6.4 快速排序算法
    6.4.1 基本思想、伪代码与复杂度分析
    6.4.2 现代版C++实现与CD-AV演示设计
    6.5 大师定理及其应用
    6.5.1 大师定理简介
    6.5.2 大师定理的应用
    6.6 算法国粹——贾宪的增乘开平方法
    6.6.1 增乘开平方法详解
    6.6.2 近代开平方法——牛顿迭代法
    习题
    参考文献
    第 7 章 算法的动态规划设计方法
    7.1 DP方法概述
    7.1.1 Fibonacci数的DP计算
    7.1.2 DP方法的基本思想及其所求解问题的两个重要特征
    7.1.3 DP算法设计的基本步骤
    7.2 两个字符串间的编辑距离问题的DP算法
    7.2.1 DP方程及算法设计
    7.2.2 现代版C++实现与复杂度分析
    7.2.3 CD-AV演示设计
    7.3 矩阵链相乘问题的DP算法
    7.3.1 DP方程及算法设计
    7.3.2 现代版C++实现与复杂度分析
    7.3.3 CD-AV演示设计
    7.4 0-1背包问题的DP算法
    7.4.1 DP方程及算法设计
    7.4.2 现代版C++实现与复杂度分析
    7.4.3 CD-AV演示设计
    TSP 问题的 DP 算法
    7.5.1 DP方程及算法设计
    7.5.2 现代版C++实现与复杂度分析
    7.5.3 CD-AV演示设计
    7.6 算法国粹——秦九韶的正负开方术与最优多项式计算算法
    7.6.1 秦九韶的正负开方术
    7.6.2 秦九韶的最优多项式计算算法
    习题
    参考文献
    第 8 章 算法的贪心设计方法
    8.1 贪心法概述 
    8.1.1 找零钱问题、局部最优与全局最优
    8.1.2 贪心法的基本特征
    8.2 图中单源最短路径的Dijkstra算法
    8.2.1 最短路径的最优子结构性质
    8.2.2 Dijkstra算法的基本思想与贪心选择策略
    8.2.3 现代版C++实现与复杂度分析
    8.2.4 CD-AV演示设计
    8.3 图的最小生成树的Prim算法
    8.3.1 最小生成树的最优子结构性质
    8.3.2 Prim算法的基本思想与贪心选择策略
    8.3.3 现代版C++实现与CD-AV演示设计
    8.4 图的最小生成树的Kruskal算法
    8.4.1 Kruskal算法的基本思想与贪心选择策略
    8.4.2 不相交集合及其Union与Find操作
    8.4.3 现代版C++实现与复杂度分析
    8.4.4 CD-AV演示设计
    8.5 Huffman编码算法
    8.5.1 变长编码、前缀编码及其满二叉树表示
    8.5.2 Huffman编码算法的基本思想与复杂度分析
    8.5.3 最优前缀编码的最优子结构性质与Huffman编码算法的贪心选择策略
    8.5.4 现代版C++实现
    8.5.5 CD-AV演示设计
    8.6 算法国粹——姚期智院士的最小生成树算法
    8.6.1 算法描述
    8.6.2 复杂度分析
    习题
    参考文献
    第 9 章 算法的回溯设计方法
    9.1 图的DFS算法
    9.1.1 图及其表示
    9.1.2 图的DFS算法、DFS树及拓扑排序
    9.1.3 现代版C++实现
    9.1.4 CD-AV演示设计
    9.2 回溯法概述
    9.2.1 回溯法基础
    9.2.2 问题解的形态与回溯算法的基本流程及相关的节点状态
    0-1 背包问题的回溯算法
    9.3.1 约束条件和限界条件设计
    9.3.2 0-1背包问题回溯算法的伪代码及运行实例
    9.4 N-皇后问题的回溯算法
    9.4.1 N-皇后问题的定义、解空间分析及约束条件设计
    9.4.2 现代版C++实现
    9.4.3 CD-AV演示设计
    9.5 K-着色问题的回溯算法
    9.5.1 图着色问题的定义与分析
    9.5.2 K-着色问题的回溯算法设计
    9.5.3 现代版C++实现
    9.5.4 CD-AV演示设计
    9.6 算法国粹——线性方程组的消元求解法
    9.6.1 中国古代数学家对线性方程组消元求解法的探索
    9.6.2 线性方程组求解的高斯消元法
    习题
    参考文献
    第 10 章 算法的分支限界设计方法
    10.1 图的广度优先搜索
    10.1.1 图的BFS算法
    10.1.2 现代版C++实现
    10.1.3 CD-AV演示设计
    10.2 分支限界法概述
    10.2.1 分支限界算法设计的基本要领
    10.2.2 两类分支限界法
    10.3 0-1背包问题的分支限界算法
    10.3.1 约束条件和限界函数设计
    10.3.2 现代版C++实现
    10.3.3 CD-AV演示设计
    10.4 TSP问题的分支限界算法
    10.4.1 TSP问题与哈密尔顿回路
    10.4.2 费用矩阵及其归约矩阵上的哈密尔顿回路
    10.4.3 基于费用矩阵归约的TSP问题的分支限界条件设计
    10.4.4 现代版C++实现
    10.4.5 CD-AV 演示设计
    10.5 算法国粹——内插法与招差术
    10.5.1 中国古代数学家对内插法与招差术的探索
    10.5.2 现代插值法
    习题
    参考文献
    第 11 章 RSA 算法
    11.1 公钥密码学基础
    11.1.1 凯撒加密
    11.1.2 对称密钥体制
    11.1.3 公钥密码学简介
    11.2 模幂运算的反复平方算法
    11.2.1 模运算基础
    11.2.2 模幂运算的反复平方表示与算法
    11.3 模同余、模的乘法逆元及扩展Euclid GCD算法
    11.3.1 模同余的定义及其运算性质
    11.3.2 模的乘法逆元及扩展Euclid GCD算法
    11.4 Miller-Rabin素性测试算法
    11.4.1 关于素数的定理
    11.4.2 费马小定理及相关的素性测试算法
    11.4.3 Miller-Rabin素性测试算法详解
    11.5 RSA算法的基本原理与实现
    11.5.1 RSA算法的基本原理
    11.5.2 现代版C++实现
    11.5.3 CD-AV演示设计
    11.6 算法国粹——中国余数算法
    11.6.1 《孙子算经》中的中国余数算法
    11.6.2 秦九韶关于中国余数算法的普适设计
    11.6.3 中国余数算法的现代版C++实现及CD-AV演示设计
    11.6.4 中国余数算法在加快RSA解密运算中的应用
    习题
    参考文献
    第 12 章 NP理论
    12.1 算法不可解的问题
    12.1.1 停机问题的不可计算性
    12.1.2 希尔伯特第十问题的不可计算性
    12.2 易解问题与难解问题、NP理论基础
    12.2.1 易解问题与难解问题
    12.2.2 NP理论基础
    12.3 NP 完全性理论
    12.3.1 判定性问题的多项式时间归约
    12.3.2 通过定义证明的NP完全问题
    12.3.3 通过多项式归约证明的NP完全问题
    12.3.4 问题复杂性类间的关系
    12.4 算法国粹——姚期智院士的百万富翁问题
    12.4.1 多方安全计算简介
    12.4.2 百万富翁问题及其求解协议
    习题
    参考文献
    附录:教材算法的现代版C++实现及计算教学论简介
    附录 1-1 Euclid GCD算法
    附录 2-1 洗牌算法
    附录 2-2 顺序搜索算法
    附录 4-1 子集遍历问题的递归穷举算法
    附录 4-2 全排列遍历问题的递归穷举算法
    附录 5-1 冒泡排序算法
    附录 5-2 插入排序算法
    附录 5-3 堆排序算法
    附录 6-1 归并排序算法
    附录 6-2 快速排序算法
    附录 7-1 Levenshtein编辑距离问题的DP算法
    附录 7-2 矩阵链相乘问题的DP算法
    附录 7-3 0-1背包问题的DP算法
    附录 7-4 TSP问题的DP算法
    附录 8-1 Dijkstra最短路径算法
    附录 8-2 Prim算法
    附录 8-3 Kruskal算法
    附录 8-4 Huffman编码算法
    附录 9-1 图遍历的DFS算法
    附录 9-2 N-皇后问题的回溯算法
    附录 9-3 K-着色问题的回溯算法
    附录 10-1 图的BFS算法
    附录 10-2 0-1背包问题的分支限界算法
    附录 10-3 TSP问题的分支限界算法
    附录 11-1 RSA算法
    附录 11-2 中国余数算法
    附录 12 计算教学论简介
    
    展开

    前     言

    《诗》有之:‘高山仰止,景行行止。’
    虽不能至,然心向往之。
    [西汉]司马迁:《史记·孔子世家》
    
      作者有幸自1992年开始于山东师范大学从事计算机科学与技术专业的教学工作。这项工作神圣又责任重大,作者在从教之初即从如何借用计算机改进教与学,即如何在给定的课时里传授更广更深知识的角度进行探索和实践。30年来伴随着计算机技术所带来的教学思维、方法和工具的不断革新,作者秉持钻研,一直期望能求索到可具推广价值和可持续性的收获。从最早文字、图形、图片为主的平面幻灯片,到后来结合视频、动画、计算和手写的立体化幻灯片;从早期Authorware为代表的专门CAI课件软件,到集学习、研究和工程于一体的MATLAB等巨型软件系统,再到功能强大的集成化Visual Studio.NET软件研发系统;从早期全课堂视频的精品在线课程,一直到最近短视频主导的混合式线上、线下相融合的慕课式教学模式,作者都进行过尝试。尽管这些方法在一定程度上改进了教与学,但它们还算不上以计算的本质能力解决教学问题,因而尚不足以彰显计算机该有的变革性教与学改进。
      2006年,卡内基·梅隆大学的周以真教授提出的计算思维概念,为探索基于计算机的教学改进提供了计算本质层面上的思路。作者意识到以计算的方式表达和传授知识应是一个颇有希望的方向,于是从2011年便开始在算法设计与分析等课程中探索和实践。
    实际上,以计算机显著地改进教与学是一个世界性问题。史蒂夫·乔布斯在2011年5月提到“迄今为止,计算机对学校的影响小得令人吃惊,远不如其在媒体、医学和法律等社会领域中所产生的巨大影响”,这被北京师范大学的权威教育技术专家何克抗教授誉为“乔布斯之问”。作者在算法设计与分析课程上的计算式教学探索可谓是对解决“乔布斯之问”进行的切实和有深度的尝试。
    算法设计与分析是计算机科学与技术专业的核心课程,然而该课程的教和学一直以来面临着巨大挑战,因为需要对众多深广和复杂逻辑的算法进行思想表述、抽象的图形化流程演示与伪代码解析,以及具体的实现和实验验证。算法可视化(Algorithm Visualization,AV)技术为该课程的教与学改进提供了适宜的方法和工具支持。然而,早期本地软件及浏览器插件式的AV已经因技术落后及不具可推广性和可持续性被淘汰,而以HTML5、CSS3、JavaScript等新一代纯Web技术支持的AV设计在2000年特别是2010年后已经成为主流。然而从目前网络上的有代表性的AV设计来看,离显著改进算法教与学的目标还相去甚远。
      作者以AV为切入点,对运用计算改进算法乃至普适的教与学进行了潜心研究,并于2021年提出了计算教学论(Computational Didactics)学说。其主要思想是充分发挥计算机对可计算问题远超人类的解决能力,将教学内容中的复杂逻辑性知识,从广度、深度到效率上都以较传统方式长足延伸的计算方式进行表达和解析,且从代价上能够为教学所接受,从理念到应用上具有普适性和可持续性。读者可参考附录12对该学说做进一步的了解。
    为验证计算教学论在教学实践上的可行性,作者自主研发了支持计算教学论的算法可视化(Computational Didactics Algorithm Visualization,CD-AV)工具,并对基本覆盖算法设计与分析课程算法实例的30多个经典算法进行了深度和创新性的CD-AV设计与实现。为使这些CD-AV具可生存性、可持续性、高可用性和可扩展性,作者还为之开发了承载和支持软件系统,即计算机辅助的算法可视化系统(Computer Supported Algorithm Visualization System,CAAIS)。这些工作使算法教学得到了质的改进,也驱使作者萌生了基于计算教学论的解析撰写一本具有创新性的算法设计与分析教材的想法,本教材就是此想法付诸行动后的成果。
      本教材以务实求真的思路体现和自然地融入课程思政,竭力追求成为立足于中文表达和文化的经典算法教材,使之既能帮助教师提升为党育人、为国育才的教学效率,又能帮助学生提升为党成器、为国成材的学习效率。这主要表现在两个方面:一是全面运用计算教学论进行算法知识的解析,实现对本科算法知识体系全面、透彻、专业又深入浅出的教学表达和阐述;二是以“算法国粹”作为每章的最后一节,内容包括目前唯一的华人图灵奖获得者,现就职于清华大学的姚期智院士的多项算法和计算领域的奠基性成就,以及中国古代杰出的算法成果,相信这些内容会极大地增强读者的民族自豪感,鼓舞读者立志于算法实践应用和研究探索的自信心。
    本教材的第一个显著特点是以计算教学论的思想和工具着力揭示算法的精髓、力量、智慧和艺术。首位图灵奖获得者Alan J. Perlis,在为由MIT著名学者著述的号称为编程魔法书的《计算机程序的构造和解释》所作的序言中写到,“带着崇敬和赞美,将本书献给活在计算机里的神灵”(This book is dedicated, in respect and admiration, to the spirit that lives in the computer.)。毋庸置疑,作为本教材主题的算法就是活在计算机里的“神灵”。《计算机程序的构造和解释》是计算机科学教科书中的一座高山,也是作者致力于攀登的学峰之一。Perlis在该书的前言中进一步地激励人们探索基于计算机的创新,“你所拥有的,也是我认为和希望的,就是智慧:那种看出这一机器比你第一次见到它时做得更多的能力,那种你可以使它发挥出更多潜力的能力。”(What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.)作者所探索和提出的计算教学论也算是对Perlis激励格言的一次实践,作者也冀望读者也能从本教材基于计算教学论的算法揭示中受到启发,发现计算机的新潜力、探索计算机的新应用。
      本教材中的绝大部分算法都配有线上的CD-AV演示设计,这也是计算教学论最具创造性和实效性的体现,即将知识表达分成两部分,一部分以传统教科书的线下方式表达,另一部分以计算和网络在线方式表达。线上CD-AV丰富的数据实例,图形化、逻辑化的动态算法步骤细致解析及代码跟踪功能,将会使教师和学生均能以远超传统方式的效率和深广度进行算法的教和学。
    本教材行文在深入浅出的基础上力求富足的含金量,图表、代码在清秀美观的基础上力求有强度的表达力,版面组织布局在保证条理的前提下力求集约和紧凑。总之,字里行间、图里表中、编码句法、撰页成章,均力求形式美观且精致,内涵丰富且深厚。这些特征也是计算教学论思想的体现,即以客观方式可以清楚表达的内容都以适宜且良好的方式表达,而这些恰当表达必定能够在一定程度上减少教师的相关精力花费,使他们可以更多地关注需要发挥人类智慧和精力才能解决的那些教学成分。
    在算法有关的教材中,图灵奖获得者、算法分析先驱D. E. Knuth的鸿篇巨著《计算机程序设计艺术》,以及由T. H. Cormen、C. E. Leiserson、R. L. Rivest(图灵奖获得者)和C. Stein等著名学者撰写的权威教材《算法导论》(第3版)是毫无疑问的两座高峰。两部著作均是本教材撰写的重要参考资源。前者属于学术专著类型,在国内多用作参考文献,鲜有用作教材的。后者被国内外的许多顶级名校选用作算法教材,其深邃的撰写方式也的确适合于这些一流或超一流水平的高校。本教材则更追求平实的撰写风格,因而更适用于国内众多的普通高校,这在我国高等教育已经从精英教育迈向大众化教育的今天无疑具有更为宽广的适应面。
      本教材的第二个显著特点是基于现代版C++编程特征进行算法代码实现及专业化实验。算法的实际代码实现是算法学习落地的保证,然而算法的代码实现却是算法教与学中极其困难的一环,因为过于简单的代码不能有深度地揭示算法的本质,而过于烦琐的代码又不具教学上的可操作性。作者经过大量的尝试和研判,发现由C++11及后续C++14、C++17等构成的现代版C++(Modern C++)的教学化运用,是解决这一问题的良好途径。现代版C++的自动数据类型推断auto、基于范围的for循环(range-based for loop)、lambda表达式支持的匿名函数、列表初始化、伪随机数发生器等功能,结合C++的泛型编程库,如以模板方式实现的vector、pair、queue、set等泛型类和swap、sort等泛型函数,以及迭代器等功能,使得能够以简洁性与伪代码媲美的专业C++代码描述和实现算法,而C++毫无疑问是揭示算法本质和效率的最好语言。这填平了算法思想、伪代码到算法实现及非平凡实验间的鸿沟,使算法实现这个算法教与学中的巨大难题得到了理想化的解决。
    本教材完整地提供了各算法有一定专业水准的C++源代码,这些代码还以彩虹式的高亮显示及动态算法步骤跟踪的方式有机地集成到了CD-AV演示中,这使代码的理解和实验迈向了实践化。这些C++代码在教材中以附录的形式组织和编排,既从印刷上保证了算法代码该有的良好格式,又解决了代码与文字混排而带来的排版困境。
      本教材的第三个显著特点是算法知识层上的非平凡推进。这首先体现在非平凡算法知识的甄选上,包括第1章中将算法作为与理论和实验方法并列的第3种科学方法的介绍、算法的图灵机定义,第2章中伪随机数生成算法及其在算法测试中的应用,第3章中多精度整数运算的复杂度、Euclid GCD算法复杂度分析中Fibonacci数的运用、基于Fibonacci堆的平摊分析方法介绍、以基于比较的排序算法为例进行的问题复杂度解释,第4章中递归栈框架及递归转换为循环的方法介绍,第7章中TSP问题动态规划算法中子集索引的子问题及相关计算的C++实现,第8章中Dijkstra算法、Prim算法及Huffman编码算法与第10章中0-1背包问题和TSP问题分支限界算法中非平凡优先队列的运用,第11章中RSA及相关算法的实现阐释,第12章中停机问题和希尔伯特第十问题不可解性介绍,以及3-CNF-SAT到CLIQUE、CLIQUE到VERTEX-COVER和3-CNF-SAT到HAM-CYCLE的多项式时间归约方法介绍等。其次体现在非平凡问题实例的求解要求上。本教材遵循常规教学示例理念,以小规模的教学级问题,也就是俗称的“玩具问题”(toy problem),作为实例解析算法,但强调算法远不是用来求解小规模的教学级问题的,而是用来求解有实际价值、规模价值或理论价值的非平凡问题的,这一点在许多习题中均有体现。
      第二个和第三个显著特点仍然是计算教学论的内涵体现,它们展现了计算教学论不单纯是CD-AV而是一种深广教学方法论的特征。
      本教材的第四个显著特点是参考文献引用。本教材中凡是讲述或提到前人成果,均给出了直接或间接的参考文献引用。这一方面体现了作者对知识的敬畏和对前人成果的尊重,另一方面也为读者的进一步学习和探索提供了参考资源。
      本教材内容共包括12章,基本覆盖了教育部高等学校计算机科学与技术教学指导委员会《高等学校计算机科学与技术专业核心课程教学实施方案》中对算法课程所建议的内容。教材始于第1章的Euclid GCD算法,并由此引出算法的Knuth定义和图灵机定义,第2章介绍最基础的穷举法,第3章介绍算法的渐近复杂度分析方法,第4章介绍递归,第5章介绍排序算法,第6~10章分别介绍经典的分治、动态规划、贪心、回溯和分支限界等算法设计方法,第11章介绍具有划时代意义的RSA算法,最后结束于第12章的NP理论及号称千年问题的P ?=NP问题。
    本教材以附录的形式提供了重点讲述的26个算法的完整现代版C++代码。为方便对应,这些算法代码以“附录n-m”的形式进行编号,其中n为章号,m为算法在章中的序号。
    本教材可供普通本科院校计算机科学与技术及相关专业的算法设计与分析课程使用,其前序课程为程序设计和数据结构。本教材的组织结构具有相当的灵活性,可适应于1学期18周每周2~4个课堂学时和1~2个实验学时或不设实验学时的教学计划。基本选取内容应涵盖全部1~12章的主题,以达到课程知识体系的全覆盖。具体取舍可参考如下建议:“算法国粹”可作为选讲或自学内容;根据学生前序课程及基础情况,可采用前6章重后6章轻的取舍策略;后6章中的第1~2节一般为必讲内容,后续的算法实例则可根据课时情况进行取舍;深入的内容,如3.4 Euclid GCD算法的复杂度分析、3.5 算法复杂度的平摊分析方法、4.6 栈框架及将递归算法转换为循环算法的方法、12.3中关于NP完全问题的证明等内容,可视情况略讲或不讲。
    需要说明的是,尽管本教材以现代版C++进行算法描述和实现,但只是将掌握基本C/C++编程作为学生学习的先决条件。本教材中对所涉及的较深的传统C++和现代版C++功能都有到位的交代和解释。
    本教材有完善和专业的配套PPT。由于本教材撰写得很详尽,因此可立足于让学生通过仔细阅读本教材和以CAAIS辅助的方式开展学习,这一点也是计算教学论理念的一个重要实践体现,即凡是能以某种方式清晰表达的知识都属于仅需少量占用甚至无须占用课堂教学来传授的知识,让课堂教学更多地用于需要教师智慧来传授的知识或解决的学习问题和需求。这也使得本教材特别适宜于目前热门和普遍认可的混合式线上、线下融合的教学模式,以及计算机专业领域的教育专家在《计算机教育与可持续竞争力》中所建议的敏捷教学模式。
    本教材需要CAAIS辅助,选用本教材的教师可与作者联系。但这并不是说本教材脱离不了CAAIS,该系统辅助的是算法演示及相应的练习环节,算法相关的计算理论、设计方法、思想、伪代码、复杂度分析、代码实现等内容,均可在不必依赖CAAIS的情况下进行学习。
    本教材由段会川教授担任主编,徐连诚教授担任副主编。徐连诚、杜萍、戚萌和王金玲老师分别完成了第3章、第4章、第2章和第5章的编著,其余章节由段会川完成。段会川和徐连诚共同进行了全书的通稿工作。
    在本教材的编写过程中,山东师范大学信息科学与工程学院的领导和教师同仁给予了热情的关怀和切实的支持,山东德鲁泰信息科技股份有限公司对本教材所涉及的CAAIS系统的研发和部署提供了大力支持,电子工业出版社的杜军编辑及其他审稿专家为本教材的编辑出版做了大量专业细致的工作,作者在此一并表示衷心的感谢。
    鉴于作者算法知识上有限的广度和深度,不足的文笔功底,本教材中难免存在疏漏、不当、甚至错误之处,恳请广大教师、专家学者和学生给予建议、批评和指正。
    
    
    作者 2022年7月1日于济南
    展开

    作者简介

    段会川 教授,长期致力于以计算改进教和学的效率,并创立了计算教学论学说。该学说以计算的本质能力即算法化的知识表达和解析改进教与学的效率,在《算法设计与分析》和《计算机网络原理》课程中取得了很好的效果。
  • 样 章 试 读
  • 图 书 评 价 我要评论
华信教育资源网