1第1章绪论21.1数据结构讨论的范畴1.2与数据结构相关的概念1.3算法及其描述和分析31.1数据结构讨论的范畴NiklausWirth:Algorithm+DataStructures=Programs程序设计:算法:数据结构:为计算机处理问题编制一组指令集处理问题的策略问题的数学模型4例如:数值计算的程序设计问题已知:游泳池的长lengh和宽wide,求面积area。分析:问题涉及的对象:游泳池的长lengh宽wide,面积area;对象之间的关系:area=lenghwide;5程序:main(){intlen,wide,area;scanf(“%d%d%\n”,&len,&wide);area=len*wide;printf(“area=%d”,area);}可见,对于数值问题,对象之间的关系通常可以用方程或函数表达,我们只要能列出表达对象之间关系的方程或函数,找到求解方程或函数的方法,就可以编写程序了。6非数值计算的程序设计问题例一:求一组(n个)整数中的最大值算法:?模型:?基本操作是“比较两个数的大小”取决于整数值的范围7例二:计算机对弈算法:?模型:?对弈的规则和策略棋盘及棋盘的格局8例三:足协的数据库管理算法:?模型:?需要管理的项目?如何管理?用户界面?各种表格9概括地说:数据结构是一门讨论“描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中如何表示和实现”的学科。101.2与数据结构相关的概念一、基本概念和术语二、数据结构三、数据类型和抽象数据类型11一、基本概念和术语所有能被输入到计算机中,且能被计算机处理的符号的集合。数据:是计算机操作的对象的总称。是计算机处理的信息的某种特定的符号表示形式。12是数据(集合)中的一个“个体”数据元素:是数据结构中讨论的基本单位13数据项:是数据结构中讨论的最小单位数据元素可以是数据项的集合例如:描述一个运动员的数据元素可以是姓名俱乐部名称出生日期参加日期职务业绩称之为组合项年月日编号关键码14二、数据结构数据结构是带“结构”的数据元素的集合。15假设用三个4位的十进制数表示一个含12位数的十进制数。3214,6587,9345─a1(3214),a2(6587),a3(9345)则在数据元素a1、a2和a3之间存在着“次序”关系a1,a2、a2,a33214,6587,9345a1a2a36587,3214,9345a2a1a3≠例如:示例一:16在2行3列的二维数组{a1,a2,a3,a4,a5,a6}中六个元素之间存在两个关系:a1a2a3a4a5a6行的次序关系:列的次序关系:row={a1,a2,a2,a3,a4,a5,a5,a6}col={a1,a4,a2,a5,a3,a6}a1a3a5a2a4a6a1a2a3a4a5a6示例二:17在一维数组{a1,a2,a3,a4,a5,a6}的数据元素之间存在如下的次序关系:{ai,ai+1|i=1,2,3,4,5}或者说,数据结构是相互之间存在着某种逻辑关系的数据元素的集合。可见,不同的“关系”构成不同的“结构”示例三:18数据的逻辑结构可归结为以下四类:线性结构树形结构图状结构集合结构19数据结构的形式定义为:数据结构是一个二元组Data_Structures=(D,S)其中:D是数据元素的有限集,S是D上关系的有限集。20存储结构“数据元素”的映象“关系”的映象21数据元素的映象方法:用二进制位(bit)的位串表示数据元素(321)10=(101000001)2A=(65)10=(001000001)222关系的映象方法:(表示x,y的方法)数据在计算机中的存储:只有两种形式顺序:数据元素逐个连续存放(通过物理相邻来确定关系)非顺序:数据元素任意存放(通过存储地址确定关系)23在不同的编程环境中,存储结构可有不同的描述方法。当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。24例如:以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型。typedefintLong_int[3];定义长整数为:25在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。三、数据类型和抽象数据类型数据类型26例如,C语言中提供的基本数据类型有:整型int浮点型float字符型char逻辑型bool(C++语言)双精度型double实型(C++语言)27数据类型是一个值的集合和定义在此集合上的一组操作的总称。不同类型的变量,其所能取的值的范围不同,所能进行的操作不同。28抽象数据类型(AbstractDataType简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。29抽象数据类型的形式描述抽象数据类型可用(D,S,P)三元组表示其中:D是数据对象;S是D上的关系集;P是对D的基本操作集。30ADT抽象数据类型名{数据对象:〈数据对象的定义〉数据关系:〈数据关系的定义〉基本操作:〈基本操作的定义〉}ADT抽象数据类型名其中基本操作的定义格式为:基本操作名(参数表)初始条件:〈初始条件描述〉操作结果:〈操作结果描述〉31例如,抽象数据类型复数的定义:数据对象:D={e1,e2|e1,e2∈RealSet}数据关系:R1={e1,e2|e1是复数的实数部分|e2是复数的虚数部分}ADTComplex{32基本操作:AssignComplex(&Z,v1,v2)操作结果:构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。DestroyComplex(&Z)操作结果:复数Z被销毁。GetReal(Z,&realPart)初始条件:复数已存在。操作结果:用realPart返回复数Z的实部值。33GetImag(Z,&ImagPart)初始条件:复数已存在。操作结果:用ImagPart返回复数Z的虚部值。Add(z1,z2,&sum)初始条件:z1,z2是复数。操作结果:用sum返回两个复数z1,z2的和值。}ADTComplex……34假设:z1和z2是上述定义的复数则Add(z1,z2,z3)操作的结果z3=z1+z2即为用户需求的复数求和的结果35抽象数据类型的表示和实现抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。例如,对以上定义的复数。36typedefstruct{floatrealpart;floatimagpart;}complex;//-----存储结构的定义37//-----基本操作的实现voidadd(complexz1,complexz2,complex&sum){//以sum返回两个复数z1,z2的和sum.realpart=z1.realpart+z2.realpart;sum.imagpart=z1.imagpart+z2.imagpart;}{其它省略}381.3算法及其描述和分析一算法的概念算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一种或多种操作。例求10个正整数中的最大数max的算法。描述算法的方法有很多:流程图,自然语言,计算机语言,用计算机语言表达的算法就是程序。开始为10个元素a[0]到a[9]输入数值max=a[0]i=1i=10输出maxa[i]maxmax=a[i]i=i+1结果NYYN求n个元素中的最大值若采用自然语言描述,则如下列步骤所示:(1)给10个元素a[0]-a[9]输入数值;(2)把第一个元素a[0]赋给用于保存最大值元素的变量max;(3)把表示下标的变量i赋初值1;(4)如果i=10,则向下执行,否则输出最大值max后结束算法;(5)如果a[i]max,则将a[i]赋给max,否则不改变max的值,这使得max始终保存着当前比较过的所有元素的最大值;(6)使下标i增1,以指示下一个元素;(7)转向第(4)步继续执行.main(){inti,max,a[10];printf(“请输入10个整数:”);for(i=0;i=10;i++)scanf(“%d”,&a[i]);max=a[0];i=1;while(i10){if(a[i]max)max=a[i];i++;}printf(“10个整数中的最大值为:”,max);}C语言描述如下:二算法的基本特征1)输入:0个或多个输入;2)输出:1个或多个输出;3)有穷性:算法必须在有限步内结束;4)确定性:组成算法的操作必须清晰无二义性。5)有效性:组成算法的操作必须能够在计算机上实现。算法的描述—采用类C语言算法的评价—衡量算法优劣的标准正确性(correctness):可读性(readability):人的阅读与交流健壮性(robustness):当输入非法数据时,算法能够适当的做出反应或进行处理,不会产生莫名其妙的结果效率与低存储量:算法的执行时间和所需的最大存储空间45三算法效率的衡量方法和准则通常有两种衡量算法效率的方法:事后统计法事前分析估算法缺点:1.必须执行程序2.其它因素掩盖算法本质一般:算法中基本操作重复执行的次数是问题规模n的某个函数f(n)时间复杂度:随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度。简称时间复杂度。——即基本操作(原操作)重复执行的次数的阶数T(n)=o(f(n))例:n*n矩阵相乘D=d+1;for(i=1;i=n;i++)for(j=1;j=n;j++){c[i][j]=0;for(k=1;k=n;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];}33)(nOnTnnf例2:for(i=0;in;i++)for(j=0;jm;j++)A[i][j]=0;例:for(i=0;in;i++)for(j=0;jm;j++)A[i][j]=0;mnOnTmnnf**)(49算法的存储空间需求算法的空间复杂度定义为:表示随着问题规模n的增大,算法运行所需存储量的增长率与g(n)的增长率相同。S(n)=O(g(n))50算法的存储量包括:1.输入数据所占空间2.程序本身所占空间3.辅助变量所占空间51若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作。若所需存储量依赖于特定的输入,则通常按最坏情况考虑。52本章学习要点531.熟悉各名词、术语的含义,掌握基本概念。2.理解算法五个特征的确切含义。3.掌握通过计算“原操作”语句的次数来估算算法时间复杂度的方法。54习题解答实例作业题:求下面程序段的时间复杂度(1)temp=x;//语句1x=y;//语句2y=temp;//语句3(2)sum=0;//语句1for(i=0;in;i++)//语句2for(j=0;jn;j++)//语句3sum=sum+i*j;//语句4(3)i=0;//语句1while(in)&&(a[i]!=K)//语句2i++;//语句3return(i);//语句4作业题:求下面程序段的时间复杂度(1)temp=x;//语句1x=y;//语句2y=temp;//语句3(2)sum=0;//语句1for(i=0;in;i++)//语句2for(j=0;jn;j++)//语句3sum=sum+i*j;//语句4(3)i=0;//语句1while(in)&&(a[i]!=K)//语句2i++;//语句3return(i);//语句4T(n)=3O(1)1n+1n*(n+1)n2T(n)=2n2+2n+2O(n2)平均时间复杂度O(n)57算法设计题1-7对于一维数组A[0..n-1](n1),设计在时间和空间方面尽可量有效率的算法,将A中的序列循环左移p(0pn)个位置,即将A中的数据从(A0,A1,......,An-1)转变成(Ap