数据结构耿国华第1章.ppt
第1章 绪论,1.1 什么是数据结构(定义)1.2 数据结构的内容1.3 算法1.4 算法描述的工具1.5 对算法作性能评价1.6 关于学习数据结构,1.1 什么是数据结构(定义),1.数据(Data)数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。换句话说,数据是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述。简而言之,数据就是计算机化的信息。,例如对C 源程序,数据概念不仅是源程序所处理的数据,相对于编译程序来说,C编译程序相对于源程序是一个处理程序,它加工的数据是字符流的源程序(.c),输出的结果是目标程序(.obj);对于链接程序来说,它加工的数据是目标程序(.obj),输出的结果是可执行程序(.exe),如图 1.1 所示。,图1.1 编译程序示意图,2.数据元素(Data Element)数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。,表1-1 学 籍 表,数据项,记录,3.数据对象(Data Object)数据对象是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N=0,1,2,字母字符数据对象是集合C=A,B,Z,表1-1所示的学籍表也可看作一个数据对象。由此可看出,不论数据元素集合是无限集(如整数集)、有限集(如字符集),还是由多个数据项组成的复合数据元素(如学籍表),只要性质相同,都是同一个数据对象。,综上13所述,再分析数据概念:,4.数据结构(Data Structure)数据结构是指相互之间存在一种或多种特定关系的数据元素集合,,图1.2 学校组织层次结构图,图1.3 交通流量图,5.数据类型(Data Type)数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。数据类型中定义了两个集合,即该类型的取值范围,以及该类型中可允许使用的一组运算。例如高级语言中的数据类型就是已经实现的数据结构的实例。从这个意义上讲,数据类型是高级语言中允许的变量种类,是程序语言中已经实现的数据结构(即程序中允许出现的数据形式)。在高级语言中,整型类型可能的取值范围是-32 768+32 767,可用的运算符集合为加、减、乘、除、乘方、取模(如C语言中+,-,*,/,%)。,6.数据抽象与抽象数据类型,)数据的抽象 计算机中使用的是二进制数,汇编语言中则可给出各种数据的十进制表示,如98.65、9.6E3等,它们是二进制数据的抽象;使用者在编程时可以直接使用,不必考虑实现细节。在高级语言中,则给出更高一级的数据抽象,出现了数据类型,如整型、实型、字符型等。到抽象数据类型出现,可以进一步定义更高级的数据抽象,如各种表、队、栈、树、图、窗口、管理器等,这种数据抽象的层次为设计者提供了更有利的手段,使得设计者可以从抽象的概念出发,从整体考虑,然后自顶向下、逐步展开,最后得到所需结果。可以这样看,高级语言中提供整型、实型、字符、记录、文件、指针等多种数据类型,可以利用这些类型构造出像栈、队列、树、图等复杂的抽象数据类型。,)抽象数据类型(Abstract Data Type)抽象数据类型(简称ADT)是指基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作。抽象数据类型的定义取决于客观存在的一组逻辑特性,而与其在计算机内如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。从某种意义上讲,抽象数据类型和数据类型实质上是一个概念。整数类型就是一个简单的抽象数据类型实例。“抽象”的意义在于教学特性的抽象。一个ADT定义了一个数据对象,数据对象中各元素间的结构关系,以及一组处理数据的操作。ADT 通常是指由用户定义且用以表示应用问题的数据模型,通常由基本的数据类型组成,并包括一组相关服务操作。,抽象数据类型是近年来计算机科学中提出的最重要的概念之一,它集中体现了程序设计中一些最基本的原则:分解、抽象和信息隐藏。一个抽象数据类型确定了一个模型,但将模型的实现细节隐藏起来;它定义了一组运算,但将运算的实现过程隐藏起来。,图1.4 用抽象数据类型指导问题求解,数学模型抽象数据类型数据结构,恰好反应了信息结构转换的三个重要阶段,而在这个转换过程中,数据结构是基础,抽象数据类型是中枢。一个线性表的抽象数据类型的描述如下:ADT Linear-list 数据元素 所有ai属于同一数据对象,i=1,2,n,n0;逻辑结构 所有数据元素ai(i=1,2,n-1)存在次序关系,ai无前趋,an无后继;,操作设L为Linear-list:Initial(L):初始化空线性表;Length(L):求线性表的表长;Get(L,i):取线性表的第i个元素;Insert(L,i,b):在线性表的第i个位置插入元素b;Delete(L,i):删除线性表的第i个元素。,)抽象数据类型实现,第一种情况:传统的面向过程的程序设计。第二种情况:“包”、“模型”的设计方法。第三种情况:面向对象的程序设计(Object Oriented Programming,简称OOP)。,)ADT的表示与实现 ADT的定义 ADT的定义格式不唯一,我们采用下述格式定义一个ADT:ADT 数据对象:结构关系:基本操作:ADT,其中数据对象和结构关系的定义采用数学符号和自然语言描述,而基本操作的定义格式为:(参数表)操作前提:操作结果:,关于参数传递 参数表中的参数有两种:第一种参数只为操作提供待处理数据,又称值参;第二种参数既能为操作提供待处理数据,又能返回操作结果,也称变量参数。操作前提描述了操作执行之前数据结构和参数应满足的条件,操作结果描述操作执行之后,数据结构的变化状况和应返回结果。ADT可用现有计算机语言中已有的数据类型,即固有数据类型来表示和实现。不同语言的表示和实现方法不尽相同,如ADT中“返回结果的参数”,PASCAL语言用“变参”实现,C+语言通过“引用型参数”实现,而C语言用“指针参数”实现。,用标准C语言表示和实现ADT描述时,主要包括以下两个方面:(1)通过结构体将int、float等固有类型组合到一起,构成一个结构类型,再用typedef为该类型或该类型指针重新起一个名字。(2)用C语言函数实现各操作。,)面向对象的概念 Coad 和Yourdon给出面向对象的概念:面向对象=对象+类+继承+通信 对象:是指在应用问题中出现的各种实体、事件和规格说明等,它是由一组属性和在这组值上的一组服务构成的,其中属性值确定了对象的状态。类:把具有相同属性和服务的对象归到同一类,而把一个类中的每一个对象称为该类的一个实例,它们具有相同的服务。继承:面向对象方法的最有特色的方面。,面向对象程序设计语言的特点是不仅具有封装性(encapsulation),还有继承性(inheritance)和多态性(polymorphism)。从以上的讨论中可以看出,与数据结构密切相关的是定义在数据结构上的一组操作。操作的种类和数目不同,即使逻辑结构相同,这个数据结构的用途也会大不相同。定义在数据结构上的操作的种类是没有限制的,可以根据具体需要而定义。,基本操作主要有以下几种:(1)插入:在数据结构中的指定位置上增添新的数据元素;(2)删除:删去数据结构中某个指定数据元素;(3)更新:改变数据结构中某个元素的值,在概念上等价于删除和插入操作的组合;(4)查找:在数据结构中寻找满足某个特定要求的数据元素(的位置和值);(5)排序:(在线性结构中)重新安排数据元素之间的逻辑顺序关系,使数据元素按值由小到大或由大到小的次序排列。,)结构化的开发方法与面向对象的开发方法的不同点结构化的开发方法是面向过程的开发方法,首先着眼于系统要实现的功能。从系统的输入和输出出发,分析系统要实现的功能,用自顶向下、逐步细化的方式建立系统的功能结构和相应的程序模块结构。一旦程序功能需要修改,就会涉及多个模块,修改量大,易于出错,并会引起程序的退化。,1.2 数据结构的内容,1.逻辑结构,图1.5 四类基本数据结构示意,(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系。(2)线性结构:结构中的数据元素之间存在着一对一的线性关系。(3)树形结构:结构中的数据元素之间存在着一对多的层次关系。(4)图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。,逻辑结构,线性结构线性表、栈、队、字符串、数组、广义表非线性结构树、图,2.存储结构 存储结构(又称物理结构)是逻辑结构在计算机中的存储映象,是逻辑结构在计算机中的实现,它包括数据元素的表示和关系的表示。形式化描述:D要存入机器中,建立一从D的数据元素到存储空间M单元的映象S,DM,即对于每一个d,dD,都有唯一的zM,使S(D)=Z,同时这个映象必须明显或隐含地体现关系R。,逻辑结构与存储结构的关系为:存储结构是逻辑关系的映象与元素本身的映象。逻辑结构是数据结构的抽象,存储结构是数据结构的实现,两者综合起来建立了数据元素之间的结构关系。,顺序映象(顺序存储结构)非顺序映象(非顺序存储结构),3.运算集合,表 1-2 工 资 表,数据结构的内容可归纳为三个部分:逻辑结构、存储结构和运算集合。按某种逻辑关系组织起来的一批数据,按一定的映象方式把它存放在计算机的存储器中,并在这些数据上定义了一个运算的集合,就叫做数据结构。,1.3 算 法,1.算法(Algorithm)的定义 Algorithm is a finite set of rules which gives a sequence of operation for solving a specific type of problem.(算法是规则的有限集合,是为解决特定问题而规定的一系列操作。),2.算法的特性(1)有限性:有限步骤之内正常结束,不能形成无穷循环。(2)确定性:算法中的每一个步骤必须有确定含义,无二义性。(3)输入:有多个或0个输入。(4)输出:至少有一个或多个输出。(5)可行性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成。在算法的五大特性中,最基本的是有限性、确定性和可行性。,3.算法设计的要求,)算法的正确性(1)所设计的程序没有语法错误;(2)所设计的程序对于几组输入数据能够得出满足要求的结果;(3)所设计的程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得到满足要求的结果。(4)程序对于一切合法的输入数据都能产生满足要求的结果。,例如:要求n个数的最大值问题,给出示意算法如下:max:=0;for(i=1;imax)max=x;,2)可读性 3)健壮性 4)高效率和低存储量,1.4 算法描述的工具,1.算法、语言和程序的关系(1)算法:描述了数据对象的元素之间的关系(包括数据逻辑关系、存储关系描述)。(2)描述算法的工具:算法可用自然语言、框图或高级程序设计语言进行描述。自然语言简单但易于产生二义,框图直观但不擅长表达数据的组织结构,而高级程序语言则较为准确但又比较严谨。(3)程序是算法在计算机中的实现(与所用计算机及所用语言有关)。,2.设计实现算法过程的步骤 找出与求解有关的数据元素之间的关系(建立结构关系)。确定在某一数据对象上所施加的运算。考虑数据元素的存储表示。选择描述算法的语言。设计实现求解的算法,并用程序语言加以描述。,3.类描述算法的语言选择,(1)预定义常量和类型。本书中用到以下常量符号,如True、False、MAXSIZE等,约定用如下宏定义预先定义:define TRUE 1 define FALSE 0 define MAXSIZE 100 define OK 1 define ERROR 0,(2)本书中所有的算法都以如下的函数形式加以表示,其中的结构类型使用前面已有的定义。数据类型 函数名(形式参数及说明)内部数据说明;执行语句组;/*函数名*/函数的定义主要由函数名和函数体组成,函数体用花括号“”和“”括起来。函数中用方括号括起来的部分如“形式参数”为可选项,函数名之后的圆括号不可省略。,(3)赋值语句。简单赋值;(1)变量名=表达式,它表示将表达式的值赋给左边的变量;(2)变量+,它表示变量加1后赋值给变量;(3)变量-,它表示变量减1后赋值给变量。串联赋值#;变量1=变量2=变量3=变量k=表达式;成组赋值#;(变量1,变量2,变量3,,变量k)=(表达式1,表达式2,表达式3,,表达式k);,数组名1下标1下标2=数组名2下标1下标2;条件赋值;变量名=条件表达式?表达式1:表达式2;(4)条件选择语句。if(表达式)语句;if(表达式)语句1;else 语句2;,switch()case 判断值1:语句组 1;break;case 判断值2:语句组 2;break;.case 判断值n:语句组n;break;default:语句组;break;,(5)循环语句。for 语句 for(;)循环体语句;首先计算表达式1的值,然后求表达式2的值,若结果非零(即为真)则执行循环体语句,最后对表达式3运算,如此循环,直到表达式2的值为零(即不成立为假)时为止。,while 语句 while()循环体语句;while循环首先计算条件表达式的值,若条件表达式的值非零(即条件成立),则执行循环体语句,然后再次计算条件表达式的值,重复执行,直到条件表达式的值为零(即为假)时退出循环,执行该循环之后的语句。,do-while 语句 do 循环体语句 while()该循环语句首先执行循环体语句,然后计算条件表达式的值,若条件表达式成立,则再次执行循环体,再计算条件表达式的值,直到条件表达式的值为零,即条件不成立时结束循环。,(6)输入、输出语句。输入语句:用函数scanf实现;特别当数据为单个字符时,用getchar函数实现;当数据为字符串时,用gets函数实现。输出语句:用printf函数实现;当要输出单个字符时,用putchar函数实现;当数据为字符串时,用puts函数实现。其中输入输出函数中的类型部分不做严格要求,淡化表述。,(7)其它一些语句。return 或return:用于函数结束。break语句:可用在循环语句或case语句中结束循环过程或跳出情况语句。continue语句:可用在循环语句中结束本次循环过程,进入下一次循环过程。exit语句:表示出现异常情况时,控制退出函数。,(8)注释形式。/*字符串*/注释句的作用是增强算法的可阅读性,在算法描述中要求在函数首部加上对算法功能的必要注释描述。加注释说明时如果没有涉及到的参量一定是多余的,而涉及到的内容应当作为参量,这实际上是程序设计中的一个素质要求,希望多加注意。,(9)一些基本的函数,例如:max函数:用于求一个或几个表达式中的最大值;min函数:用于求一个或几个表达式中的最小值;abs函数:用于求表达式的绝对值;eof函数:用于判定文件是否结束;eoln函数:用于判断文本行是否结束。,1.5 对算法作性能评价,1.性能评价 对问题规模和该算法在运行时所占的空间S与所耗费的时间T给出一个数量关系的评价。问题规模N对不同的问题其含义不同,对矩阵是阶数,对多项式运算是多项式项数,对图是顶点个数,对集合运算是集合中的元素个数。,2.有关数量关系的计算 数量关系评价体现在时间算法编程后在机器中所耗费的时间。数量关系评价体现在空间算法编程后在机器中所占的存储量。1)关于算法执行时间 一个算法的执行时间大致上等于其所有语句执行时间的总和,对于语句的执行时间是指该条语句的执行次数和执行一次所需时间的乘积。,2)语句频度语句频度是指该语句在一个算法中重复执行的次数。例1-1 两个nn阶矩阵相乘。,3)算法的时间复杂度 原操作是指从算法中选取一种对所研究问题是基本运算的操作,用随着问题规模增加的函数来表征,以此作为时间量度。而对于算法分析,我们关心的是算法中语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级(Order of Magnitude)。在这里,我们用“O”来表示数量级,这样我们可以给出算法的时间复杂度概念。所谓算法的时间复杂度,即是算法的时间量度,记作:T(n)=O(f(n),它表示随问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。一般情况下,随n的增大,T(n)的增长较慢的算法为最优的算法。例如:在下列三段程序段中,给出原操作x=x+1的时间复杂度分析。(1)x=x+1;其时间复杂度为O(1),我们称之为常量阶;(2)for(i=1;i=n;i+)x=x+1;其时间复杂度为O(n),我们称之为线性阶;(3)for(i=1;i=n;i+)for(j=1;j=n;j+)x=x+1;其时间复杂度为O(n2),我们称之为平方阶。此外算法还能呈现的时间复杂度有对数阶O(log2n),指数阶O(2n)等。,4)数据结构中常用的时间复杂度频率计数 数据结构中常用的时间复杂度频率计数有7个:O(1)常数型 O(n)线性型 O(n2)平方型 O(n3)立方型 O(2n)指数型 O(log2n)对数型 O(nlog2n)二维型 按时间复杂度由小到大递增排列成表1-3(当n充分大时)。不同数量级的时间复杂度的形状如图1.6所示,表1-3与图1.6是同一问题的不同表示形式。一般情况下,随n的增大,T(n)增长较慢的算法为最优的算法。从中我们应该选择使用多项式阶O(nk)的算法,而避免使用指数阶的算法。,表1-3 常用的时间复杂度频率表,图1.6 多种数量级的时间复杂度图示,例如:下列程序段:for(i=1;i n;i+)for(j=i;j=n;j+)x+;有一个二重循环,语句x+的执行频度为 n+(n-1)+(n-2)+3+2+1=n(n+1)/2而该语句执行次数关于n的增长率为n2,即时间复杂度为O(n2)。,5)最坏时间复杂度 算法中基本操作重复执行的次数还随问题的输入数据集的不同而不同。例如下面冒泡排序算法:,void bubble(int a,int length)将a中整数数组重新排序,达到递增有序 int i=0,j,temp;int change;do,change=false;for(j=1;jaj+1)temp=aj;aj=aj+1;aj+1=temp;change=true;i=i+1;while(ilength|change=true),6)算法的空间复杂度 关于算法的存储空间需求,类似于算法的时间复杂度,我们采用空间复杂度作为算法所需存储空间的量度,记作:S(n)=O(f(n),1.6 关于学习数据结构,1.数据结构课程的地位,图1.7 数据结构与其它课程的关系,2.“数据结构”课程的学习特点,“数据结构”课程的教学目标是要求学生学会分析数据对象特征,掌握数据组织方法和计算机的表示方法,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及相应算法,初步掌握算法时间空间分析的技巧,培养良好的程序设计技能。人类解决问题思维方式可分为两大类:一类是推理方式,凭借公理系统思维方法,从抽象公理体系出发,通过演绎、归纳、推理来求证结果,解决特定问题;另一类是算法方式,凭借算法构造思维方式,从具体操作规范入手,通过操作过程的构造和实施,解决特定问题。,3.关于本书内容编写的说明 本书基本结构 本书的基本结构分为三个部分:第一部分:数据结构的基本概念(第1章)。第二部分:基本的数据结构,包括:线性结构线性表、栈和队列、串、数组与广义表(第25章);非线性结构树、图(第6、7章)。第三部分:基本技术,包括:查找技术与排序技术(第8、9、10章)。,