1、数据结构,主讲:张 仰 森 教授电话:13161021408 E-mail: QQ:349843721,主教材 严蔚敏.数据结构.清华大学出版社.1997 辅导及实验教材 严蔚敏.数据结构题集(C语言版)清华版,1999 参考教材 1.王红梅.数据结构(C版).清华大学出版社,2005 2.许卓群等.数据结构与算法高等教育出版社 3.李春葆.数据结构习题与解析(A级)清华大学出版社,2006,关于教材,课程性质,数据结构是计算机专业的专业基础课在教学计划中的地位:核心、承上启下前导课:高等数学、离散数学、程序设计语言后续课:数据库、操作系统、编译原理 属于武术中的“练功”科目“练武不练功,到头
2、一场空” 考研,学习目标,掌握基本的数据结构数据结构是程序设计的基础。 培养算法设计能力、程序设计能力算法程序的灵魂问题求解过程:问题想法算法程序程序设计研究的层次:算法方法学语言工具 培养算法分析能力评价算法、改进算法,学习要求,循序渐进,切忌心浮气躁提高课外学习的时间和内容 理解科学而不是背诵科学读书正确对待考试 作习题华罗庚:“学数学不做习题等于入宝山而空返” 作实验计算机学科是一门科学性与工程性并重的学科,表现为理论和实践紧密结合的特征。,学习手段,辅导教材知识结构、学习要点、重点难点释疑、习题解析 实验层次验证型实验-课堂教学实验设计型实验-课程设计实验综合型实验-课程设计实验,成绩
3、组成,平时成绩20:出勤作业报告 实验成绩10:出勤程序报告 期末考试成绩70:接近同类学校考研水平 课程设计成绩:优、良、中、及、不及,第 1 章 绪 论,数据结构的兴起和发展 数据结构的研究对象 数据结构的基本概念 算法及算法分析,本章的基本内容是:,1.1 数据结构的兴起和发展,1.1 数据结构的兴起和发展,数据结构是如何产生的?,计算机的普及:1946年以来,数字电子计算机的出现,1970年代末微型计算机的出现,使得计算机的应用范围扩大。 应用范围扩大:不再局限于科学计算,更多地应用于控制、管理及数据处理等非数值计算。 编写程序的要求:研究待处理对象的特性及各对象之间的关系,用计算机解
4、决实际问题的步骤:,1.数学建模:分析问题,找出操作对象及其之间 关系,建立数学模型,2.设计算法:设计解此数学模型的算法,3.编程实现:依据算法编写程序并调试,直至得到最后答案,1.1 数据结构的兴起和发展,1938年出生,25岁毕业于加州理工学院数学系,博士毕业后留校任教,28岁任副教授。30岁时,加盟斯坦福大学计算机系,任教授。从31岁起,开始出版他的历史性经典巨著: The Art of Computer Programming 他计划共写7卷,然而出版三卷之后,已震惊世界,使他获得计算机科学界的最高荣誉图灵奖,此时,他年仅36岁。,数据结构的创始人克努思,1.1 数据结构的兴起和发展
5、,程序设计的实质是什么?,数据表示:如何表示待处理的数据?如何表示数据之间的逻辑关系?如何将数据的逻辑关系映射到计算机存储之中。 数据处理:计算数据在计算机中的存储结构,如何设计算法对数据进行处理。,算法的复杂度与数据的结构密切相关。程序设计涉及数据结构和算法两部分内容。,数据结构随着程序设计的发展而发展,数据结构的发展并未终结 随着程序设计而发展 各种面向专门领域的高级数据结构正在研究,无结构阶段 结构化阶段:算法 + 数据结构 = 程序设计Niklaus Wirth 3. 面向对象阶段:(数据结构算法)程序设计,1.1 数据结构的兴起和发展,1.2 数据结构的研究对象,1.2 数据结构的研
6、究对象,前面我们已经指出,用计算机求解实际问题的步骤是:建立数学模型设计求解模型的算法编程实现 建立数学模型:分析、抽象问题,将问题涉及的对象以及对象之间的关系找出来,并以适当的形式加以表示。所以数学建模的本质是数据与关系的表示。 问题数值问题、非数值问题数 值 问 题数学方程非数值问题数据结构,例1 学籍管理问题表结构,1.2 数据结构的研究对象,完成什么功能?各表项之间是什么关系?,例2 人机对弈问题树结构,1.2 数据结构的研究对象,如何实现对弈?各格局之间是什么关系?,例3 教学计划编排问题图结构,1.2 数据结构的研究对象,如何表示课程之间的先修关系?,1.2 数据结构的研究对象,在
7、解决实际问题中,通过抽象,主要研究的对象包括数据以及数据之间的关系。数据以及数据之间的关系就是数据结构。如果用D表示数据,用R表示关系数据结构=D+R数据之间的关系包括逻辑关系、数据在计算机中的存储结构关系,1.2 数据结构的研究对象,数据结构是一门研究“描述现实世界实体的数学模型(非数值计算中的数据及其关系)及其上的操作在计算机中如何表示和实现”的学科。,1.3 数据结构基本概念,一、数据与数据结构,二、数据类型,三、抽象数据类型,1.3 数据结构的基本概念,数据:所有能输入到计算机中并能被计算机程序识别和处理的符号集合。是计算机操作的对象的总称。是计算机处理的信息的某种特定的符号表示形式。
8、是计算机操作的对象的总称。数值数据:整数、实数等非数值数据:图形、图象、声音、文字等 数据元素:是数据(集合)中的一个“个体”。是数据结构中讨论的基本单位。,一、数据与数据结构,数据项:,是数据结构中讨论的最小单位,数据元素可以是数据项的集合,例如:,描述一个运动员的数据元素可以是,称之为组合项,1.3 数据结构的基本概念,一、数据与数据结构,数据、数据元素、数据项之间的关系,包含关系:数据是由数据元素组成,数据元素是由数据项组成。数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不予考虑。,1.3 数据结构的基本概念,一、数据与数据结构,数据结构:相互之间存在一定关系的数据元素的集
9、合。按照视点的不同,数据结构分为逻辑结构和存储结构。 逻辑结构:指数据元素之间逻辑关系的整体。,1.3 数据结构的基本概念,一、数据与数据结构,数据的逻辑结构是从具体问题抽象出来的数据模型,数据结构:相互之间存在一定关系的数据元素的集合。按照视点的不同,数据结构分为逻辑结构和存储结构。 逻辑结构:指数据元素之间逻辑关系的整体。 存储结构:又称为物理结构,是数据及其逻辑结构在计算机中的表示。,1.3 数据结构的基本概念,存储结构实质上是内存分配, 在具体实现时,依赖于计算机语言。,一、数据与数据结构,假设用三个 4 位的十进制数表示一个含 12 位数的十进制数。例如:3214,6587,9345
10、 a1(3214),a2(6587),a3(9345)则在数据元素 a1、a2 和 a3 之间存在着“次序”关系 a1,a2、a2,a3,1.3 数据结构的基本概念,3214,6587,9345 a1 a2 a3,6587,3214,9345a2 a1 a3,一、数据与数据结构,再例如,在2行3列的二维数组a1, a2, a3, a4, a5, a6 中六个元素之间 存在两个关系:,行的次序关系:列的次序关系:,row = ,col = ,a1 a3 a5a2 a4 a6,a1 a2 a3 a4 a5 a6,1.3 数据结构的基本概念,数据结构从逻辑上分为四类: 集合:数据元素之间就是“属于同
11、一个集合” ;,1.3 数据结构的基本概念,一、数据与数据结构,数据结构从逻辑上分为四类: 集合:数据元素之间就是“属于同一个集合” ; 线性结构:数据元素之间存在着一对一的线性关系;,1.3 数据结构的基本概念,一、数据与数据结构,数据结构从逻辑上分为四类: 集合:数据元素之间就是“属于同一个集合” ; 线性结构:数据元素之间存在着一对一的线性关系; 树结构:数据元素之间存在着一对多的层次关系;,1.3 数据结构的基本概念,一、数据与数据结构,数据结构从逻辑上分为四类: 集合:数据元素之间就是“属于同一个集合” ; 线性结构:数据元素之间存在着一对一的线性关系; 树结构:数据元素之间存在着一
12、对多的层次关系; 图结构:数据元素之间存在着多对多的任意关系。,1.3 数据结构的基本概念,一、数据与数据结构,数据结构的形式定义为:,数据结构是一个二元组,Data_Structures = (D, R),其中:D 是数据元素的有限集,R 是 D上关系的有限集。,1.3 数据结构的基本概念,一、数据与数据结构,通常有两种存储结构: 1. 顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。,1.3 数据结构的基本概念,一、数据与数据结构,通常有两种存储结构: 1. 顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的
13、存储位置来表示。 2. 链接存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示 。,例:(bat, cat, eat),1.3 数据结构的基本概念,bat 0200,cat 0325,eat,一、数据与数据结构,逻辑结构和存储结构之间的关系,数据的逻辑结构属于用户视图,是面向问题的,反映了数据内部的构成方式;数据的存储结构属于具体实现的视图,是面向计算机的。一种数据的逻辑结构可以用多种存储结构来存储,而采用不同的存储结构,其数据处理的效率往往是不同的。,1.3 数据结构的基本概念,一、数据与数据结构,二、数据类型,1.3 数据结构的基本概念,数据类型是一组值的集合以
14、及定义于这个值集上的一组操作的总称。,例如,C 语言中提供的基本数据类型有:,整型 int,浮点型 :单精度型 float;双精度型double,字符型 char,枚举型 enum,三、抽象数据类型 (Abstract Data Type 简称ADT),抽象数据类型是一个数据结构以及定义在该结构上的一组操作的总称。,1.3 数据结构的基本概念,ADT 抽象数据类型名 数据对象:数据对象的定义数据关系:数据关系的定义基本操作:基本操作的定义 ADT 抽象数据类型名,三、抽象数据类型 (Abstract Data Type 简称ADT),基本操作名(参数表)初始条件:初始条件描述操作结果:操作结果
15、描述,1.3 数据结构的基本概念,赋值参数 只为操作提供输入值。 引用参数 以&打头,除可提供输入值外,还将返回操作结果。,初始条件 描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。,操作结果 说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。,ADT 有两个重要特征:,数据抽象:用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。,数据封装:将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。,1.3 数据结构的基本概念,三、抽象数据类型
16、 (Abstract Data Type 简称ADT),抽象数据类型的描述方法,抽象数据类型可用(D,R,P)三元组表示。 其中:D 是数据对象;R 是 D 上的关系集;P 是对 D 的基本操作集。,1.3 数据结构的基本概念,三、抽象数据类型 (Abstract Data Type 简称ADT),例如,抽象数据类型复数的定义:,数据对象:De1,e2e1,e2RealSet 数据关系:R1 | e1是复数的实数部分, e2 是复数的虚数部分 基本操作:AssignComplex( &Z, v1, v2 )操作结果:构造复数 Z,其实部和虚部分别被赋以参数 v1 和 v2 的值。Destroy
17、Complex( &Z)操作结果:复数Z被销毁。GetReal( Z, &realPart )初始条件:复数已存在。操作结果:用realPart返回复数Z的实部值。,ADT Complex , ADT Complex,抽象数据类型的表示和实现,抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。,例如,对以上定义的复数。,typedef struct float realpart;float imagpart; complex;,/ -存储结构的定义,1.3 数据结构的基本概念,1.3 数据结构的基本概念(小结),数据的操作:插入、删除、修改、检索、排序等,一、算法的相关
18、概念二、算法分析,1.4 算法及算法分析,一、算法的相关概念,1.算法(Algorithm):是对特定问题求解步骤的一种描述,是指令的有限序列。,2. 算法的五大特性: 输入:一个算法有零个或多个输入。 输出:一个算法有一个或多个输出。 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。,1.4 算法及算法分析,3.算法设计的原则 (1)正确性 (2)可读性 (3)健壮性 (4)高效率与低存储量需求 4.算法的描述方法 (1
19、)自然语言 (2)流程图 (3)程序设计语言 (4)伪代码,1.4 算法及算法分析,欧几里德算法,m,n,r,例:欧几里德算法辗转相除法求两个自然数 m 和 n 的最大公约数,1.4 算法及算法分析,算法的描述方法自然语言,优点:容易理解 缺点:冗长、二义性 使用方法:粗线条描述算法思想 注意事项:避免写成自然段,1.4 算法及算法分析, 输入m 和n; 求m除以n的余数r; 若r等于0,则n为最大公约数,算法结束;否则执行第步; 将n的值放在m中,将r的值放在n中; 重新执行第步。,例:欧几里德算法,自然语言,1.4 算法及算法分析,优点:流程直观 缺点:缺少严密性、灵活性 使用方法:描述简
20、单算法 注意事项:注意抽象层次,算法的描述方法流程图,1.4 算法及算法分析,流 程 图,例:欧几里德算法,1.4 算法及算法分析,优点:能由计算机执行 缺点:抽象性差,对语言要求高 使用方法:算法需要验证 注意事项:将算法写成子函数,算法的描述方法程序设计语言,1.4 算法及算法分析,#include int CommonFactor(int m, int n) int r=m % n;while (r!=0) m=n;n=r;r=m % n;return n; void main( ) coutCommonFactor(63, 54)endl; ,程序设计语言,例:欧几里德算法,1.4 算
21、法及算法分析,伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。 优点:表达能力强,抽象性强,容易理解 使用方法:描述比较复杂算法,算法的描述方法伪代码,1.4 算法及算法分析,1. r = m % n;2. 循环直到 r 等于02.1 m = n;2.2 n = r;2.3 r = m % n;3. 输出 n ;,伪 代 码,上述伪代码再具体一些,用C的函数来描述。请同学们自行完成!,例:欧几里德算法,1.4 算法及算法分析,二、算法分析,度量算法效率的方法:事后统计:将算法实现,测算其时间和空间开销。 缺
22、点: 编写程序实现算法将花费较多的时间和精力; 所得实验结果依赖于计算机的软硬件等环境因素。事前分析:对算法所消耗资源的一种估算方法。,1.4 算法及算法分析,二、算法分析,算法分析(Algorithm Analysis):对算法所需要的计算机资源时间和空间进行估算。时间复杂性(Time Complexity)空间复杂性(Space Complexity),1.4 算法及算法分析,算法的时间复杂度分析,1.4 算法及算法分析,二、算法分析,算法的执行时间每条语句执行时间之和,for (i=1; i=n; i+)for (j=1; j=n; j+)x+;,问题规模:输入量的多少。 基本语句:是执
23、行次数与整个算法的执行次数成正比的操作指令。,for (i=1; i=n; i+)for (j=1; j=n; j+)x+;,问题规模:n 基本语句:x+,1.4 算法及算法分析,二、算法分析,定义 若存在两个正的常数c和n0,对于任意nn0,都有T(n)cf(n),则称T(n)=O(f(n),当问题规模充分大时在渐近意义下的阶,1.4 算法及算法分析,二、算法分析大O符号,定理:若A(n)=amnm+am-1nm-1+a1n+a0是一个m次多项式,则A(n)=O(nm)。,说明:在计算算法时间复杂度时,可以忽略所有低次幂和最高次幂的系数。,1.4 算法及算法分析,二、算法分析大O符号,例1-
24、5 +x; O(1) 例1-6 for (i=1; i=n; +i) O(n)+x; 例1-7 for (i=1; i=n; +i) O(n2)for (j=1; j=n; +j)+x; 例1-8 for (i=1; i=n; +i) O(n2)for (j=1; j=i-1; +j) +x;,1.4 算法及算法分析,二、算法分析,例1-9 for (i=1; i=n; +i) O(n3)for (j=1; j=n; +j)cij=0;for (k=1; k=n; +k)cij+=aik*bkj; 例1-10 for (i=1; i=n; i=2*i) O(log2n) +x;,(1)(log
25、2n)(n)(nlog2n)(n2)(n3)(2n)(n!),1.4 算法及算法分析,二、算法分析,最好情况、最坏情况、平均情况,例:在一维整型数组An中顺序查找与给定值k相等的元素(假设该数组中有且仅有一个元素值为k)。有可能要找的元素是第1个元素有可能要找的元素是第n个元素,1.4 算法及算法分析,基本语句的执行次数是否只和问题规模有关?,最好情况:出现概率较大时分析 最差情况:实时系统 平均情况:已知输入数据是如何分布的,通常假设等概率分布,结论:如果问题规模相同,时间代价与输入数据有关,则需要分析最好情况、最坏情况、平均情况。,1.4 算法及算法分析,最好情况、最坏情况、平均情况,本章小结知识结构图,作业:,公元5世纪末,我国古代数学家张丘建在它所撰写的算经中,提出这样一个问题:“鸡翁一,值钱五;鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?”意思是说公鸡每只5元,母鸡每只3元,小鸡3只1元,用100元钱买100只鸡,求公鸡、母鸡、小鸡的只数。试设计算法求解该问题,并分析你所设计的算法的时间复杂度。(要求:算法分别用伪代码和C描述),