您好,欢迎访问三七文档
1.1数据结构讨论的范畴1.2基本概念1.3算法和算法的量度1.1数据结构讨论的范畴NiklausWirth:Algorithm+DataStructures=Programs程序设计:算法:数据结构:为计算机处理问题编制一组指令集处理问题的策略问题的数学模型结构静力分析计算例如:数值计算的程序设计问题─━线性代数方程组─━环流模式方程(球面坐标系)全球天气预报非数值计算的程序设计问题例一:求一组(n个)整数中的最大值算法:?模型:?基本操作是“比较两个数的大小”取决于整数值的范围例二:计算机对弈算法:?模型:?对弈的规则和策略棋盘及棋盘的格局例三:足协的数据库管理算法:?模型:?需要管理的项目?如何管理?用户界面?各种表格概括地说:数据结构是一门讨论“描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中如何表示和实现”的学科。1.2基本概念一、数据与数据结构二、数据类型三、抽象数据类型一、数据与数据结构所有能被输入到计算机中,且能被计算机处理的符号的集合。数据:是计算机操作的对象的总称。是计算机处理的信息的某种特定的符号表示形式。是数据(集合)中的一个“个体”数据元素:是数据结构中讨论的基本单位数据项:是数据结构中讨论的最小单位数据元素可以是数据项的集合例如:描述一个运动员的数据元素可以是年月日姓名俱乐部名称出生日期参加日期职务业绩称之为组合项数据结构:带结构的数据元素的集合假设用三个4位的十进制数表示一个含12位数的十进制数。3214,6587,9345─a1(3214),a2(6587),a3(9345)则在数据元素a1、a2和a3之间存在着“次序”关系a1,a2、a2,a33214,6587,9345a1a2a36587,3214,9345a2a1a3≠例如:又例,在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数据结构:带结构的数据元素的集合再例,在一维数组{a1,a2,a3,a4,a5,a6}的数据元素之间存在如下的次序关系:{ai,ai+1|i=1,2,3,4,5}或者说,数据结构是相互之间存在着某种逻辑关系的数据元素的集合。数据结构:带结构的数据元素的集合可见,不同的“关系”构成不同的“结构”数据的逻辑结构可归结为以下四类:线性结构树形结构图状结构集合结构数据结构的形式定义为:数据结构是一个二元组Data_Structures=(D,S)其中:D是数据元素的有限集,S是D上关系的有限集。数据的存储结构——逻辑结构在存储器中的映象“数据元素”的映象?“关系”的映象?数据元素的映象方法:用二进制位(bit)的位串表示数据元素(321)10=(501)8=(101000001)2A=(101)8=(001000001)2关系的映象方法:(表示x,y的方法)顺序映象以相对的存储位置表示后继关系例如:令y的存储位置和x的存储位置之间差一个常量C而C是一个隐含值,整个存储结构中只含数据元素本身的信息xy链式映象以附加信息(指针)表示后继关系需要用一个和x在一起的附加信息指示y的存储位置yx在不同的编程环境中,存储结构可有不同的描述方法。当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。例如:以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型。typedefintLong_int[3]定义长整数为:二、数据类型在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。例如,C语言中提供的基本数据类型有:整型int浮点型float字符型char逻辑型bool(C++语言)双精度型double实型(C++语言)数据类型是一个值的集合和定义在此集合上的一组操作的总称。不同类型的变量,其所能取的值的范围不同,所能进行的操作不同。三、抽象数据类型(AbstractDataType简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。例如,抽象数据类型复数的定义:数据对象:D={e1,e2|e1,e2∈RealSet}数据关系:R1={e1,e2|e1是复数的实数部分|e2是复数的虚数部分}ADTComplex{基本操作:AssignComplex(&Z,v1,v2)操作结果:构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。DestroyComplex(&Z)操作结果:复数Z被销毁。GetReal(Z,&realPart)初始条件:复数已存在。操作结果:用realPart返回复数Z的实部值。GetImag(Z,&ImagPart)初始条件:复数已存在。操作结果:用ImagPart返回复数Z的虚部值。Add(z1,z2,&sum)初始条件:z1,z2是复数。操作结果:用sum返回两个复数z1,z2的和值。}ADTComplex假设:z1和z2是上述定义的复数则Add(z1,z2,z3)操作的结果z3=z1+z2即为用户要求的结果ADT有两个重要特征:数据抽象用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。数据封装将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。抽象数据类型的描述方法抽象数据类型可用(D,S,P)三元组表示。其中:D是数据对象;S是D上的关系集;P是对D的基本操作集。ADT抽象数据类型名{数据对象:〈数据对象的定义〉数据关系:〈数据关系的定义〉基本操作:〈基本操作的定义〉}ADT抽象数据类型名其中基本操作的定义格式为:基本操作名(参数表)初始条件:〈初始条件描述〉操作结果:〈操作结果描述〉赋值参数只为操作提供输入值。引用参数以&打头,除可提供输入值外,还将返回操作结果。初始条件描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。操作结果说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。抽象数据类型的表示和实现抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。例如,对以上定义的复数。typedefstruct{floatrealpart;floatimagpart;}complex;//-----存储结构的定义//-----基本操作的函数原型说明voidAssign(complex&Z,floatrealval,floatimagval);//构造复数Z,其实部和虚部分别被赋以参数//realval和imagval的值floatGetReal(cpmplexZ);//返回复数Z的实部值floatGetimag(cpmplexZ);//返回复数Z的虚部值voidadd(complexz1,complexz2,complex&sum);//以sum返回两个复数z1,z2的和//-----基本操作的实现voidadd(complexz1,complexz2,complex&sum){//以sum返回两个复数z1,z2的和sum.realpart=z1.realpart+z2.realpart;sum.imagpart=z1.imagpart+z2.imagpart;}{其它省略}1.3算法和算法的衡量一、算法二、算法设计的原则三、算法效率的衡量方法和准则四、算法的存储空间需求算法是为了解决某类问题而规定的一个有限长的操作序列。一个算法必须满足以下五个重要特性:1.有穷性2.确定性3.可行性4.有输入5.有输出一、算法1.有穷性对于任意一组合法输入值,在执行有穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成。2.确定性对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。3.可行性算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。4.有输入作为算法加工对象的量值,通常体现为算法中的一组变量。有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。5.有输出它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。二、算法设计的原则设计算法时,通常应考虑达到以下目标:1.正确性2.可读性3.健壮性4.高效率与低存储量需求1.正确性首先,算法应当满足以特定的“规格说明”方式给出的需求。其次,对算法是否“正确”的理解可以有以下四个层次:a.程序中不含语法错误;b.程序对于几组输入数据能够得出满足要求的结果;c.程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;通常以第c层意义的正确性作为衡量一个算法是否合格的标准。d.程序对于一切合法的输入数据都能得出满足要求的结果;2.可读性算法主要是为了人的阅读与交流,其次才是为计算机执行,因此算法应该易于人的理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试。3.健壮性当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。4.高效率与低存储量需求通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间,两者都与问题的规模有关。三、算法效率的衡量方法和准则通常有两种衡量算法效率的方法:事后统计法事前分析估算法缺点:1.必须执行程序2.其它因素掩盖算法本质和算法执行时间相关的因素:1.算法选用的策略2.问题的规模3.编写程序的语言4.编译程序产生的机器代码的质量5.计算机执行指令的速度一个特定算法的“运行工作量”的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作:T(n)=O(f(n))称T(n)为算法的(渐近)时间复杂度。如何估算算法的时间复杂度?算法=控制结构+原操作(固有数据类型的操作)算法的执行时间=原操作(i)的执行次数×原操作(i)的执行时间∑算法的执行时间与原操作执行次数之和成正比从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作在算法中重复执行的次数作为算法运行时间的衡量准则。例一两个矩阵相乘voidmult(inta[],intb[],int&c[]){//以二维数组存储矩阵元素,c为a和b的乘积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]+=a[i,k]*b[k,j];}//for}//mult基本操作:乘法操作时间复杂度:O(n3)例二选择排序voidselect_sort(int&a[],intn){//将a中整数序列重新排列成自小至大有序的整数序列。}//select_sort基本操作:比较(数据元素)操作时间复杂度:O(n2)j=i;//选择第i个最小元素for(k=i+1;kn;++k)if(a[k]a[j])j=k;for(i=0;in-1;++i){if(j!=i)a[j]←→a[i]}例三起泡排序voidbubble_sort(int&a[],intn){//将a中整数序列重新排列成自小至大有序的整数序列。for(i=n-1,change=TRUE;i1&&change;--i)}//bubble_sort基本操作:赋值操作时间复杂度:O(n2){change=FALSE;//change为元素进行交换标志for(j=0;ji;++j)if(a[j]a[
本文标题:数据结构课件001
链接地址:https://www.777doc.com/doc-1723867 .html