数据结构大学教程
The Complete Data Structure Training Course
第一章 数据结构及其基本概念
Chapter 1 Data Structure and It’s Basic Concepts
1.1什么是数据结构(What is Data Structure)
如果你问一个木匠学徒:你工作的工具要用什么,他可能会回答你:“我只要一把锤子和一个锯”。但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你“我需要一些精确的工具”。由于计算机所解决的问题都是从生活中抽象出来的问题,其复杂性不言而喻,所以我们需要这样精确有效的工具去解决现实生活中的复杂问题。算法、数据结构、程序设计语言都是这样的工具。数据结构是信息的组织方式。对于相同的算法,用不同的数据结构表示其中的抽象数据类型会造成不同的执行效率。这就有必要研究各种抽象数据类型用不同的数据结构表示的效率差异,以及其适用场合。
[一]何谓数据结构(What is Data Structure)
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是信息的一种组织方式,好的数据结构可以提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。从学科角度来讲,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。
[二]数据结构学科的研究对象 (The Object of Data Structure Research)
数据结构作为一门学科,主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(即算法)。通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。数据结构的研究不仅涉及到计算机硬件的研究,比如存储装置和存取方法,而且解决编译原理、操作系统、数据库系统的数据元素在存储器中的分配问题的重要基础。
1.2 基本概念与学科术语(Basic Concepts and Terminologies)
数据(Data):是一个集合的概念,是对客观事物的符号表示,在计算机科学中是指所有能被输入到计算机中,并被计算机处理的符号的总称。是计算机处理的信息的某种特定的符号表示形式。
数据元素(Data Element):是数据的基本单位,数据中的一个“个体”。又称为“记录”或者“表目”。
数据项(Data Item):数据的不可分割的最小单位。数据元素是数据项的集合。
数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集。
[总结]
数据项组成数据元素,数据元素组成数据对象,数据对象组成数据
数据结构(Data Structure):是相互之间存在一种或多种特定关系的数据元素的集合。它包括三个方面:数据元素的逻辑结构、存储结构和相适应的运算(操作)。
数据元素之间的逻辑关系被称为数据元素的逻辑结构,可以用一个二元组表示:
Data_Structure = (D, S) // Data_Structure= (Data-part, Logic-Structure-Part)
这里D是数据元素的集合,S是定义在D(或其他集合)上的关系的集合,
S = { R │ R : D×D×...}。
数据的逻辑结构可归结为以下四类:
(1)集合结构
结构中的数据元素之间除了同属于一个集合的关系外别无其他关系
http://tack.smice.net/docs/images/ds1/jihe.jpg"(2)线性结构结构中的数据元素之间存在一个对一个的前趋后继关系
http://tack.smice.net/docs/images/ds1/lian.jpg"在此种结构下:
有且仅有一个元素无前趋元素
有且仅有一个元素无后继元素
其余任何一个元素均有且仅有一个前趋有且仅有一个后继元素。
(3)树形结构
结构中的数据元素之间存在一个对多个的关系
任何一个节点最多有一个前趋,可以有多个后继,是一种典型的非线性结构
http://tack.smice.net/docs/images/ds1/tree.jpg"(4)图状结构(网状结构)结构中的数据元素之间存在多个对多个的关系
这种结构的特征是任何一个元素可以有多个前趋,也可以有多个后继,是一种多对多的前趋后继关系
http://tack.smice.net/docs/images/ds1/graphic.jpg"表和树是最常用的两种高效数据结构,许多高效的算法可以用这两种数据结构来设计实现。表是线性结构的(全序关系),树(偏序或层次关系)和图(局部有序(weak/local orders))是非线性结构。
数据结构在计算机中的表示(又称为映像)称为数据的存储结构(物理结构)
数据结构的物理结构是指逻辑结构的存储映像(image)。数据结构 DS 的物理结构 P 对应于从 DS 的数据元素到存储区M(维护着逻辑结构S)的一个映射:
P:(D,S) --> M
存储器模型:一个存储器 M 是一系列固定大小的存储单元,每个单元 U 有一个唯一的地址 A(U),该地址被连续地编码。每个单元 U 有一个唯一的后继单元 U'=succ(U)。
P 的四种基本映射模型:顺序(sequential)、链接(linked)、索引(indexed)和散列(hashing)映射。因此,我们至少可以得到4×4种可能的物理数据结构:
sequential
(sets)
linked
lists
indexed
trees
hashing
graphs
需要指出的是:并不是所有的可能组合都合理。
数据结构DS上的操作:所有的定义在DS上的操作在改变数据元素(节点)或节点的域时必须保持DS的逻辑和物理结构。
DS上的基本操作:任何其他对DS的高级操作都可以用这些基本操作来实现。最好将DS和他的所有基本操作看作一个整体——称之为模块(model)。我们可以进一步将该模块抽象为数据类型(其中DS的存储结构被表示为私有成员,基本操作被表示为公共方法),称之为ADT(即是抽象数据类型Abstract Data Type,指一个数学模型以及定义在该模型上的一组操作)。
ADT按照其值的不同特性分为下列三种类型:
原子类型(Atomic Data Type):变量是不带结构的,不可分解的。
固定聚合类型(Fixed-aggregate Data Type):其值由确定数目的成分按照某种结构组成
可变聚合类型(Variable-Aggregate Data Type):值的成分的数目不确定
抽象数据类型的描述方法
抽象数据类型可用(D,S,P)三元组表示
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
ADT 抽象数据类型名 {
数据对象:〈数据对象的定义〉
数据关系:〈数据关系的定义〉
基本操作:〈基本操作的定义〉
} ADT 抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为
基本操作名(参数表)
初始条件:〈初始条件描述〉
操作结果:〈操作结果描述〉
基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头, 除可提供输入值外,还将返回操作结果。“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则将其省略。需要注意的是:抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。
顺便提一句,多形数据类型(Polymorphic Data Type)是指值的成分不确定的数据类型,不过这个不太多见,或者是可以用ADT表示,所以我们在今后的章节再论述。
好的和坏的DS:如果一个DS可以通过某种“线性规则”被转化为线性的DS(例如线性表),则称它为好的DS。好的DS通常对应于好的(高效的)算法。这是由计算机的计算能力决定的,因为计算机本质上只能存取逻辑连续的内存单元,因此如何没有线性化的结构逻辑上是不可计算的。比如对一个图进行操作,要访问图的所有结点,则必须按照某种顺序来依次访问所有节点(要形成一个偏序),必须通过某种方式将图固有的非线性结构转化为线性结构才能对图进行操作。
树是好的DS——它有非常简单而高效的线性化规则,因此可以利用树设计出许多非常高效的算法。树的实现和使用都很简单,但可以解决大量特殊的复杂问题,因此树是实际编程中最重要和最有用的一种数据结构。树的结构本质上有递归的性质——每一个叶节点可以被一棵子树所替代,反之亦然。实际上,每一种递归的结构都可以被转化为(或等价于)树形结构。说到递归在北京大学的数据结构课程里面有个老师经常说“不懂递归就不算北大计算机系的学生”,这样看来足以从侧面说明书的结构的重要性。