本书涉及计算机软件基础与应用中的主要知识、技术和方法,既包含了数据结构的基本知识,又包含了数值方法的内容。具体内容有集合、数据结构与算法的基本概念,线性数据结构的存储与运算,非线性数据结构的存储与运算,查找与排序技术,矩阵与线性方程组,插值与逼近,各种数值问题的近似解法,数值问题的连分式解法。
作者长期从事数值方法与数据结构方面的教学工作,讲授的主要内容是数值计算与非数值计算的问题,同时也编写了有关的教材。这两方面的知识内容都可以也应该归属于计算机软件的基础与应用领域。随着教学改革的深入,从学生计算机知识的结构以及实际应用考虑,在计算机课程的教学中尝试将这两方面的知识内容作为有机的整体设置成一门课程,即数据与算法。这也是一门计算机软件基础与应用的重要课程。
实际上,不管是离散数据还是数值型数据,都属于数据,其不同点只在于二者的背景以及使用的领域有所不同,在计算机中存储的方式有所不同,对它们的处理方法也有所不同,但它们确实是人们认识事物的同一类对象。另一方面,现代科学技术发展到现在,特别是计算机技术的飞速发展,不论是数值计算还是非数值计算都以计算机作为工具,大量的数据处理与复杂的数值计算都需要算法的支持。因此,不论是数值型数据还是非数值型数据,它们都应该作为计算机处理的对象与算法一起考虑,而算法不仅是离散数据运算的基础,也是数值计算的基础。数据与算法是一个整体,应该作为计算机教学中的一门重要课程。
数值方法与数据结构原来是两门不同的课程,前者属于数学范畴,后者属于计算机软件基础的范畴。这两个原本属于不同范畴的课程内容如何合并在一起?作者认为,既然是不同类型的数据,又采用了不同的运算方式,就应该以数据类型为基础,以“数据+算法”与“问题+算法”的方式展开。这样,就不会觉得原本属于数据结构的内容与原本属于数值方法的内容被混杂在一起了。
作为一门新的课程,单纯考虑内容的有机结合是不够的,更重要的是要创新、精简、实用,体现改革与发展。在数值方法中,求解一个非线性方程(即方程求根)有很多经典方法,数值积分也有很多经典方法。一般来说,求解一类数值问题,往往有很多经典方法。在作者看来,绝大部分学生学习数值方法,并不是为了了解各种求解方法,而是为了解决实际问题,因此,不需要介绍所有的求解方法,◆数据与算法只要介绍一种行之有效的方法就行了。作者在长期的教学过程中,对连分式方法进行了一定的研究,认为利用连分式方法解决数值计算问题,具有精确、计算复杂度低、简单实用等优点。因此,在编写本书时就强调了这种方法。对于数值计算的问题,不是介绍解决这类问题的所有方法,而是只介绍解决这类问题的一个基本方法,然后利用连分式的特点对这个基本方法进行校正,以求对不同性态的问题都能得到精确的结果。
本书内容丰富、通俗易懂、实用性强,既包含了数据结构的基本知识,又包含了数值方法的主要内容。书中所有算法均用C++语言描述,这些算法程序均在Visual C++ 6.0环境下调试通过。本书可作为高等学校本科生或研究生相关课程的教材,也可作为广大从事计算机应用工作的科技人员的参考书。
如果读者还需要更多的算法,则可以将参考文献中的[1\]作为与本书配套的工具书,在那本书中给出了解决各种问题的多种算法。
由于作者水平有限,书中难免有错误或不妥之处,恳请读者批评指正。
作者
第1章 预备知识
1.1 集合
1.1.1 集合及其基本运算
1.1.2 自然数集与数学归纳法
1.1.3 笛卡儿积
1.1.4 二元关系
1.2 数据结构的基本概念
1.2.1 什么是数据结构
1.2.2 数据结构的图形表示
1.2.3 线性结构与非线性结构
1.3 算法
1.3.1 算法的基本概念
1.3.2 算法设计基本方法
1.3.3 算法的复杂度分析
习题
第2章 线性数据结构的存储与运算
2.1 线性表
2.1.1 线性表及其顺序存储
2.1.2 栈
2.1.3 队列与循环队列
2.2 线性链表
2.2.1 线性链表的基本概念
2.2.2 线性链表的插入与删除
2.2.3 带链的栈与队列
2.2.4 循环链表
2.3 多项式的表示与运算
2.4 数组
2.4.1 数组的顺序存储结构
2.4.2 规则矩阵的压缩
2.4.3 一般稀疏矩阵的表示
习题
第3章 非线性数据结构的存储与运算
3.1 树
3.2 二叉树
3.2.1 二叉树及其基本性质
3.2.2 二叉树的遍历
3.2.3 二叉树的存储结构
3.2.4 穿线二叉树
3.2.5 表达式的线性化
3.3 图
3.3.1 图的基本概念
3.3.2 图的存储结构
3.3.3 图的遍历
3.3.4 最短距离问题
3.3.5 图的邻接表类
习题
第4章 查找与排序技术
4.1 基本的查找技术
4.1.1 顺序查找
4.1.2 有序表的对分查找
4.1.3 分块查找
4.2 Hash表技术
4.3 字符串匹配
4.4 基本的排序技术
4.4.1 冒泡排序与快速排序
4.4.2 简单插入排序与希尔排序
4.4.3 简单选择排序与堆排序
4.4.4 其他排序方法简介
4.5 拓扑分类
4.6 二叉排序树及其查找
4.6.1 二叉排序树的基本概念
4.6.2 二叉排序树的插入
4.6.3 二叉排序树的删除
4.6.4 二叉排序树查找
4.7 多层索引树及其查找
4.7.1 B-树
4.7.2 B+树
习题
第5章 矩阵与线性方程组
5.1 线性代数方程组
5.1.1 消去法
5.1.2 迭代法
5.1.3 病态方程组
5.2 矩阵求逆
5.3 矩阵分解
5.3.1 矩阵的三角分解
5.3.2 矩阵的QR分解
5.4 矩阵特征值
5.4.1 矩阵特征值与特征向量的基本概念
5.4.2 乘幂法
5.4.3 雅可比方法
5.4.4 豪斯霍尔德方法
5.4.5 求一般实矩阵全部特征值的QR方法
习题
第6章 插值与逼近
6.1 代数插值
6.1.1 代数插值的基本概念
6.1.2 拉格朗日插值公式
6.1.3 艾特肯逐步插值法
6.1.4 牛顿插值公式
6.1.5 样条插值法
6.2 均方逼近
6.2.1 正交多项式
6.2.2 最佳均方逼近多项式
6.2.3 最小二乘曲线拟合
6.2.4 多变量线性拟合
6.3 一致逼近
6.3.1 一致逼近的基本概念
6.3.2 切比雪夫多项式
6.3.3 最佳一致逼近多项式
6.3.4 列梅兹算法
习题
第7章 数值问题的近似解法
7.1 数值积分
7.1.1 牛顿科兹公式
7.1.2 变步长求积法
7.1.3 龙贝格求积法
7.1.4 高斯求积法
7.2 非线性方程
7.2.1 方程求根的一般过程
7.2.2 试位法
7.2.3 逐次迭代法
7.2.4 牛顿迭代法与插值法
7.2.5 求多项式方程全部根
7.3 常微分方程初值问题
7.3.1 常微分方程初值问题数值解的基本思想
7.3.2 欧拉方法
7.3.3 龙格库塔法
7.3.4 一阶微分方程组与高阶微分方程
7.4 常微分方程边值问题
7.4.1 试射法
7.4.2 有限差分法
习题
第8章 数值问题的连分式解法
8.1 连分式插值
8.1.1 连分式与函数连分式
8.1.2 连分式插值法
8.1.3 连分式法求解数值问题的一般步骤
8.2 数值积分的连分式法
8.3 方程求根的连分式方法
8.4 求解常微分方程初值问题的连分式法
8.5 求解常微分方程边值问题的连分式法
习题
参考文献