前言 智能算法通识教程实验指导信息时代,人和计算机的交互越来越多,编程思维,或者说程序思维会成为一项通识教育。理解计算机解决问题的方式、利用计算机解决问题的方法,越来越成为每一个专业的人都必须学习的内容。传统程序设计语言的通识教育是每个人编程知识树的主干,每遇到新的问题都可以用已有的编程语言知识消化吸收,进而每一步编程经历的积累都是给自己的知识树添枝增叶,日积月累,程序可以不知不觉地写得更快,更简洁易懂,更少出错,更安全,也会更容易学习理解新的编程语言和软件框架。 通识的程序设计教育已经初具雏形,但更进一步的算法通识教育却仍未被普罗大众和业界重视。由于早期算法教育具有较高的门槛,大部分人对智能算法还是比较陌生的。随着近些年信息化社会的不断发展,人们的工作、生活和学习与互联网的结合越来越紧密,而智能算法作为互联网的“普通话”,也正逐渐成为现代人的必备技能之一。未来是一个智能化社会,而智能化社会的代表就是我们的身边会围绕越来越多的智能体(Agent),这些智能体将是我们工作、学习和生活的伙伴,而智能算法正是与这些智能体交互的重要手段,所以智能算法教育一定会得到更广泛的普及。 本书为“智能算法通识”课程的配套实验用书,“智能算法通识”课程的主要目的是模拟学生在未来的专业科学研究中实际遇到问题时可能要面对的各种情况。所以,本书在设计实验和考察方法时,不苛求学生必须从零开始编写一个完整的程序,在实际工作中这样既不实际又毫无必要;而是可以从一个局部程序段、一个第三方程序框架开始,逐步加入自己的代码,步步为营,最终解决自己的问题。 本书面向非计算机专业学生的实际应用需求,从培养学生的算法技能出发,让学生通过对若干适用于大多数专业的通用算法的编程实际练习,在实验中锻炼寻找算法库、使用算法库解决自己专业应用问题的能力。通过学习本书,学生能够理解和掌握经典算法和数据结构,了解一些经典算法的原理;具备结合本专业实际应用,设计出高效算法和数据结构的能力;具备利用开源平台和工具软件快速实现应用原型的能力。 基于如上需求,本书围绕应用环境中实际问题的求解过程来阐述和讲解程序设计思想方法和相关技术知识,向学生展示如何设计和选择合适的数据结构来表示实际问题中的处理对象,如何把一个实际问题转换成一个程序可计算的逻辑模型,以及如何考虑程序运行的效率来满足问题求解对时间的要求等。 本书每个算法实验项目包括实验目的、实验要求、实验内容以及实验原理。本书共6章,主要内容具体如下。 第1章算法基础: 熟悉算法和数据结构的基本概念,掌握如何用Visual Studio和DevC++新建新项目并调试运行代码。 第2章数学若干问题: 熟悉数论相关算法,会用数值法求解基本数学问题,如多项式四则运算问题、多项式插值问题、非线性方程求解和线性方程组求解问题等。 第3章线性数据结构: 掌握线性表的定义及其运算;顺序表和链表的定义、组织形式、结构特征和类型说明,以及在这两种表上实现的插入、删除和查找的算法。掌握栈和队列的定义、特征及在其上所定义的基本运算,在两种存储结构上对栈和队列所施加的基本运算的实现。 第4章树和图: 掌握树的定义、性质及其存储方法;二叉树的链表存储方式、结点结构和类型定义;二叉树的遍历算法;哈夫曼树的构造方法。掌握图的基本概念及术语;图的两种存储结构(邻接矩阵和邻接表)的表示方法;图的遍历(深度优先搜索遍历和广度优先搜索遍历)算法;最小生成树的构造。 第5章贪心算法: 掌握贪心算法的基本概念;了解贪心算法的性质和优缺点;掌握找零问题、活动安排问题、普通背包问题、马踏棋盘问题、渡河问题等经典问题的原理并完成分析与代码实现。 第6章动态规划算法: 掌握动态规划的基本概念,了解动态规划算法的基本思想、适用情况以及求解基本步骤;了解最优性原理;典型动态规划问题的解决: 挖金矿问题、01背包问题、连续子数组最大和问题以及最长公共子序列问题。 本书相关实验内容已在西安交通大学相关专业试用了5年,达到了最初的设计目的,试用效果良好。 受篇幅、时间及作者水平等限制,书中不妥之处,恳望广大读者批评指正。 作者2022年10月