《本章主要介绍以下内容》由会员分享,可在线阅读,更多相关《本章主要介绍以下内容(9页珍藏版)》请在金锄头文库上搜索。
1、第第 1 章章 绪绪 论论 本章主要介绍以下内容 1、数据结构中涉及的基本概念、术语及所研究的主要内容 2、本教材使用的描述工具 本章重点和难点: 1、数据结构、数据类型、ADT、算法等重要概念。 用计算机求解任何问题都离不开程序设计,而程序设计的实质是数据表示和数据处理。数据要能被计算机处理,首先必须能够存储在计算机的内存中,这项任务称为 数据表示数据表示 ,数据表示的核心任务是数据结构的设计;一个实际问题的求解必须满足各项处理要求,这项任务称为 数据处理数据处理 ,数据处理的核心任务是算法设计。数据结构课程主要讨论数据表示和数据处理的基本问题。本章将概括地介绍数据结构的基本概念、基本思想和
2、基本方法。 1.1 数据结构的兴起和发展数据结构的兴起和发展 数据结构起源于程序设计数据结构起源于程序设计 。随着计算机科学与技术的不断发展,计算机的应用领域已不再局限于科学计算,而更多地应用于控制、管理等非数值处理领域。与此相应,计算机处理的数据也由纯粹的数值发展到字符、表格、图形、图象、声音等具有一定结构的数据,处理的数据量也越来越大,这就给程序设计带来一个问题:应如何组织待处理的数据以及数据之间的关系(结构)。 1968 年克努思教授 1开创了数据结构的最初体系,他所著的计算机程序设计艺术第一卷基本算法是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。 70 年代初,数据结构作
3、为一门独立的课程开始进入大学课堂。 数据结构随着程序设计的发展而发展数据结构随着程序设计的发展而发展 。程序设计经历了三个阶段:无结构阶段、结构化阶段和面向对象阶段,相应地,数据结构的发展也经历了三个阶段: 无结构阶段。 4060 年代,计算机的应用主要针对科学计算,程序设计技术以机器语言 / 汇编语言为主,程序处理的数据是纯粹的数值,数据之间的关系主要是数学公式或数学模型。这一阶段,在人类的自然语言与计算机编程语言之间存在着巨大的鸿沟,程序设计属于面向计算机的程序设计,设计人员关注的重心是使程序尽可能地被计算机接受并按指令正确执行,至于程序能否让人理解并不重要。 结构化阶段。 6080 年代
4、,计算机开始广泛应用于非数值处理领域,数据表示成为程序设计的重要问题,人们认识到程序设计规范化的重要性,提出了程序结构模块化,并开始注意数据表示与操作的结构化。数据结构及抽象数据类型就是在这种情况下形成的。数据结构概念的引入,对程序设计的规范化起到了重大作用。图灵 2奖获得者沃思3给出了一个著名的公式:数据结构 + 算法 = 程序。从这个公式可以看到,数据结构和算法是构成程序的两个重要的组成部分,一个软件系统通常是以一个或几个关键数据结构为核心而组织的。 随着软件系统的规模越来越大、复杂性不断增加,人们不得不对结构化技术重新评价。由于软件系统的实现依赖于关键数据结构,如果这些关键数据结构的一个
5、或几个有所改变,则涉及到整个系统,甚至导致整个系统彻底崩溃。 面向对象阶段。 面向对象技术(首先是面向对象程序设计)始于 80 年代初,是目前最流行的程序设计技术。 在面向对象技术中,问题世界的相关实体被视为一个对象,对象由属性和方法构成,属性用以描述实体的状态或特征,方法用以改变实体的状态或描述实体的行为。一组具有相同属性和方法的对象的集合抽象为类,每个具体的对象都是类的一个实例。例如,“教师”是一个类,“ 王老师”、“ 李老师”等对象都是“教师”类的实例。 由于对象(类)将 密切相关的属性(数据)和方法(操作)定义为一个整体,从而实现了封装和信息隐藏。使用类时,无需了解其内部的实现细节,一
6、旦数据(结构)修改了,只需修改类内部的局部代码,软件系统的其余部分无需修改。 数据结构主要强调两个方面的内容: 数据之间的关系; 针对这些关系的基本操作。这两个方面实际上蕴涵着面向对象的思想:类重点描述实体的状态与行为,而数据结构重点描述数据之间的关系及其基本操作,数据及其相互关系构成了对实体状态的描述,针对数据元素之间关系的操作构成了对实体行为的描述。由此可见,类 与数据结构之间具有对应关系,如图 1 - 1 所示。 “数据结构 + 算法 = 程序”这个公式在软件开发的进程中曾产生了深远的影响,但是,它并没有强调数据结构与解决问题的算法是一个整体,因此有人主张将它修改为“(数据结构 + 算法
7、) = 程序”,以体现面向对象的思想。 值得注意的是,数据结构的发展并未终结。一方面,数据结构将继续随着程序设计的发展而发展;另一方面,面向各专门领域的数据结构得到研究和发展,各种实用的高级数据结构被研究出来,各种空间数据结构也在探索中。 1 克努思 ( Donald.E.Knuth , 1938 年生)从小就是个优秀的学生,多次获得学业成就奖。 1963 年担任加利福尼亚理工学院的教师, 1968 年担任斯坦福大学教授。 1992 年为集中精力写作而荣誉退休,保留教授头衔。他特别感兴趣的是为计算机程序设计艺术丛书完成新卷并更新旧卷。这套丛书是 1962 年他还是研究生时以编译程序为中心开始写
8、作的,对计算机科学的发展产生了深远的影响。从某种意义上说,克努思就意味着计算机程序设计艺术,也就意味着数据结构和算法这一类问题的答案。 2 图灵( Alan.Mathison.Turing 1912 - 1954 )出生于伦敦, 24 岁提出图灵机理论(这一理论奠定了整个现代计算机的理论基础), 31 岁参与 COLOSSUS 的研制, 33 岁设想仿真系统, 35 岁提出自动程序设计概念, 38 岁发表论文计算机能思考吗?,论证了人工智能的可能性,被人们推崇为人工智能之父。美国计算机协会( ACM )为了纪念图灵对计算机科学的贡献,从 1966 年起设立图灵奖。 3 沃思( Niklaus.
9、Wirth ) 1934 年生于瑞士。 1968 年设计并实现了 PASCAL 语言 (被誉为 PASCAL 之父) , 1971 年提出了结构化程序设计, 1976 年设计并实现了 Modula 2 语言。除了程序设计语言之外,沃思在其他方面也有许多创造,如扩充了著名的巴科斯范式,发明了语法图法图等。 1984 年获图灵奖。 1.2 数据结构的研究对象数据结构的研究对象 用计算机求解问题一般包含两个步骤: 抽象出问题的模型; 求该模型的解。对于数值问题抽象出的模型通常是数学方程,例如求解梁架结构中应力的模型是线性方程组;预报人口增长情况的模型为微分方程。但更多的非数值问题是难以用数学方程来描
10、述的。下面请看三个例子。 例例 1-1 学籍管理问题 用计算机来完成学籍管理,就是由计算机程序处理学生学籍登记表,实现增、删、改、查等功能。表 1 - 1 所示就是一张简单的学生学籍登记表。在学籍管理问题中,计算机的操作对象是每个学生的学籍信息-称为档案表项,各档案表项之间的关系可以用称为线性表的数据结构来描述。 表 1-1 学生学籍登记表 例例 1-2 人-机对弈问题 计算机之所以能和人对弈,是因为对弈的策略实现已存入计算机。在对弈问题中,计算机的操作对象是对弈过程中可能出现的棋盘状态-称为格局,而格局之间的关系是由对弈规则决定的。因为从一个格局可以派生出多个格局,所以,这种关系通常不是线性
11、的。如图 1 - 2 ( a ) 所示为井字棋 1 的一个格局,从该格局出发可以派生出五个新的格局,从新的格局出发,还可以再派生出新的格局,如图 1 - 2 ( b ) 所示。格局之间的关系可以用称为树的数据结构来描述。 例例 1-3 教学计划编排问题 一个教学计划包含许多课程,有些课程之间必须按规定的先后次序进行,图 1 - 3 ( a ) 列出了计算机软件方向的一些课程以及课程之间的次序关系。教学计划编排问题中,计算机的操作对象是课程, 课程之间的次序关系可以用称为图的数据结构来描述。如图 1 - 3 ( b ) 所示,其中 每个顶点表示一门课程,如果从顶点 c i 到 c j 之间存在边
12、 ,则表示课程 c i 是课程 c j 的先修课。 由以上三个例子可见,描述这些非数值问题的模型不再是数学方程,而是线性表、树、图等数据结构。在抽象出问题的模型后,数据结构的任务还包括对这个模型进行求解。因此,数据结构是研究非数值问题中计算机的操作对象以及它们之间的关系和操作的学科。1 井字棋又称三子连珠,由两个人对弈,棋盘为 3 3 的方格,当一方的三个棋子占同一行、或同一列、或同一对角线时便为胜方。 1.3 数据结构的基本概念数据结构的基本概念 1.3.1 数据结构数据结构 数据数据 ( Data )是信息的载体,在计算机科学中是指所有能输入到计算机中并能被计算机程序识别和处理的符号集合。
13、数据可以分为两大类:一类是整数、实数等数值数据;另一类是图形、图象、声音、文字等非数值数据。 数据是计算机程序加工的“原料”,例如,编译程序加工的数据是源程序;学籍管理程序加工的数据是学籍登记表。 数据元素数据元素 ( Data Element )是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。构成数据元素的不可分割的最小单位称为数据项。例如,对于学生学籍登记表,每个学生的档案就是一个数据元素,而档案中的学号、姓名、出生日期等是数据项。数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不予考虑。 数据元素具有广泛的含义,一般来说,能独立、完整地描述问题世界的一切实体都
14、是数据元素。例如,对弈中的棋盘格局、教学计划中的某个课程、一年中的四个季节,甚至一次学术报告、一场足球比赛都是数据元素。数据元素又称为元素、结点、顶点或记录。 数据对象数据对象 ( Data Object )是具有相同性质的数据元素的集合,是数据的子集。在实际应用中处理的数据元素通常具有相同性质,例如,学籍登记表中每个数据元素具有相同数目和类型的数据项,所有数据元素(学生的档案)的集合就构成了一个数据对象。在不产生混淆的情况下,我们将数据对象简称为数据。 数据结构数据结构 1( Data Structure )是指相互之间存在一定关系的数据元素的集合。按照视点的不同,数据结构分为逻辑结构和存储
15、结构。 数据的 逻辑结构逻辑结构 ( Logical Structure )是指数据元素之间逻辑关系的整体。所谓逻辑关系是指数据元素之间的关联方式或邻接关系。根据数据元素之间逻辑关系的不同,数据结构分为四类: 集合 数据元素之间就是“属于同一个集合”,除此之外,没有任何关系; 线性结构 数据元素之间存在着一对一的线性关系; 树结构 数据元素之间存在着一对多的层次关系; 图结构 数据元素之间存在着多对多的任意关系。 树结构和图结构也称为非线性结构。 数据的逻辑结构常用逻辑结构图来描述,其描述方法是:将每一个数据元素看做一个结点,用圆圈表示,元素之间的逻辑关系用结点之间的连线表示,如果强调关系的方
16、向性,则用带箭头的连线表示关系。图 1 - 4 描述了四种基本数据结构的逻辑结构图。 数据的逻辑结构属于用户视图,是面向问题的,反映了数据内部的构成方式。为了区别于数据的存储结构,常常将数据的逻辑结构称为数据结构。 数据的 存储结构存储结构 2( Storage Structure )又称为 物理结构 ,是数据及其逻辑结构在计算机中的表示,换言之,存储结构除了存储数据元素之外,必须隐式或显式地存储数据元素之间的逻辑关系。通常有两种存储结构:顺序存储结构和链接存储结构。 顺序存储结构的基本思想是:用一组 连续连续 的存储单元 依次依次 存储数据元素,数据元素之间的逻辑关系是由元素的存储位置来表示的。例如,线性表 ( bat , cat , eat ) 的顺序存储示意图如图 1 - 5 所示。 链接存储结构的基本思想是:用一组 任意任意 的存储单元存储数据元素, 数据元素之间的逻辑关系是用指针来表示的。例如,线性表 ( bat , cat , eat ) 的链接存储示意图如