数据结构与算法(Java版·第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.1 学习数据结构的原因

在计算机发展的初期,人们使用计算机的目的主要是处理数值计算问题。使用计算机来解决一个具体问题时,一般需要经过下列几个步骤:首先要从该具体问题抽象出一个适当的数学模型,然后设计或选择一个解此数学模型的算法,最后编写出程序进行调试和测试,直至得到最终的解答。由于当时所涉及的运算对象是简单的整型、实型或布尔类型数据,数据量小而且结构简单,所以程序设计者的主要精力集中于程序设计的技巧上,而无须重视如何组织数据。

随着计算机应用领域日益广泛和软/硬件技术的发展,非数值计算问题越来越重要。据资料统计,目前处理非数值计算性问题占用了90%以上的机器时间。这类问题涉及的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。因此,解决这类问题的关键不再是数学分析和计算方法的应用,而是要设计出合适的数据结构,才能有效解决问题。下面就是这一类问题的几个具体事例。

【例1-1】成绩检索系统。要求计算机提供自动查询的功能,如查找某个学生的单科成绩或平均成绩,查询某门课程的最高分等。

实现这个系统首先需要考虑如何组织数据,然后按照相应的算法编写程序以便实现计算机自动检索功能。例如,可以将每个学生的各项信息(学号、姓名、各项成绩等)用某种构造的数据类型表示,全部学生信息按学号次序排列,组织成一个线性表格(见表1-1)。根据查询需要可以设计出各种查询算法。

表1-1 学生成绩表

类似的计算机应用还有电话号码自动查询系统、图书信息检索系统、仓库库存管理系统等。在这类文档管理的数学模型中,计算机处理对象之间通常存在着一种简单的线性关系,这类数学模型可称为线性数据结构。

【例1-2】教学计划编排问题。一个教学计划包含许多课程,课程之间,有些必须按规定的先后次序进行,有些则没有次序要求。也就是说,有些课程之间有先修和后续的关系,有些课程可以任意安排次序,见表1-2。

表1-2 计算机专业的课程设置

【例1-3】棋盘布局问题。要求将4个棋子布在4×4的棋盘上,任意两个棋子既不在同一行或同一列,也不在同一对角线上。

此问题的处理过程不是根据某种确定的计算法则,而是利用试探和回溯的探索技术求解。为了求得合理布局,在计算机中要存储布局的当前状态。从最初的布局状态开始,一步步地进行试探,每试探一步形成一个新的状态,整个试探过程形成了一棵隐含的状态树,如图1-1所示。回溯法求解过程实质上就是一个遍历状态树的过程。在这个问题中所出现的树也是一种数据结构,它可以应用在许多非数值计算问题中。

图1-1 棋盘布局问题中隐含的状态树

计算机专业各门课程之间的次序关系可用一个称作图的数据结构来表示。如图1-2所示,有向图中的每个顶点表示一门课程,如果从顶点ci到cj之间存在有向边<ci,cj>,则表示课程ci必须先于课程cj进行。

图1-2 表示课程之间优先关系的有向图

由以上三个例子可见,描述这类非数值计算问题的数学模型不再是数学方程,而是诸如表、树、图之类的数据结构。非数值计算问题在计算机应用中体现出越来越重要的价值。数据结构即为主要研究非数值计算的程序设计问题中所出现的操作对象及它们之间存在关系和操作的一门学科。

学习数据结构是为了了解计算机处理对象的特性,能将实际问题中所涉及的处理对象在计算机中表示出来并对它们进行处理。与此同时,通过算法训练来提高逻辑思维能力,通过程序设计的技能训练来提高综合应用能力和专业素质。